{
  "generated": "2026-09-10",
  "product": "Connect by JBRH",
  "operator": "JBRH Digital Solutions",
  "version": "6.3.2",
  "site": "https://connectbyjbrh.com",
  "count": 1000,
  "statuses": {
    "available": "Available — running in production and reachable by both audiences.",
    "available_owner": "Available — running in production, deliberately for the platform operator only (running the business, not using Connect).",
    "foundation": "Foundation — the data model, service and tests exist; the customer-facing capability is deliberately narrower than the code.",
    "not_yet": "Not yet — designed and written down, not implemented. Nothing on this page describes behaviour you can use today.",
    "reference": "Reference — background on a standard or technology. Connect's own use of it, if any, is stated separately on the page."
  },
  "pages": [
    {
      "id": "D0001",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/",
      "markdown": "https://connectbyjbrh.com/developers/index.md",
      "title": "Developers and AI agents",
      "description": "Every machine interface Connect publishes — MCP, A2A, a read-only HTTP API and the generated descriptions — with what each is for and how to choose.",
      "summary": "Connect publishes four machine interfaces: an MCP server at `/mcp`, an A2A agent at `/a2a` with a card under `/.well-known/`, a read-only HTTP API under `/api/public/`, and generated OpenAPI, Arazzo and AsyncAPI descriptions. All four read the same published documentation corpus. None of them reaches a workspace, and none of them writes.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/agent-card/",
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/developers/openapi-description/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/docs/protocols/",
        "https://connectbyjbrh.com/research/writing-for-people-and-machines/"
      ]
    },
    {
      "id": "D0011",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/a2a-integration/",
      "markdown": "https://connectbyjbrh.com/developers/a2a-integration/index.md",
      "title": "Interoperating over A2A",
      "description": "Calling Connect as an A2A agent: the endpoint, the one method it answers, how a skill is chosen, and the operations it refuses.",
      "summary": "Send a JSON-RPC `message/send` to `https://connectbyjbrh.com/a2a` with a text part. Connect answers as an agent message, not a task, using one of five documentation skills — named by `skillId`, or chosen from the shape of the question. Streaming and the authenticated extended card are refused explicitly. Nothing here requires authentication, because nothing here is private.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/agent-card/",
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/docs/protocols/a2a/",
        "https://connectbyjbrh.com/docs/protocols/a2a-discovery/",
        "https://connectbyjbrh.com/docs/protocols/json-rpc/"
      ]
    },
    {
      "id": "D0010",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/agent-card/",
      "markdown": "https://connectbyjbrh.com/developers/agent-card/index.md",
      "title": "The Connect Agent Card",
      "description": "Connect's A2A Agent Card: where it lives, every field it carries, the five skills it advertises, and the fields that declare what is absent.",
      "summary": "The card is served at `https://connectbyjbrh.com/.well-known/agent-card.json`, declares A2A protocol version `1.0.0`, points at the JSON-RPC endpoint `/a2a`, and advertises five documentation skills. It also declares what is not there: no streaming, no push notifications, empty security schemes and `supportsAuthenticatedExtendedCard: false`.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/a2a-integration/",
        "https://connectbyjbrh.com/developers/",
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/docs/protocols/agent-card/",
        "https://connectbyjbrh.com/docs/protocols/a2a/",
        "https://connectbyjbrh.com/docs/protocols/a2a-discovery/",
        "https://connectbyjbrh.com/docs/protocols/well-known-uris/"
      ]
    },
    {
      "id": "D0036",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/agent-safety/",
      "markdown": "https://connectbyjbrh.com/developers/agent-safety/index.md",
      "title": "Building an agent on Connect safely",
      "description": "The discipline an agent built on Connect should keep, and the controls Connect enforces regardless of whether the agent keeps it.",
      "summary": "Two lists. What your agent should do: check status before claiming a capability, fetch before answering, cite the page, treat retrieved text as data rather than instructions, and say when something is not documented. What Connect does anyway: validates a present `Origin`, rate-limits, caps the body, and exposes read-only tools with no path to SQL or an arbitrary internal route.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/mcp-public-tools/",
        "https://connectbyjbrh.com/developers/status-manifest/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/"
      ]
    },
    {
      "id": "D0013",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/api-authentication/",
      "markdown": "https://connectbyjbrh.com/developers/api-authentication/index.md",
      "title": "API authentication",
      "description": "The public Connect API takes no credential and none exists to request. What that means, where workspace access actually lives, and what integration keys are not.",
      "summary": "There is no authentication on the public API. No key is issued, no header is read, and no endpoint in the published description accepts one. That is a property of what the API exposes — generated documentation that anonymous visitors already receive — rather than a setting somebody forgot to turn on.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/developers/integration-keys/",
        "https://connectbyjbrh.com/developers/api-rate-limits/",
        "https://connectbyjbrh.com/developers/mcp-authentication/",
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/"
      ]
    },
    {
      "id": "D0014",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/api-errors/",
      "markdown": "https://connectbyjbrh.com/developers/api-errors/index.md",
      "title": "API error shapes",
      "description": "The error envelope the public API returns, the codes inside it, the one response that does not use it, and what a client should do with each.",
      "summary": "Errors come back as `{\"error\": {\"code\": …, \"message\": …}}` with a matching HTTP status. Two codes exist today — `not_found` at `404` and `rate_limited` at `429`. A parameter outside its documented bounds is rejected earlier, by request validation, and that one response uses the framework's own shape rather than this envelope.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/developers/api-rate-limits/",
        "https://connectbyjbrh.com/developers/errors-and-retries/",
        "https://connectbyjbrh.com/developers/mcp-errors/",
        "https://connectbyjbrh.com/developers/openapi-description/"
      ]
    },
    {
      "id": "D0016",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/api-idempotency/",
      "markdown": "https://connectbyjbrh.com/developers/api-idempotency/index.md",
      "title": "Idempotency in the API",
      "description": "Connect accepts no idempotency key, and does not need one: every published operation is a read. What that means for retries, and where the guarantee stops.",
      "summary": "There is no `Idempotency-Key` header on any Connect interface, and no key lifetime to plan around. Every published operation is a read, so repeating one has no effect beyond spending an allowance. The interesting question is not safety but sameness — whether a repeated call returns the same answer.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/developers/api-pagination/",
        "https://connectbyjbrh.com/developers/errors-and-retries/",
        "https://connectbyjbrh.com/developers/entity-ids/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/"
      ]
    },
    {
      "id": "D0017",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/api-pagination/",
      "markdown": "https://connectbyjbrh.com/developers/api-pagination/index.md",
      "title": "Pagination",
      "description": "Connect's API has no cursor and no page token. What `limit` really does, how results are ordered, and the two correct ways to read the whole corpus.",
      "summary": "There is no pagination. No cursor, no offset, no page token and no next link exists on any endpoint — a request returns one bounded set and that is all of it. Search caps at 25 results whatever you ask for; listing caps at 1,000. To read everything, filter into slices or take the manifest.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/developers/api-idempotency/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/docs-search-api/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/",
        "https://connectbyjbrh.com/developers/entity-ids/"
      ]
    },
    {
      "id": "D0015",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/api-rate-limits/",
      "markdown": "https://connectbyjbrh.com/developers/api-rate-limits/index.md",
      "title": "API rate limits",
      "description": "The three request limits Connect enforces, the headers it does not send, and the client behaviour that keeps you under them.",
      "summary": "Three separate limits apply, one per surface: 240 requests a minute on the public API, 120 on the MCP endpoint and 60 on the A2A endpoint, each counted per calling address over a rolling sixty seconds. No rate-limit headers are sent — no `Retry-After`, no `X-RateLimit-*` — so a client must carry its own backoff.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/developers/api-errors/",
        "https://connectbyjbrh.com/developers/errors-and-retries/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/crawler-policy/"
      ]
    },
    {
      "id": "D0018",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/api-versioning/",
      "markdown": "https://connectbyjbrh.com/developers/api-versioning/index.md",
      "title": "API versioning",
      "description": "How Connect versions its published interfaces: the product version on the descriptions, protocol revisions negotiated per call, and what a client should not pin to.",
      "summary": "There is no version in any URL and no version header to send. The published descriptions carry the product version, each protocol carries its own revision, and compatibility is handled at the protocol layer — the MCP endpoint accepts four revisions and the earlier agent-card path still answers.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/openapi-description/",
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/agent-card/",
        "https://connectbyjbrh.com/developers/changelog-feed/",
        "https://connectbyjbrh.com/developers/entity-ids/",
        "https://connectbyjbrh.com/docs/protocols/openapi/"
      ]
    },
    {
      "id": "D0020",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/arazzo-workflows/",
      "markdown": "https://connectbyjbrh.com/developers/arazzo-workflows/index.md",
      "title": "The Arazzo workflows",
      "description": "Connect's Arazzo 1.1.0 document: three ordered sequences over the public API, what each produces, and how to run one by hand or with a runner.",
      "summary": "`https://connectbyjbrh.com/developers/workflows.arazzo.yaml` describes three multi-step outcomes over the public documentation API in Arazzo 1.1.0: answering a question with a citation, checking a capability before claiming it, and enumerating what Connect does not do. Only public workflows appear there.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/openapi-description/",
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/developers/",
        "https://connectbyjbrh.com/docs/protocols/arazzo/",
        "https://connectbyjbrh.com/docs/workflows/",
        "https://connectbyjbrh.com/developers/agent-safety/"
      ]
    },
    {
      "id": "D0021",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/asyncapi-events/",
      "markdown": "https://connectbyjbrh.com/developers/asyncapi-events/index.md",
      "title": "The AsyncAPI description",
      "description": "The AsyncAPI 3.1.0 document at /developers/asyncapi.yaml: one outbound channel, one signed envelope, six event types, and what it deliberately leaves out.",
      "summary": "`/developers/asyncapi.yaml` is an AsyncAPI 3.1.0 document describing exactly one thing: outbound events Connect delivers by HTTP POST to a URL a workspace has registered. One channel, one message envelope, six event types, an HMAC signature over the raw body. Everything else that moves over a webhook in this product is an inbound provider callback and is not described there.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/webhooks-outbound/",
        "https://connectbyjbrh.com/developers/webhook-signatures/",
        "https://connectbyjbrh.com/docs/protocols/asyncapi/",
        "https://connectbyjbrh.com/developers/openapi-description/",
        "https://connectbyjbrh.com/developers/webhooks-vs-polling/"
      ]
    },
    {
      "id": "D0029",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/bot-verification/",
      "markdown": "https://connectbyjbrh.com/developers/bot-verification/index.md",
      "title": "Verifying a bot is who it claims",
      "description": "A user agent string is a claim, not an identity. The two verification mechanisms, each vendor's own published address source, and what Connect does with them.",
      "summary": "Anything can send `User-Agent: Googlebot`. Identity comes from the address the request arrives from, checked against a list the vendor publishes on its own domain, or from forward-confirmed reverse DNS where the vendor supports it. Connect gates nothing on a claimed agent: the public surface is read-only and unauthenticated, so there is nothing to gate.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/crawler-policy/",
        "https://connectbyjbrh.com/docs/protocols/rfc-9309/",
        "https://connectbyjbrh.com/developers/agent-safety/",
        "https://connectbyjbrh.com/developers/api-rate-limits/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "D0037",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/changelog-feed/",
      "markdown": "https://connectbyjbrh.com/developers/changelog-feed/index.md",
      "title": "The changelog and its feed",
      "description": "The changelog page, its Atom feed at /changelog/feed.xml, the fields in an entry, and the two quirks a feed reader should know about.",
      "summary": "Changes are published at `/changelog/` as an ordinary page and syndicated as Atom at `/changelog/feed.xml`. An entry carries a date, a version, a title, a summary, a list of changes, and optionally what you need to do and what is still not possible. Atom was chosen over RSS for unambiguous dates and a content model that needs no encoding guess.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/status-manifest/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/api-versioning/",
        "https://connectbyjbrh.com/developers/markdown-mirrors/",
        "https://connectbyjbrh.com/developers/developer-support/"
      ]
    },
    {
      "id": "D0028",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/crawler-policy/",
      "markdown": "https://connectbyjbrh.com/developers/crawler-policy/index.md",
      "title": "Crawler policy",
      "description": "Which crawlers this site allows, which decision is left open and why, and the trade-off behind naming model-training crawlers without blocking them.",
      "summary": "Eight search and answer crawlers are allowed by name rather than by inheriting the wildcard. Five model-training crawlers are named with a commented-out `Disallow`, which leaves them under the wildcard — neither allowed explicitly nor blocked, because that decision belongs to the operator and has not been settled. `/api/` is disallowed for everyone.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/rfc-9309/",
        "https://connectbyjbrh.com/developers/bot-verification/",
        "https://connectbyjbrh.com/developers/llms-txt-here/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/research/measuring-ai-visibility/"
      ]
    },
    {
      "id": "D0032",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/data-model-public/",
      "markdown": "https://connectbyjbrh.com/developers/data-model-public/index.md",
      "title": "The public data model",
      "description": "The five object shapes a developer actually receives from Connect, field by field, and the product records that are deliberately not among them.",
      "summary": "Five shapes cross the public boundary: the page record, the corpus status object, the capability status manifest, the error envelope, and the event envelope from the published webhook contract. Everything else — people, companies, opportunities, follow-ups — is a product concept with documentation pages, not an object any public endpoint returns.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/entity-ids/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/docs-search-api/",
        "https://connectbyjbrh.com/developers/status-manifest/",
        "https://connectbyjbrh.com/developers/asyncapi-events/"
      ]
    },
    {
      "id": "D0039",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/developer-support/",
      "markdown": "https://connectbyjbrh.com/developers/developer-support/index.md",
      "title": "Getting help as a developer",
      "description": "What a developer report needs to be answerable on the first reply, what must be redacted from it, and which routes to the operator are actually published.",
      "summary": "Triage first: most developer problems on these surfaces are answers rather than faults. If it is genuinely a fault, a report is answerable when it carries the exact request, the verbatim error, the corpus build you saw, and whether it reproduces. The published contact is the operator, JBRH Digital Solutions, through the website's own enquiry route.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/errors-and-retries/",
        "https://connectbyjbrh.com/developers/status-manifest/",
        "https://connectbyjbrh.com/developers/entity-ids/",
        "https://connectbyjbrh.com/developers/integration-keys/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "D0027",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/docs-search-api/",
      "markdown": "https://connectbyjbrh.com/developers/docs-search-api/index.md",
      "title": "Searching the documentation programmatically",
      "description": "GET /api/public/docs/search: the parameters, the response record, the ranking model, and the four sibling routes on the same public prefix.",
      "summary": "`GET /api/public/docs/search?q=…` searches the public corpus and returns brief records — never page bodies. It needs no key and holds no session. Filters for `kind`, `status` and `channel` apply server-side, `limit` runs 1 to 25, and the same rate limit of 240 requests a minute per address covers every route under `/api/public/`.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/markdown-mirrors/",
        "https://connectbyjbrh.com/developers/arazzo-workflows/",
        "https://connectbyjbrh.com/developers/api-rate-limits/"
      ]
    },
    {
      "id": "D0033",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/entity-ids/",
      "markdown": "https://connectbyjbrh.com/developers/entity-ids/index.md",
      "title": "Stable identifiers",
      "description": "Page ids, prefixed object ids, delivery identifiers and canonical URLs: which are stable, which change on purpose, and which must never be parsed.",
      "summary": "A page id looks like `D0033` — one or two capitals then four digits — and is the stable handle for that page. Object identifiers elsewhere are a short prefix and an opaque remainder: `ev_`, `fu_`, `ws_`. Treat every one of them as a string to compare, never as a structure to read meaning out of. One identifier deliberately changes: the delivery attempt.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/data-model-public/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/time-and-timezones/",
        "https://connectbyjbrh.com/developers/webhooks-outbound/",
        "https://connectbyjbrh.com/developers/docs-search-api/"
      ]
    },
    {
      "id": "D0035",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/errors-and-retries/",
      "markdown": "https://connectbyjbrh.com/developers/errors-and-retries/index.md",
      "title": "Designing a resilient client",
      "description": "Every failure the public surfaces produce, sorted into transient and final, plus the backoff that suits a rate limit with no Retry-After header.",
      "summary": "Only two failures here are worth retrying: a 429 and a genuine transport fault. Everything else — 400, 403, 404, 405, 413, 422 and every JSON-RPC error code — is an answer, and repeating the request repeats the answer. A tool that fails is different again: it returns 200 with `isError` set, not an HTTP error.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/api-errors/",
        "https://connectbyjbrh.com/developers/mcp-errors/",
        "https://connectbyjbrh.com/developers/api-rate-limits/",
        "https://connectbyjbrh.com/developers/webhooks-outbound/",
        "https://connectbyjbrh.com/developers/developer-support/"
      ]
    },
    {
      "id": "D0030",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/integration-keys/",
      "markdown": "https://connectbyjbrh.com/developers/integration-keys/index.md",
      "title": "Integration keys",
      "description": "The cbj_ machine credential: how one is issued and scoped, why the plaintext appears once, how revocation works, and what it does not open.",
      "summary": "An integration key is a machine credential for a server-to-server caller. It begins `cbj_`, is bound to exactly one workspace and one explicit scope set, is stored only as a SHA-256 digest, and is shown in full exactly once — at issue. It opens no Owner surface, and it cannot widen its own scope. The public documentation surface accepts no key at all.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/api-authentication/",
        "https://connectbyjbrh.com/developers/agent-safety/",
        "https://connectbyjbrh.com/developers/webhook-signatures/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/account/"
      ]
    },
    {
      "id": "D0025",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/llms-txt-here/",
      "markdown": "https://connectbyjbrh.com/developers/llms-txt-here/index.md",
      "title": "llms.txt on this site",
      "description": "The two llms files this site publishes, what each contains, what is kept out of them, and why neither replaces robots.txt or a sitemap.",
      "summary": "Two files: `/llms.txt`, a short map grouped by section, and `/llms-full.txt`, every public page with its answer-first paragraph, canonical link, Markdown twin, status and verification date. Both are generated by `tools/docs_build.py` with the rest of the corpus. `llms.txt` is a community proposal, not a standard, and it is published as a supplement rather than a substitute.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/llms-txt/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/markdown-mirrors/",
        "https://connectbyjbrh.com/developers/crawler-policy/",
        "https://connectbyjbrh.com/research/writing-for-people-and-machines/"
      ]
    },
    {
      "id": "D0024",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/machine-manifests/",
      "markdown": "https://connectbyjbrh.com/developers/machine-manifests/index.md",
      "title": "The machine-readable documentation",
      "description": "Every generated JSON manifest on the site: docs-manifest.json, the docs-data files, what each field means and when they change.",
      "summary": "Two kinds of JSON are published. `/docs-manifest.json` is the whole corpus as one array of page records. `/docs-data/<name>.json` holds the smaller manifests — capability status among them. Both are static files, both are also reachable through `/api/public/docs/manifest/{name}`, and both change on a deploy rather than on a request.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/status-manifest/",
        "https://connectbyjbrh.com/developers/docs-search-api/",
        "https://connectbyjbrh.com/developers/markdown-mirrors/",
        "https://connectbyjbrh.com/developers/entity-ids/",
        "https://connectbyjbrh.com/developers/llms-txt-here/"
      ]
    },
    {
      "id": "D0026",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/markdown-mirrors/",
      "markdown": "https://connectbyjbrh.com/developers/markdown-mirrors/index.md",
      "title": "Markdown alternates",
      "description": "Every page has a Markdown twin at the same URL plus index.md: how to build the URL, what the body contains, and which one is canonical.",
      "summary": "Append `index.md` to any page URL and you get that page as Markdown: `/docs/email/held-drafts/` becomes `/docs/email/held-drafts/index.md`. The HTML stays canonical; the Markdown is an alternate representation generated from the same page registry in the same build, so the two cannot disagree. It carries no navigation, no menus and no scripts.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/docs-search-api/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/llms-txt-here/",
        "https://connectbyjbrh.com/developers/mcp-public-tools/",
        "https://connectbyjbrh.com/research/writing-for-people-and-machines/"
      ]
    },
    {
      "id": "D0005",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/mcp-authentication/",
      "markdown": "https://connectbyjbrh.com/developers/mcp-authentication/index.md",
      "title": "Authenticating to the MCP server",
      "description": "The Connect MCP server accepts no credential and issues none. What the Origin check does instead, and why there is nothing to revoke.",
      "summary": "There is no authentication on the Connect MCP server, because there is nothing private behind it. No token is read, no OAuth flow exists, no `WWW-Authenticate` challenge is ever sent, and no scope can be requested. What the server does check is the `Origin` header, and that is a browser-safety control rather than a credential.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/mcp-workspace-tools/",
        "https://connectbyjbrh.com/developers/mcp-errors/",
        "https://connectbyjbrh.com/developers/integration-keys/",
        "https://connectbyjbrh.com/docs/protocols/mcp-security/",
        "https://connectbyjbrh.com/docs/protocols/oauth-for-agents/"
      ]
    },
    {
      "id": "D0009",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/mcp-client-generic/",
      "markdown": "https://connectbyjbrh.com/developers/mcp-client-generic/index.md",
      "title": "Using Connect from any MCP client",
      "description": "The protocol-level steps for talking to the Connect MCP server from any client: the methods, the request shapes, and a call you can paste into curl.",
      "summary": "Every call is a single JSON-RPC 2.0 object posted to `https://connectbyjbrh.com/mcp`. Under revision 2026-07-28 no handshake is required: put the protocol version in `params._meta` and send `tools/list` or `tools/call` straight away. An older client may still send `initialize` first and will be answered.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/mcp-public-tools/",
        "https://connectbyjbrh.com/developers/mcp-errors/",
        "https://connectbyjbrh.com/developers/errors-and-retries/",
        "https://connectbyjbrh.com/docs/protocols/json-rpc/",
        "https://connectbyjbrh.com/docs/protocols/streamable-http/"
      ]
    },
    {
      "id": "D0006",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/mcp-errors/",
      "markdown": "https://connectbyjbrh.com/developers/mcp-errors/index.md",
      "title": "MCP error shapes",
      "description": "Every error the Connect MCP endpoint can return: the JSON-RPC code, the HTTP status beside it, what caused it, and what a client should do next.",
      "summary": "The server returns standard JSON-RPC error objects, plus one MCP-specific code, `-32020`, for a header that disagrees with the body. The HTTP status carries information too: a transport problem gets a real 4xx, while a problem inside a valid call — an unknown tool, say — comes back as `200` with an error object in it.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/mcp-public-tools/",
        "https://connectbyjbrh.com/developers/mcp-client-generic/",
        "https://connectbyjbrh.com/developers/errors-and-retries/",
        "https://connectbyjbrh.com/docs/protocols/json-rpc/"
      ]
    },
    {
      "id": "D0003",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/mcp-public-tools/",
      "markdown": "https://connectbyjbrh.com/developers/mcp-public-tools/index.md",
      "title": "Public MCP tools",
      "description": "The ten read-only MCP tools Connect publishes, their input schemas, what each returns, and the four resources and two prompts alongside them.",
      "summary": "Ten tools, all read-only, all reading the generated documentation corpus: `search_public_docs`, `fetch_public_doc`, `list_capabilities`, `get_capability`, `get_workflow`, `search_glossary`, `get_technology`, `get_protocol`, `get_product_status` and `get_changelog`. Each result carries both a text block and `structuredContent`, so a model reads prose and a program reads JSON.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/mcp-errors/",
        "https://connectbyjbrh.com/developers/mcp-workspace-tools/",
        "https://connectbyjbrh.com/developers/data-model-public/",
        "https://connectbyjbrh.com/docs/protocols/mcp-tools/",
        "https://connectbyjbrh.com/docs/protocols/mcp-resources/"
      ]
    },
    {
      "id": "D0008",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/mcp-quickstart-chatgpt/",
      "markdown": "https://connectbyjbrh.com/developers/mcp-quickstart-chatgpt/index.md",
      "title": "Adding Connect to ChatGPT",
      "description": "Using the Connect MCP server from ChatGPT: the endpoint, what it does and does not offer a connector, and the limits worth knowing first.",
      "summary": "Point a ChatGPT connector at `https://connectbyjbrh.com/mcp` with no authentication. Connect publishes a standard remote MCP server and nothing vendor-specific; whether your account and client can add a custom connector is decided by them, not by Connect, and this page will not guess at their current menus.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/mcp-quickstart-claude/",
        "https://connectbyjbrh.com/developers/mcp-client-generic/",
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/llms-txt-here/"
      ]
    },
    {
      "id": "D0007",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/mcp-quickstart-claude/",
      "markdown": "https://connectbyjbrh.com/developers/mcp-quickstart-claude/index.md",
      "title": "Adding Connect to Claude",
      "description": "Add Connect to Claude as a custom connector: the URL to paste, why no credential is asked for, and what the first connection should show.",
      "summary": "Add a custom connector pointing at `https://connectbyjbrh.com/mcp` with authentication set to none. There is no sign-in step and no consent screen, because the server exposes only public documentation. A successful connection shows ten read-only tools; if you see none, the connection did not complete.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/mcp-public-tools/",
        "https://connectbyjbrh.com/developers/mcp-client-generic/",
        "https://connectbyjbrh.com/developers/mcp-quickstart-chatgpt/",
        "https://connectbyjbrh.com/developers/mcp-errors/",
        "https://connectbyjbrh.com/docs/protocols/mcp/"
      ]
    },
    {
      "id": "D0002",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/mcp-server/",
      "markdown": "https://connectbyjbrh.com/developers/mcp-server/index.md",
      "title": "The Connect MCP server",
      "description": "The Connect MCP endpoint: its URL, the 2026-07-28 protocol revision, the Streamable HTTP transport, and exactly what is public.",
      "summary": "Connect runs a remote MCP server at `POST https://connectbyjbrh.com/mcp`. It implements protocol revision 2026-07-28 over Streamable HTTP, accepts POST only, mints no session, and needs no credential. It offers ten read-only documentation tools, four resources and two prompts. Nothing authenticated exists behind it.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/mcp-public-tools/",
        "https://connectbyjbrh.com/developers/mcp-errors/",
        "https://connectbyjbrh.com/developers/mcp-client-generic/",
        "https://connectbyjbrh.com/developers/mcp-authentication/",
        "https://connectbyjbrh.com/docs/protocols/mcp/",
        "https://connectbyjbrh.com/docs/protocols/streamable-http/"
      ]
    },
    {
      "id": "D0004",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/mcp-workspace-tools/",
      "markdown": "https://connectbyjbrh.com/developers/mcp-workspace-tools/index.md",
      "title": "Workspace MCP tools",
      "description": "There is no authenticated MCP tool in Connect. What that means, what is written down about the gates a workspace tool would pass, and what to use instead.",
      "summary": "Connect publishes no workspace MCP tools. The tool registry contains ten read-only documentation tools and nothing else, there is no authenticated tool, and no credential grants one. Nothing on this page describes something you can call today; it exists so that a client author stops looking, and so the boundary is written down rather than assumed.",
      "status": "not_yet",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/mcp-public-tools/",
        "https://connectbyjbrh.com/developers/mcp-authentication/",
        "https://connectbyjbrh.com/developers/agent-safety/",
        "https://connectbyjbrh.com/developers/integration-keys/",
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/closed-by-default-facade/"
      ]
    },
    {
      "id": "D0019",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/openapi-description/",
      "markdown": "https://connectbyjbrh.com/developers/openapi-description/index.md",
      "title": "The OpenAPI description",
      "description": "Where Connect's OpenAPI document lives, what it covers, the schemas it defines, and the allowlist that decides which routes can ever appear in it.",
      "summary": "The description is at `https://connectbyjbrh.com/developers/openapi.yaml`, written to OpenAPI 3.1.0 and generated by the documentation build. It describes six operations and nothing else. A route reaches it by being listed in the generator's allowlist, which is why opening an internal endpoint cannot publish it by accident.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/developers/arazzo-workflows/",
        "https://connectbyjbrh.com/developers/api-versioning/",
        "https://connectbyjbrh.com/developers/api-authentication/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/docs/protocols/openapi/"
      ]
    },
    {
      "id": "D0012",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/public-api/",
      "markdown": "https://connectbyjbrh.com/developers/public-api/index.md",
      "title": "The public API",
      "description": "Connect's public HTTP API: five read-only endpoints over the documentation corpus, their parameters, and the boundary that keeps workspace data out.",
      "summary": "Five GET endpoints under `https://connectbyjbrh.com/api/public/` search, fetch, list and describe the public documentation, plus one manifest reader. They need no credential, take no writes, and reach no workspace. `/api/health` is the only other path in the published description.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/openapi-description/",
        "https://connectbyjbrh.com/developers/api-errors/",
        "https://connectbyjbrh.com/developers/api-rate-limits/",
        "https://connectbyjbrh.com/developers/docs-search-api/",
        "https://connectbyjbrh.com/developers/data-model-public/",
        "https://connectbyjbrh.com/developers/",
        "https://connectbyjbrh.com/docs/protocols/openapi/"
      ]
    },
    {
      "id": "D0031",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/sandbox/",
      "markdown": "https://connectbyjbrh.com/developers/sandbox/index.md",
      "title": "Testing against Connect safely",
      "description": "There is no published sandbox environment. What you can exercise safely without one, what you cannot, and how to build the tests that matter locally.",
      "summary": "No sandbox environment is published: there is no test tenant, no simulated carrier and no separate host to point a client at. Most of what a sandbox usually protects against does not exist here either, because the public developer surface is read-only. What is left is worth doing locally, against fixtures of your own.",
      "status": "not_yet",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/webhook-signatures/",
        "https://connectbyjbrh.com/developers/agent-safety/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/developers/errors-and-retries/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "D0038",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/status-manifest/",
      "markdown": "https://connectbyjbrh.com/developers/status-manifest/index.md",
      "title": "The product status manifest",
      "description": "status.json: the five-word capability vocabulary, the per-capability status and evidence, and how to depend on it without hardcoding a list.",
      "summary": "`/docs-data/status.json` is the machine-readable answer to *can Connect do this*. It carries `statuses`, the five status words with their definitions, and `capabilities`, a map from capability name to `{status, evidence}`. It is the authority — ahead of a page's prose, and far ahead of a model's recollection of the product.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/agent-safety/",
        "https://connectbyjbrh.com/developers/arazzo-workflows/",
        "https://connectbyjbrh.com/developers/docs-search-api/",
        "https://connectbyjbrh.com/research/status-vocabulary/"
      ]
    },
    {
      "id": "D0034",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/time-and-timezones/",
      "markdown": "https://connectbyjbrh.com/developers/time-and-timezones/index.md",
      "title": "Time in the API",
      "description": "Every timestamp Connect publishes, in which format, in which zone, and the single place where a business's local time is the one that matters.",
      "summary": "Instants are RFC 3339 in UTC with a `Z`, as in `2026-09-10T09:15:00Z`. The webhook signing header is the exception: Unix seconds as a string, because it is compared arithmetically rather than displayed. Verification dates are plain calendar dates. Local time matters in exactly one place — when a person reads a due time or a business-hours window.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/webhook-signatures/",
        "https://connectbyjbrh.com/developers/entity-ids/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/errors-and-retries/",
        "https://connectbyjbrh.com/docs/protocols/ical-scheduling/"
      ]
    },
    {
      "id": "D0023",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/webhook-signatures/",
      "markdown": "https://connectbyjbrh.com/developers/webhook-signatures/index.md",
      "title": "Verifying a Connect webhook signature",
      "description": "The exact HMAC computation behind X-Connect-Signature, worked in Python, Node and Go, and the four mistakes that make a verifier look correct.",
      "summary": "The signature is `sha256=` followed by the hex HMAC-SHA256 of the string `<timestamp>.<raw body>`, keyed with the subscription secret, where the timestamp is the value of `X-Connect-Timestamp` and the body is the exact bytes received. Compare in constant time, and reject a timestamp far from now. Delivery itself is not a registered capability, so this is a specification to build against.",
      "status": "not_yet",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/webhooks-outbound/",
        "https://connectbyjbrh.com/developers/asyncapi-events/",
        "https://connectbyjbrh.com/developers/integration-keys/",
        "https://connectbyjbrh.com/developers/agent-safety/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "D0022",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/webhooks-outbound/",
      "markdown": "https://connectbyjbrh.com/developers/webhooks-outbound/index.md",
      "title": "Outbound webhooks",
      "description": "The published contract for events Connect delivers to a subscriber: the retry model, the de-duplication rule, and the honest status of delivery itself.",
      "summary": "The outbound webhook contract is written down and published as AsyncAPI: one signed POST per event, at-least-once, retried with backoff and then paused. What is not written down anywhere in the capability registry is a delivery service you can switch on. Treat this page as a specification to build a receiver against, not as a feature to plan around.",
      "status": "not_yet",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/asyncapi-events/",
        "https://connectbyjbrh.com/developers/webhook-signatures/",
        "https://connectbyjbrh.com/developers/webhooks-vs-polling/",
        "https://connectbyjbrh.com/developers/errors-and-retries/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/"
      ]
    },
    {
      "id": "D0040",
      "kind": "developer",
      "url": "https://connectbyjbrh.com/developers/webhooks-vs-polling/",
      "markdown": "https://connectbyjbrh.com/developers/webhooks-vs-polling/index.md",
      "title": "Webhooks or polling",
      "description": "The trade-off between being told and asking, what each costs in requests and operational surface, and which one is actually available here.",
      "summary": "Polling suits anything that changes on a deploy — the documentation, the manifests, the capability status — because a five-minute cache and a daily rhythm make frequent polling pointless. Events suit business moments that need acting on in seconds. On this surface only polling is available today: outbound delivery is a published contract, not a registered capability.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/webhooks-outbound/",
        "https://connectbyjbrh.com/developers/asyncapi-events/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/errors-and-retries/",
        "https://connectbyjbrh.com/developers/status-manifest/"
      ]
    },
    {
      "id": "C0300",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/account/",
      "markdown": "https://connectbyjbrh.com/docs/account/index.md",
      "title": "Account and access",
      "description": "How you get into Connect, what a session is, which workspace you land in, who may change what, and the switches an individual person owns.",
      "summary": "Access to Connect has four parts: Google sign-in, which is the only way in; a session, which belongs to one browser; a workspace, which is the isolation root every record belongs to; and a role, which decides what you may change inside it. Your plan sits beside these and governs allowance and volume — never permission.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/google-sign-in/",
        "https://connectbyjbrh.com/docs/account/sessions/",
        "https://connectbyjbrh.com/docs/account/workspace-resolution/",
        "https://connectbyjbrh.com/docs/account/plan/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/workflows/first-sign-in/"
      ]
    },
    {
      "id": "C0311",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/account/entitlements/",
      "markdown": "https://connectbyjbrh.com/docs/account/entitlements/index.md",
      "title": "Entitlements and runtime choice",
      "description": "Entitlement is what your plan grants; runtime is what your workspace has switched on, and Connect acts only when both agree.",
      "summary": "Two separate gates decide whether Connect acts. Your entitlement is commercial: the plan recorded against the workspace, the daily counters it grants and the ceilings it sets. Runtime is operational: the mode somebody chose — Auto within rules, Review before send, or Draft only — and the master run switch behind it. An entitlement nobody has switched on does nothing at all, and a mode the plan does not cover is refused at the gate rather than half-performed.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/plan/",
        "https://connectbyjbrh.com/docs/account/usage/",
        "https://connectbyjbrh.com/docs/account/lapsed-plan/",
        "https://connectbyjbrh.com/docs/workflows/entitlement-vs-runtime/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/glossary/entitlement/"
      ]
    },
    {
      "id": "C0301",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/account/google-sign-in/",
      "markdown": "https://connectbyjbrh.com/docs/account/google-sign-in/index.md",
      "title": "Signing in with Google",
      "description": "Google is the only way into Connect. What the sign-in asks for, what is kept afterwards, and the four reasons it can refuse you.",
      "summary": "You sign in to Connect with a Google account and nothing else. There is no password login, no magic link and no recovery code, because a second route in is a second route to secure. Connect asks Google to confirm who you are, keeps your email address and Google's own identifier for you, and creates a session for that browser.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/account/sessions/",
        "https://connectbyjbrh.com/docs/account/identity-binding/",
        "https://connectbyjbrh.com/docs/account/session-replacement/",
        "https://connectbyjbrh.com/docs/email/gmail-scopes/",
        "https://connectbyjbrh.com/docs/workflows/google-sign-in/",
        "https://connectbyjbrh.com/docs/troubleshooting/cannot-sign-in/"
      ]
    },
    {
      "id": "C0304",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/account/identity-binding/",
      "markdown": "https://connectbyjbrh.com/docs/account/identity-binding/index.md",
      "title": "How your Google account binds to a person",
      "description": "Connect binds one Google identity to one user on first sign-in. Where that binding is stored, why there are two stores, and what a mismatch means.",
      "summary": "Your email address says who you claim to be; Google's stable identifier for your account is the proof. Connect records that identifier the first time you sign in and compares it every time afterwards. If a different Google account arrives with the same email address, the sign-in is refused as a mismatch — and no amount of retrying changes it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/google-sign-in/",
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/account/workspace-resolution/",
        "https://connectbyjbrh.com/docs/account/sessions/",
        "https://connectbyjbrh.com/docs/workflows/identity-binding/",
        "https://connectbyjbrh.com/docs/troubleshooting/cannot-sign-in/",
        "https://connectbyjbrh.com/docs/security/authorization/"
      ]
    },
    {
      "id": "C0313",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/account/lapsed-plan/",
      "markdown": "https://connectbyjbrh.com/docs/account/lapsed-plan/index.md",
      "title": "When a plan lapses",
      "description": "What stops when a workspace plan is no longer live, what waits instead of failing, what is refused outright, and what is never deleted.",
      "summary": "A lapsed plan closes the metered gate, not the door. Sending stops, ingesting new mail stops and model work for the workspace stops, each with a plan message rather than a technical error. Everything already in the workspace stays exactly where it is — threads, people, memory, knowledge, held drafts and dated follow-ups — and the mail nobody has fetched yet is still sitting at the provider, unread and unskipped.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/plan/",
        "https://connectbyjbrh.com/docs/account/entitlements/",
        "https://connectbyjbrh.com/docs/account/usage/",
        "https://connectbyjbrh.com/docs/workflows/lapse-and-recovery/",
        "https://connectbyjbrh.com/docs/troubleshooting/plan-lapsed/",
        "https://connectbyjbrh.com/docs/security/data-retention/"
      ]
    },
    {
      "id": "C0306",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/account/owner-vs-tenant/",
      "markdown": "https://connectbyjbrh.com/docs/account/owner-vs-tenant/index.md",
      "title": "The operator's workspace and a customer's",
      "description": "One codebase serves the platform operator and every customer. The feature set is identical; the difference is commercial, plus two screens about running the platform.",
      "summary": "There is no operator edition and no customer edition. Every capability runs on one implementation for both, and the difference is commercial: a customer's use is bounded by their plan's allowances, while the operator has no plan and no allowance gates. Two screens are correctly operator-only, and both are about running the platform rather than using Connect.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/account/workspace-resolution/",
        "https://connectbyjbrh.com/docs/account/plan/",
        "https://connectbyjbrh.com/docs/security/customer-facade/",
        "https://connectbyjbrh.com/docs/workflows/owner-tenant-routing/",
        "https://connectbyjbrh.com/docs/autonomy/autonomy-owner-tenant/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/"
      ]
    },
    {
      "id": "C0310",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/account/plan/",
      "markdown": "https://connectbyjbrh.com/docs/account/plan/index.md",
      "title": "Your plan",
      "description": "A plan decides how much a workspace may do, never what it is allowed to do. What that distinction covers, and the one place it is easy to get backwards.",
      "summary": "A plan governs allowance and volume. It does not govern permission: no feature is switched off by a plan, no autonomy setting comes from one, and no isolation boundary depends on one. The operator has no plan at all and no allowance gates, and runs the identical feature set — which is the clearest proof that capability and commerce are separate here.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/account/usage/",
        "https://connectbyjbrh.com/docs/account/entitlements/",
        "https://connectbyjbrh.com/docs/account/lapsed-plan/",
        "https://connectbyjbrh.com/docs/account/owner-vs-tenant/",
        "https://connectbyjbrh.com/docs/autonomy/spend-context/",
        "https://connectbyjbrh.com/docs/troubleshooting/allowance-reached/"
      ]
    },
    {
      "id": "C0308",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/account/profile/",
      "markdown": "https://connectbyjbrh.com/docs/account/profile/index.md",
      "title": "Your profile",
      "description": "What Connect keeps about you personally is deliberately small. Where the line falls between your details and the workspace's, and why the signature is not yours.",
      "summary": "Your profile in Connect is short by design: the email address Google verified, how you signed in, the workspace you resolved to, your role in it, and the sessions you currently hold. Almost everything people expect to find here — the signature, the tone, what Connect knows about a customer — belongs to the workspace instead, and is edited where it is used.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/account/sessions/",
        "https://connectbyjbrh.com/docs/account/security-settings/",
        "https://connectbyjbrh.com/docs/account/workspace-admin/",
        "https://connectbyjbrh.com/docs/email/mailbox-signature/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/account/identity-binding/"
      ]
    },
    {
      "id": "C0309",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/account/security-settings/",
      "markdown": "https://connectbyjbrh.com/docs/account/security-settings/index.md",
      "title": "Security settings",
      "description": "The security controls a person genuinely has: the list of live sessions, one action that ends all the others, and what to do the day a device goes missing.",
      "summary": "There is one security action you can take on your own account, and it is the one that matters: sign out of every other device. Beside it the account screen shows how you are authenticated, when you last signed in, and every session you currently hold. There is no password to change, because there is no password.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/account/sessions/",
        "https://connectbyjbrh.com/docs/account/session-replacement/",
        "https://connectbyjbrh.com/docs/account/google-sign-in/",
        "https://connectbyjbrh.com/docs/workflows/account-security-review/",
        "https://connectbyjbrh.com/docs/security/credential-sealing/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/"
      ]
    },
    {
      "id": "C0303",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/account/session-replacement/",
      "markdown": "https://connectbyjbrh.com/docs/account/session-replacement/index.md",
      "title": "Signing in as somebody else",
      "description": "Signing in as a different person on the same browser ends the session that browser was holding — that one only, never that person's other devices.",
      "summary": "When a different person signs in on a browser that already had somebody signed in, the session it was holding is ended, not merely replaced. The cookie changes either way; ending the old session is what stops it living on as a valid credential nobody is watching. Only that browser is affected — the previous person's phone, laptop and every other device carry on untouched.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/sessions/",
        "https://connectbyjbrh.com/docs/account/security-settings/",
        "https://connectbyjbrh.com/docs/account/google-sign-in/",
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/workflows/sign-out-replacement/",
        "https://connectbyjbrh.com/docs/troubleshooting/session-expired/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/"
      ]
    },
    {
      "id": "C0302",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/account/sessions/",
      "markdown": "https://connectbyjbrh.com/docs/account/sessions/index.md",
      "title": "Sessions",
      "description": "A signed-in browser, how long it stays signed in, what ends one, and why your other devices are unaffected by anything that happens to this one.",
      "summary": "A session is one signed-in browser: a stored row plus a cookie that browser holds. It lasts about a fortnight by default, it belongs to that browser alone, and four things end it — expiry, signing out, being revoked from the security screen, or a different person signing in on the same browser. Nothing you do on one device disturbs another.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/account/google-sign-in/",
        "https://connectbyjbrh.com/docs/account/session-replacement/",
        "https://connectbyjbrh.com/docs/account/security-settings/",
        "https://connectbyjbrh.com/docs/workflows/session-establishment/",
        "https://connectbyjbrh.com/docs/troubleshooting/session-expired/",
        "https://connectbyjbrh.com/docs/security/public-vs-private/"
      ]
    },
    {
      "id": "C0312",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/account/usage/",
      "markdown": "https://connectbyjbrh.com/docs/account/usage/index.md",
      "title": "Usage and allowances",
      "description": "What Connect counts against a plan, how a daily allowance is reserved before the work happens, and what you see as a limit gets close.",
      "summary": "Usage comes in two shapes: daily counters that reset at midnight UTC, and ceilings on how many of a thing may exist at once. A daily counter is reserved before the work happens and inside the same transaction, which is what makes a limit hold when several requests arrive together. Some events are counted and never refused — an inbound customer message is one of them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/entitlements/",
        "https://connectbyjbrh.com/docs/account/plan/",
        "https://connectbyjbrh.com/docs/troubleshooting/allowance-reached/",
        "https://connectbyjbrh.com/docs/workflows/usage-metering/",
        "https://connectbyjbrh.com/docs/glossary/allowance/",
        "https://connectbyjbrh.com/docs/autonomy/spend-context/"
      ]
    },
    {
      "id": "C0307",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/account/workspace-admin/",
      "markdown": "https://connectbyjbrh.com/docs/account/workspace-admin/index.md",
      "title": "Workspace administration",
      "description": "Memberships, roles and what an administrator may change — and the deliberate limit: no member management on the account screen.",
      "summary": "A workspace has members, each with a role, and the administrator is the person who may change how it works: autonomy, mailboxes, knowledge, integrations and the runtime switch. The model is wider than what you can reach today. There is no member-management screen, and a session resolves only when exactly one active administrator membership matches — so the practical shape is one administrator per workspace.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/account/workspace-resolution/",
        "https://connectbyjbrh.com/docs/account/profile/",
        "https://connectbyjbrh.com/docs/autonomy/permissions/",
        "https://connectbyjbrh.com/docs/workflows/adding-a-colleague/",
        "https://connectbyjbrh.com/docs/workflows/workspace-admin-permission/",
        "https://connectbyjbrh.com/docs/security/authorization/"
      ]
    },
    {
      "id": "C0305",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/account/workspace-resolution/",
      "markdown": "https://connectbyjbrh.com/docs/account/workspace-resolution/index.md",
      "title": "Which workspace you are in",
      "description": "Every request runs inside exactly one workspace. How that one is chosen from your memberships, and why a second membership stops a sign-in rather than offering a choice.",
      "summary": "A workspace is chosen when your session is created, from your active membership. The operator's account resolves to the operator workspace; everybody else resolves to the single workspace they administer. Exactly one active membership must match — none refuses the sign-in, and two refuse it as well, rather than guessing which you meant.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/account/owner-vs-tenant/",
        "https://connectbyjbrh.com/docs/account/workspace-admin/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/workflows/workspace-resolution-flow/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-workspace/",
        "https://connectbyjbrh.com/research/invisible-not-missing/"
      ]
    },
    {
      "id": "C0204",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/assistant/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/index.md",
      "title": "Connect Assistant",
      "description": "What the Connect Assistant is, the 66 tools behind it, how every write reaches a record, and the authority it deliberately does not have.",
      "summary": "The Connect Assistant is the assistant inside the app: you ask it about your workspace in plain words and it answers, or proposes an action and runs it once you agree. It has 66 tools. The reading ones cost nothing but a query; the writing ones go through the same service a screen would call, and its rights are narrower than your own.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/opening/",
        "https://connectbyjbrh.com/docs/assistant/assistant-tools/",
        "https://connectbyjbrh.com/docs/assistant/assistant-authority/",
        "https://connectbyjbrh.com/docs/assistant/action-cards/",
        "https://connectbyjbrh.com/research/agent-tools-call-services/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0216",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/action-cards/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/action-cards/index.md",
      "title": "Proposed actions",
      "description": "Anything the Assistant would change arrives first as a card: the action, the reason, the arguments you can edit, and a confirmation that nothing has happened yet.",
      "summary": "A proposed action is a card, not a change. It names the tool that would run, says why the Assistant thinks it is the right one, shows every argument it filled in, and waits. You can edit the arguments, confirm, or discard it. Until you confirm, nothing has been written and nothing is queued anywhere.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/executing-actions/",
        "https://connectbyjbrh.com/docs/assistant/undo/",
        "https://connectbyjbrh.com/docs/assistant/assistant-authority/",
        "https://connectbyjbrh.com/docs/assistant/read-only-answers/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "C0220",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/assistant-authority/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/assistant-authority/index.md",
      "title": "What the Assistant may not do",
      "description": "The Assistant is given deliberately narrower rights than the person using it: no pricing, no clearing a do-not-contact entry, and no way around a workspace's own rules.",
      "summary": "You can do things the Assistant may not, and that gap is designed rather than unfinished. It cannot set a price and it cannot clear a do-not-contact entry. It cannot widen the autonomy rules it works under, reach another workspace, or read a sealed credential. Every refusal names the limit and is kept in the decision log.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/assistant/executing-actions/",
        "https://connectbyjbrh.com/research/authority-separation/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/troubleshooting/assistant-refused/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/assistant/assistant-tools/"
      ]
    },
    {
      "id": "C0222",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/assistant-memory/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/assistant-memory/index.md",
      "title": "Correcting a fact without leaving the Assistant",
      "description": "Turning something you said in conversation into what Connect actually knows: which tier it lands in, how a block is stored, and what forgetting does.",
      "summary": "Ask the Assistant to remember something and it writes a memory at one of four tiers — workspace, channel, endpoint or contact — through the memory service rather than into the conversation. That is what the engine reads when it drafts and decides. Asking it to forget removes the entry at the tier holding it, and the decision log keeps both events.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/assistant/history/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/",
        "https://connectbyjbrh.com/research/structured-business-memory/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/assistant/source-conflict/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0226",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/assistant-responsive/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/assistant-responsive/index.md",
      "title": "The Assistant on a phone and on a wide screen",
      "description": "Three layouts for one Assistant: full screen on a phone, a sidebar from 600px, a column on a wide screen — and how the on-screen keyboard is handled.",
      "summary": "The Assistant is one panel with three arrangements, decided by the width you give it. Below 600px it fills the screen and its sections live behind a More menu. At 600px and above those sections become a sidebar. On a wide screen the panel sits beside the app instead of over it. Nothing is removed between layouts; things move.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/assistant/opening/",
        "https://connectbyjbrh.com/docs/assistant/tabs/",
        "https://connectbyjbrh.com/docs/troubleshooting/assistant-missing/",
        "https://connectbyjbrh.com/research/invisible-ui-defects/"
      ]
    },
    {
      "id": "C0219",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/assistant-tools/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/assistant-tools/index.md",
      "title": "The Assistant's tools",
      "description": "The Assistant has 66 tools. What the reading ones reach, what the writing ones change, and the rule that every write calls the service owning the record.",
      "summary": "Sixty-six tools stand behind the Assistant. Twenty-five of them can only read — conversations, drafts, leads, files, knowledge, follow-ups, cases, opportunities, settings. The rest write, and every one of them calls the domain service that owns the thing being changed rather than touching a table, so an Assistant action meets the same rules a person's action meets.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/read-only-answers/",
        "https://connectbyjbrh.com/docs/assistant/action-cards/",
        "https://connectbyjbrh.com/research/agent-tools-call-services/",
        "https://connectbyjbrh.com/docs/assistant/assistant-authority/",
        "https://connectbyjbrh.com/developers/mcp-workspace-tools/",
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/research/grid-over-services/"
      ]
    },
    {
      "id": "C0213",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/evidence-and-citation/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/evidence-and-citation/index.md",
      "title": "Where an answer came from",
      "description": "How the Assistant shows what an answer was built from, how to read the folded step detail, and what to do when it cannot name a source.",
      "summary": "Every answer is produced by tools that ran against your workspace, and the status line's folded detail lists them: which tools, in what order, how many steps. Answers grounded in your own material name what they were drawn from — a thread, a file, a knowledge source, a memory. An answer that can name nothing is telling you something, and it is not that it is confident.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/uncertainty/",
        "https://connectbyjbrh.com/docs/assistant/source-conflict/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/research/grounding-without-a-vector-database/",
        "https://connectbyjbrh.com/docs/assistant/read-only-answers/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "C0217",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/executing-actions/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/executing-actions/index.md",
      "title": "Running an action",
      "description": "What happens the moment you confirm: which service runs, which gates still apply, what the result shows you, and what is written to the decision log.",
      "summary": "Confirming hands the action to the service that owns the thing — the follow-up service, the approval path, the memory tiers, the send boundary. That service applies its own gates before anything happens, so a confirmed action can complete, be held for a further decision, or be refused. The result says which, and the decision log keeps it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/action-cards/",
        "https://connectbyjbrh.com/docs/assistant/undo/",
        "https://connectbyjbrh.com/docs/assistant/assistant-authority/",
        "https://connectbyjbrh.com/research/agent-tools-call-services/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/workflows/tool-call-execution/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/"
      ]
    },
    {
      "id": "C0225",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/feedback/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/feedback/index.md",
      "title": "Rating an answer",
      "description": "What rating an Assistant answer records, who can read it, and why a correction you want to stick belongs in Memory rather than in a rating.",
      "summary": "Rating an answer records your judgement against that answer and the conversation it belongs to. It is a signal, not a control: no model is trained on it, and the next answer is not different because you rated the last one. When you want the behaviour itself to change, correct the fact in Memory or write a standing instruction. Those two do change what happens next.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/assistant/assistant-memory/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/assistant/uncertainty/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/"
      ]
    },
    {
      "id": "C0221",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/files-in-assistant/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/files-in-assistant/index.md",
      "title": "Working with files in the Assistant",
      "description": "Attaching a document to the Assistant, the formats it reads, what it refuses, and where a document it creates or changes actually goes.",
      "summary": "Attach by button, by dropping onto the panel or by pasting. The attachment goes through the same file service both audiences share, already workspace-scoped and under row-level security, so nothing new is created to hold it. The Assistant can read it, answer from it, and produce a new version of it — never a silent overwrite.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/files-data/supported-formats/",
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/files-data/safe-parsing/",
        "https://connectbyjbrh.com/research/files-through-one-service/",
        "https://connectbyjbrh.com/docs/workflows/upload-and-answer/",
        "https://connectbyjbrh.com/docs/assistant/action-cards/"
      ]
    },
    {
      "id": "C0210",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/history/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/history/index.md",
      "title": "Conversation history",
      "description": "What an Assistant conversation keeps, where it lives, why it is not the same thing as memory, and how to start a genuinely clean thread.",
      "summary": "A conversation belongs to the tab that produced it, and it stays there so you can leave the panel and come back to work in progress. It is workspace data under the same isolation as everything else. It is not memory: nothing you type changes how Connect behaves tomorrow unless you deliberately turn it into a memory, a standing instruction or a knowledge source.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/tabs/",
        "https://connectbyjbrh.com/docs/assistant/assistant-memory/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/research/relationship-memory/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/follow-ups/"
      ]
    },
    {
      "id": "C0224",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/live-stream/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/live-stream/index.md",
      "title": "The live status line",
      "description": "The single line the Assistant shows while it works: what Understanding means, what the step count counts, and what Stop actually stops.",
      "summary": "While the Assistant is working you get one status line, not a row of stage pills. It reads `Understanding…` while the model decides what to do, then settles to `Done · N steps` when the answer is finished. N is how many tools ran, and the folded details say which ones. A compact Stop sits beside it and ends the run where it stands.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/assistant/executing-actions/",
        "https://connectbyjbrh.com/docs/assistant/evidence-and-citation/",
        "https://connectbyjbrh.com/docs/troubleshooting/assistant-stuck/",
        "https://connectbyjbrh.com/research/derived-control-state/"
      ]
    },
    {
      "id": "C0223",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/needs-you-in-assistant/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/needs-you-in-assistant/index.md",
      "title": "Needs You inside the Assistant",
      "description": "The queue of decisions waiting on a person, worked from inside the Assistant panel: what is shown, what deciding there does, and what it will not let you do.",
      "summary": "Needs You draws into the Assistant's single scroller alongside Chat, Standing instructions, Memory and Files, so you can review a held reply or an operational problem and decide on it without leaving the panel. It is the same queue and the same approval path as the full screen — ranked rather than chronological, and draining by itself as causes clear.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/assistant/action-cards/",
        "https://connectbyjbrh.com/docs/assistant/executing-actions/",
        "https://connectbyjbrh.com/docs/assistant/tabs/",
        "https://connectbyjbrh.com/research/approval-without-blocking/",
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "C0205",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/opening/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/opening/index.md",
      "title": "Opening the Assistant",
      "description": "Where the Connect Assistant lives, how the panel opens over any screen, and what it already knows about your workspace the moment it does.",
      "summary": "The Assistant opens over whatever screen you are on, from a launcher that is present on every route in the app. It arrives already knowing which workspace you are in, which page you have open and which record that page is showing — and that last claim is checked against the database before any answer leans on it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/assistant/tabs/",
        "https://connectbyjbrh.com/docs/assistant/screen-context/",
        "https://connectbyjbrh.com/docs/troubleshooting/assistant-missing/",
        "https://connectbyjbrh.com/docs/assistant/assistant-responsive/",
        "https://connectbyjbrh.com/research/invisible-ui-defects/"
      ]
    },
    {
      "id": "C0212",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/read-only-answers/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/read-only-answers/index.md",
      "title": "Answers that change nothing",
      "description": "Most of what the Assistant does is read and answer. The tools that can only read, how to recognise one at a glance, and why the default matters.",
      "summary": "Reading is the Assistant's default. Twenty-five of its sixty-six tools can only look — at threads, drafts, leads, files, knowledge, follow-ups, cases, opportunities and settings — and a question answered by those changes nothing at all. You can tell a read from a write without knowing any tool names: a read ends in an answer, a write ends in a card asking you to confirm.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/assistant-tools/",
        "https://connectbyjbrh.com/docs/assistant/action-cards/",
        "https://connectbyjbrh.com/docs/assistant/evidence-and-citation/",
        "https://connectbyjbrh.com/docs/assistant/executing-actions/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/evidence-for-next-action/"
      ]
    },
    {
      "id": "C0208",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/record-context/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/record-context/index.md",
      "title": "Working on one record",
      "description": "Pinning a person, company, deal or thread to an Assistant tab: what changes in the answers, what it overrides, and when to unpin.",
      "summary": "A tab can be pinned to one record — a person, a company, a deal, a thread or a call. Once it is, every question in that tab resolves against that record rather than against whatever screen is behind the panel, the answers draw on that record's own history, and any action proposed arrives with the record already filled in.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/screen-context/",
        "https://connectbyjbrh.com/docs/assistant/tabs/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/assistant/action-cards/",
        "https://connectbyjbrh.com/research/one-person-many-channels/",
        "https://connectbyjbrh.com/docs/sales/"
      ]
    },
    {
      "id": "C0207",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/screen-context/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/screen-context/index.md",
      "title": "Screen awareness",
      "description": "What the Assistant is told about the page you are on, and the database check that runs before any of it is allowed to shape an answer.",
      "summary": "The Assistant is told which route you are on and which record that page is showing, so 'summarise this' has a subject. That claim arrives from the browser and is therefore not trusted: every identifier it carries is re-read from the database, inside your workspace, before the model sees it. Anything that does not resolve is dropped rather than described.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/assistant/record-context/",
        "https://connectbyjbrh.com/docs/assistant/selected-text/",
        "https://connectbyjbrh.com/docs/troubleshooting/assistant-wrong-context/",
        "https://connectbyjbrh.com/docs/workflows/assistant-context-check/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "C0209",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/selected-text/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/selected-text/index.md",
      "title": "Asking about selected text",
      "description": "Highlighting a passage and asking about it: exactly what leaves the page, what stays behind, and the questions it answers better than any other route.",
      "summary": "Select text on a screen and the selection travels with your next question, so the Assistant answers about that passage rather than the whole record. What is sent is the text you highlighted and the identifier of the record it came from — not the page around it, and not anything you did not select.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/screen-context/",
        "https://connectbyjbrh.com/docs/assistant/record-context/",
        "https://connectbyjbrh.com/docs/assistant/files-in-assistant/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/assistant/action-cards/"
      ]
    },
    {
      "id": "C0215",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/source-conflict/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/source-conflict/index.md",
      "title": "When the Assistant finds two answers",
      "description": "What happens when a memory, a knowledge source and a customer's own message do not agree: what is shown, what is never decided silently, and who settles it.",
      "summary": "Connect shows you both sides with their origin and their age, and does not pick a winner on your behalf. Where precedence is designed — memory tiers, autonomy scopes — the narrower one wins automatically and that is not a conflict. A real disagreement between two statements of fact is a business decision, and a business decision belongs to a person.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/uncertainty/",
        "https://connectbyjbrh.com/docs/assistant/evidence-and-citation/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/",
        "https://connectbyjbrh.com/docs/assistant/assistant-memory/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0211",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/suggested-commands/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/suggested-commands/index.md",
      "title": "Suggested commands",
      "description": "The prompts the Assistant offers before you type: what they are drawn from, what they are not, and why clicking one still asks before it acts.",
      "summary": "Suggestions are opening phrasings, offered from the screen you are on and the state of your workspace. They are a way past the blank box, not a menu of everything the Assistant can do and not a plan it intends to carry out. Choosing one puts words in the box; anything that would change a record still arrives as a proposal you confirm.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/assistant/screen-context/",
        "https://connectbyjbrh.com/docs/assistant/action-cards/",
        "https://connectbyjbrh.com/docs/assistant/read-only-answers/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/evidence-for-next-action/"
      ]
    },
    {
      "id": "C0206",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/tabs/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/tabs/index.md",
      "title": "Assistant tabs",
      "description": "Each Assistant tab keeps its own conversation, follow-up chain, record, draft, files and scroll position — and why that separation is the point.",
      "summary": "The Assistant's tabs work like a browser's. Each one owns a conversation, the follow-up chain that conversation produced, the record it is pinned to, any draft in progress, the files attached to it and its scroll position. Nothing crosses between them, so two pieces of work can be open at once without either one contaminating the other's answers.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/assistant/opening/",
        "https://connectbyjbrh.com/docs/assistant/record-context/",
        "https://connectbyjbrh.com/docs/assistant/history/",
        "https://connectbyjbrh.com/docs/assistant/assistant-responsive/",
        "https://connectbyjbrh.com/docs/relationships/"
      ]
    },
    {
      "id": "C0214",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/uncertainty/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/uncertainty/index.md",
      "title": "When the Assistant is not sure",
      "description": "Why an admission beats a plausible guess in a system that acts on its answers, and what the Assistant offers you in place of one.",
      "summary": "'I do not know' is a correct answer here, not a failure to produce one. The Assistant sits on top of a system that sends mail, places calls and moves deals, so a confident invention does not stop at being wrong — it gets acted on. When it is unsure the Assistant says which part is uncertain, gives you what it does have, and offers the fastest way to settle it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/evidence-and-citation/",
        "https://connectbyjbrh.com/docs/assistant/source-conflict/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/research/status-vocabulary/"
      ]
    },
    {
      "id": "C0218",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/assistant/undo/",
      "markdown": "https://connectbyjbrh.com/docs/assistant/undo/index.md",
      "title": "Undoing an action",
      "description": "Some Assistant actions reverse cleanly, some cannot be reversed at all, and the line between them follows whether the change ever left your workspace.",
      "summary": "An action that only changed something inside your workspace can be reversed — delete the follow-up, forget the memory, move the deal back, open the earlier version of the file. An action that reached the outside world cannot: a message a provider has accepted is delivered, and no button retrieves it. The dividing line is that, not the tool that ran.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/executing-actions/",
        "https://connectbyjbrh.com/docs/assistant/action-cards/",
        "https://connectbyjbrh.com/research/undo-for-agents/",
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/workflows/assistant-undo/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0255",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/autonomy/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/index.md",
      "title": "What Connect may do",
      "description": "The controls deciding what Connect may send, call or do on its own: four modes, four scopes, the approval queue, and the decision log.",
      "summary": "Autonomy is one rule per channel saying how far Connect may go without a person: `off`, `draft_only`, `ask_before_send` or `autonomous`. The rule can be set at four scopes — contact, endpoint, channel, workspace — and the narrowest one that applies wins. Anything held for a decision arrives in Needs You, and every decision, including a refusal, is written to the decision log.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/scopes/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-sending/"
      ]
    },
    {
      "id": "C0263",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/approvals/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/approvals/index.md",
      "title": "Approvals",
      "description": "Waiting For You: how a held action is presented, what a person may change, the two decisions available, and what each one records.",
      "summary": "Anything Connect prepared under `ask_before_send` becomes a held action in Waiting For You, shown with the message or commitment it answers. Two decisions are available: say yes and it goes out immediately through the same send boundary a person's own send uses, or say no and the refusal is recorded against the thread. Both are written to the decision log.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/editing-before-approval/",
        "https://connectbyjbrh.com/docs/autonomy/rejecting/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/docs/troubleshooting/approval-not-appearing/"
      ]
    },
    {
      "id": "C0260",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/ask-before-calling/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/ask-before-calling/index.md",
      "title": "Asking before placing a call",
      "description": "Holding outbound calls for a human yes: what the setting covers, what the approver is shown, and what happens to a call-back that waits too long.",
      "summary": "Setting the voice channel to `ask_before_send` turns every call Connect would place into a held decision. The number is not dialled; the item appears in Waiting For You with the person, the reason and the follow-up it came from. Approving places the call through the same gates as any other outbound; a call-back left waiting more than a day is closed as missed rather than rung late.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/per-channel/",
        "https://connectbyjbrh.com/docs/autonomy/approvals/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you-ranking/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "C0270",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/audit-retention/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/audit-retention/index.md",
      "title": "How long the record is kept",
      "description": "How long decision records last, what actually limits an investigation, and why no age-based deletion schedule is published for them.",
      "summary": "Decision records are ordinary workspace data in PostgreSQL under row-level security, so their lifetime is the workspace's lifetime. No age-based deletion schedule for them is documented, and this page does not invent one. In practice what limits an investigation is not age but scope: the log keeps decisions and their rules, not the wording of messages.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/security/data-retention/",
        "https://connectbyjbrh.com/docs/security/audit-access/",
        "https://connectbyjbrh.com/docs/workflows/workspace-deletion/",
        "https://connectbyjbrh.com/docs/autonomy/permissions/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "C0269",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/audit-trail/index.md",
      "title": "The decision log",
      "description": "What was decided, by what, under which rule, and what happened — including the refusals, because a refusal is a decision like any other.",
      "summary": "The Decision Log records four things about every action Connect or a person takes on an outbound: what was decided, by what or by whom, under which rule, and what actually happened. Refusals are written in the same shape as actions. It is scoped to one workspace like every other record, and it is the screen that answers questions nobody thought to ask at the time.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/audit-retention/",
        "https://connectbyjbrh.com/docs/autonomy/rejecting/",
        "https://connectbyjbrh.com/docs/autonomy/explicit-gates/",
        "https://connectbyjbrh.com/docs/autonomy/approvals/",
        "https://connectbyjbrh.com/docs/security/audit-access/",
        "https://connectbyjbrh.com/docs/troubleshooting/unexpected-autonomous-action/"
      ]
    },
    {
      "id": "C0273",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/autonomy-owner-tenant/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/autonomy-owner-tenant/index.md",
      "title": "Autonomy for the Owner and for a customer",
      "description": "One implementation serves both audiences: a customer gets the same modes, scopes, queue and log, with the plan bounding volume rather than permission.",
      "summary": "There is no reduced autonomy for customer workspaces. The four modes, the four scopes, the approval queue, Needs You and the decision log are one implementation reached through two doors. The only difference is commercial: a customer's volume is bounded by their plan's allowances, while the platform operator's own workspace has no plan and no such gates.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/autonomy/spend-context/",
        "https://connectbyjbrh.com/docs/autonomy/permissions/",
        "https://connectbyjbrh.com/docs/account/owner-vs-tenant/",
        "https://connectbyjbrh.com/docs/security/customer-facade/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/"
      ]
    },
    {
      "id": "C0272",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/connect-on-off/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/connect-on-off/index.md",
      "title": "Turning Connect on and off",
      "description": "The runtime switch: what stops when you turn Connect off, what carries on regardless, and the four things it deliberately does not change.",
      "summary": "The runtime control stops Connect working. Nothing is triaged, drafted, sent or dialled while it is off, and the engine is not deciding anything to refuse. It changes no setting: your autonomy rules, held items, memory, commitments and plan are exactly as you left them, and switching it back on resumes work rather than replaying it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/autonomy/spend-context/",
        "https://connectbyjbrh.com/docs/workflows/runtime-toggle/",
        "https://connectbyjbrh.com/docs/workflows/stopping-connect/",
        "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-happening/"
      ]
    },
    {
      "id": "C0264",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/editing-before-approval/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/editing-before-approval/index.md",
      "title": "Editing before approving",
      "description": "Changing a prepared reply before releasing it: which parts a person may alter, what the edit records, and when to regenerate instead.",
      "summary": "The subject, the body and the recipients of a held reply are all editable, and what you leave behind is exactly what goes out — Connect does not re-write over your changes. The mailbox it is sent from is not editable, because that was settled by the mailbox's role and the thread. Heavy editing is a signal worth acting on rather than a habit worth keeping.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/approvals/",
        "https://connectbyjbrh.com/docs/autonomy/rejecting/",
        "https://connectbyjbrh.com/docs/autonomy/standing-instructions/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/"
      ]
    },
    {
      "id": "C0261",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/exceptions/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/exceptions/index.md",
      "title": "Exceptions to a rule",
      "description": "Overriding a channel rule for one contact or one mailbox: when an exception is the right instrument, and the three tools often confused with it.",
      "summary": "An exception is an autonomy setting attached to one contact or one endpoint instead of a whole channel. Because the narrowest level wins, it overrides the channel in either direction and survives every later change to it. Use one when the *permission* for a particular counterpart should differ; use memory or a standing instruction when it is the *wording* that should.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/scopes/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/standing-instructions/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/relationships/"
      ]
    },
    {
      "id": "C0259",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/explicit-gates/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/explicit-gates/index.md",
      "title": "The gates that always apply",
      "description": "Suppression, blocks, allowances, evidence and workspace isolation: the refusals that stand even when a channel is set to autonomous.",
      "summary": "`autonomous` means Connect does not stop to ask. It does not mean nothing can stop it. A suppressed or blocked recipient, a spent daily allowance, an address there is no evidence for, a provider that cannot carry the message and the workspace boundary itself all refuse regardless of the mode — and each refusal is written to the decision log with its reason.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/spend-context/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/autonomy/connect-on-off/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-sending/"
      ]
    },
    {
      "id": "C0256",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/modes/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/modes/index.md",
      "title": "The four autonomy modes",
      "description": "Off, draft only, ask before sending and autonomous: what each does to an outbound action, and the difference readers most often miss.",
      "summary": "`off` disables the channel entirely. `draft_only` writes a reply and stops, without asking anyone. `ask_before_send` writes a reply and puts it in front of a person, who must say yes before it goes. `autonomous` sends within the gates. The pair to keep straight is the middle two: both hold the message, only `ask_before_send` requests a decision.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "sms",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/autonomy/scopes/",
        "https://connectbyjbrh.com/docs/autonomy/per-channel/",
        "https://connectbyjbrh.com/docs/autonomy/explicit-gates/",
        "https://connectbyjbrh.com/docs/autonomy/approvals/",
        "https://connectbyjbrh.com/docs/troubleshooting/approval-not-appearing/"
      ]
    },
    {
      "id": "C0268",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/needs-you-kinds/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/needs-you-kinds/index.md",
      "title": "What appears in Needs You",
      "description": "Every sort of entry the attention list carries, what each one means, and the screen you go to in order to make it go away.",
      "summary": "Entries fall into three families: decisions held for a person, operational problems stopping Connect working, and work only a person can do. Each carries the screen where it is resolved — a mailbox entry sends you to Mailboxes, a held reply to Waiting For You, a task to Follow-ups. None of them is dismissed; each clears when its cause does.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you-ranking/",
        "https://connectbyjbrh.com/docs/autonomy/approvals/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/troubleshooting/integration-disconnected/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "C0267",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/needs-you-ranking/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/needs-you-ranking/index.md",
      "title": "How Needs You is ordered",
      "description": "Why the list is not in arrival order: the signals that push an entry up, the ones that pull it down, and how your own triage feeds back into it.",
      "summary": "Needs You is ranked rather than chronological, because the oldest thing waiting is very often not the most costly thing waiting. Operational faults that stop work outrank individual decisions; a first contact outranks a long-running thread; work with a deadline outranks work without one. The exact weighting is not published, but the classes of signal are these.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you-kinds/",
        "https://connectbyjbrh.com/docs/autonomy/approvals/",
        "https://connectbyjbrh.com/docs/autonomy/ask-before-calling/",
        "https://connectbyjbrh.com/docs/workflows/needs-you-triage/",
        "https://connectbyjbrh.com/research/evidence-for-next-action/"
      ]
    },
    {
      "id": "C0266",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/needs-you/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/needs-you/index.md",
      "title": "Needs You",
      "description": "One ranked place for everything wanting a person: held decisions, mailboxes needing attention and line health, each clearing as its cause resolves.",
      "summary": "Needs You is the single list of things wanting a person: decisions held for approval, and operational problems such as a mailbox needing reconnection or a phone line in poor health. It is ranked rather than chronological, and nothing is ticked off by hand — an entry disappears when the thing causing it has been resolved.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/needs-you-ranking/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you-kinds/",
        "https://connectbyjbrh.com/docs/autonomy/approvals/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/troubleshooting/needs-you-empty/",
        "https://connectbyjbrh.com/docs/workflows/needs-you-triage/"
      ]
    },
    {
      "id": "C0258",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/per-channel/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/per-channel/index.md",
      "title": "Setting autonomy per channel",
      "description": "Email, WhatsApp, SMS and voice each carry their own autonomy mode. Why they usually should not match, and the configurations that work.",
      "summary": "Each of the four channels — email, WhatsApp, SMS and voice — holds its own autonomy mode, and there is no setting that ties them together. They differ in how reversible a mistake is, how quickly the other side expects an answer, and what the provider can carry, so a configuration matching all four is usually a configuration nobody has thought about yet.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "sms",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/scopes/",
        "https://connectbyjbrh.com/docs/autonomy/ask-before-calling/",
        "https://connectbyjbrh.com/docs/autonomy/explicit-gates/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "C0274",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/permissions/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/permissions/index.md",
      "title": "Who may change what",
      "description": "Who is allowed to change autonomy, decide a held item and read the record — and the rights the Connect Assistant is never given.",
      "summary": "Three boundaries decide who may do what: the workspace, which every record belongs to and nothing crosses; the person, identified by a Google account and able to decide items on channels they may send on; and the Connect Assistant, whose rights are deliberately narrower than any person's. Everything anybody does is recorded against them by name.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/autonomy-owner-tenant/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/account/workspace-admin/",
        "https://connectbyjbrh.com/docs/account/google-sign-in/",
        "https://connectbyjbrh.com/docs/security/authorization/",
        "https://connectbyjbrh.com/docs/assistant/"
      ]
    },
    {
      "id": "C0265",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/rejecting/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/rejecting/index.md",
      "title": "Rejecting an action",
      "description": "Saying no to a held item: what happens to the prepared work, what is written down, and whether Connect tries the same thing again.",
      "summary": "Declining a held item stops it going out, records the decision against the thread or the commitment it came from, and stops the engine immediately preparing the same thing again. It does not teach Connect anything on its own. If the reason should shape future work, it has to be written down as guidance, a standing instruction or a memory entry.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/approvals/",
        "https://connectbyjbrh.com/docs/autonomy/editing-before-approval/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/autonomy/standing-instructions/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "C0257",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/scopes/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/scopes/index.md",
      "title": "Autonomy scopes",
      "description": "Contact, endpoint, channel and workspace: the four levels an autonomy rule can be set at, and why the narrowest one always wins.",
      "summary": "An autonomy rule can be attached at four levels: one **contact**, one **endpoint** (a single mailbox or a single phone number), a whole **channel**, or the whole **workspace**. When more than one applies, the narrowest wins outright — it is not blended, averaged or intersected with the wider rules. That is what lets one strict exception survive a workspace-wide loosening.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/exceptions/",
        "https://connectbyjbrh.com/docs/autonomy/per-channel/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/troubleshooting/unexpected-autonomous-action/"
      ]
    },
    {
      "id": "C0262",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/spend-context/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/spend-context/index.md",
      "title": "Autonomy and spend",
      "description": "Permission and capacity are separate controls: how the plan allowance and the workspace budget limit what an autonomous channel actually does.",
      "summary": "Autonomy decides whether Connect **may** act; the plan allowance and the workspace budget decide how much it **can**. The two compose as an intersection, never as an override: an `autonomous` channel with a spent allowance sends nothing, and raising the mode does not buy capacity. A refusal for spend is recorded with that reason, distinctly from a compliance one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/explicit-gates/",
        "https://connectbyjbrh.com/docs/autonomy/autonomy-owner-tenant/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/account/usage/",
        "https://connectbyjbrh.com/docs/troubleshooting/allowance-reached/",
        "https://connectbyjbrh.com/docs/troubleshooting/budget-exhausted/"
      ]
    },
    {
      "id": "C0271",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/autonomy/standing-instructions/",
      "markdown": "https://connectbyjbrh.com/docs/autonomy/standing-instructions/index.md",
      "title": "Standing instructions",
      "description": "Durable directions a person gives Connect: where they apply, how to write one that can be acted on, and how they differ from memory and autonomy.",
      "summary": "A standing instruction is a durable direction — something a person tells Connect to do, or not to do, that keeps applying afterwards. It lives at one of the four tiers, alongside memory and the autonomy setting for the same scope. Directions change **what is said and done**; memory changes **what is known**; autonomy changes **what is permitted**.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/exceptions/",
        "https://connectbyjbrh.com/docs/autonomy/editing-before-approval/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/"
      ]
    },
    {
      "id": "L0043",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/",
      "markdown": "https://connectbyjbrh.com/docs/compare/index.md",
      "title": "Comparisons and concepts",
      "description": "The index of Connect's comparison pages: how it sits beside a CRM, a helpdesk or a call centre, and the internal distinctions people confuse.",
      "summary": "Two kinds of page live here. One kind puts Connect next to a software category you already buy — a CRM, a helpdesk, a call centre — and says which of the two you actually need, including what the other does better. The other kind separates two Connect ideas that are constantly confused, and says what breaks when somebody confuses them.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/docs/use-cases/",
        "https://connectbyjbrh.com/docs/compare/connect-vs-crm/",
        "https://connectbyjbrh.com/docs/compare/agent-vs-assistant/",
        "https://connectbyjbrh.com/docs/glossary/",
        "https://connectbyjbrh.com/docs/compare/knowledge-vs-memory/"
      ]
    },
    {
      "id": "L0052",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/agent-vs-assistant/",
      "markdown": "https://connectbyjbrh.com/docs/compare/agent-vs-assistant/index.md",
      "title": "Agent and assistant",
      "description": "The engine starts work on its own and is governed by autonomy. The Connect Assistant answers a person and has narrower rights than they do.",
      "summary": "Two things in Connect use a model, and they are not the same thing. The **engine** starts work because a message arrived: triage, grounding, drafting, deciding — governed by autonomy. The **Connect Assistant** starts work because you asked, in the app, and its rights are deliberately narrower than yours. Who initiates is the whole distinction, and everything else follows from it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/assistant/assistant-authority/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/compare/autonomy-vs-approval/",
        "https://connectbyjbrh.com/research/single-thinker/"
      ]
    },
    {
      "id": "L0060",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/autonomy-vs-approval/",
      "markdown": "https://connectbyjbrh.com/docs/compare/autonomy-vs-approval/index.md",
      "title": "Autonomy and approval",
      "description": "Autonomy is the standing rule for what Connect may do unasked. An approval is one held action waiting on a person. Changing one does not do the other's job.",
      "summary": "**Autonomy** is policy: a per-channel mode, set at one of four scopes, deciding what Connect may do without asking. An **approval** is an instance: one specific action held, waiting for a person to say yes or no. Approving something settles that action and changes no rule; changing the rule settles no action already waiting.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/scopes/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/compare/rules-vs-instructions/"
      ]
    },
    {
      "id": "L0048",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/connect-vs-call-centre/",
      "markdown": "https://connectbyjbrh.com/docs/compare/connect-vs-call-centre/index.md",
      "title": "Connect and a call centre",
      "description": "What answering every call the same way is worth, what it costs, and the three things on a live Connect line that a call centre still does and it does not.",
      "summary": "A call centre gives you people: judgement, empathy, and the ability to do whatever the situation needs. Connect gives you a line that always answers, says the same true things every time, and writes down what happened. Three limits are absolute on the live carrier today — no call recording, no completed transfer to a human, and a reply floor measured at 3.3 seconds — and none of them is negotiable by configuration.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/phone/live-transfer/",
        "https://connectbyjbrh.com/docs/phone/worker-capacity/",
        "https://connectbyjbrh.com/docs/compare/realtime-vs-turn-based-voice/"
      ]
    },
    {
      "id": "L0045",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/connect-vs-chatbot/",
      "markdown": "https://connectbyjbrh.com/docs/compare/connect-vs-chatbot/index.md",
      "title": "Connect and a chatbot",
      "description": "A chatbot answers the person in front of it. Connect works a business's whole mail across channels, remembers, acts, and records who decided what.",
      "summary": "A chatbot is bounded by one conversation on one surface, usually a website widget. Connect is bounded by a workspace: it reads email, WhatsApp, SMS and phone, resolves the sender to a person it already knows, decides under an autonomy rule what it may do, and records the decision. A chatbot that is well built and narrow will still beat it on one thing — instant, cheap answers to the same twenty questions.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/compare/agent-vs-assistant/",
        "https://connectbyjbrh.com/docs/relationships/cross-channel-identity/",
        "https://connectbyjbrh.com/docs/autonomy/modes/"
      ]
    },
    {
      "id": "L0044",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/connect-vs-crm/",
      "markdown": "https://connectbyjbrh.com/docs/compare/connect-vs-crm/index.md",
      "title": "Connect and a CRM",
      "description": "Connect keeps people, companies and deals as a by-product of work it does; a CRM keeps them as the thing itself. Which record belongs where.",
      "summary": "A CRM is a system of record you fill in. Connect is a worker that answers the mail and leaves records behind as a consequence. They overlap on people, companies and opportunities, and they are strongest at opposite ends: a CRM at reporting, customisation and being the agreed truth for a whole company; Connect at reading a message, deciding what to do and doing it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/compare/connect-vs-helpdesk/",
        "https://connectbyjbrh.com/developers/public-api/"
      ]
    },
    {
      "id": "L0049",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/connect-vs-email-marketing/",
      "markdown": "https://connectbyjbrh.com/docs/compare/connect-vs-email-marketing/index.md",
      "title": "Connect and email marketing tools",
      "description": "A broadcast tool sends one message to a list that agreed to hear from you. Connect writes one message to one person. The consent models are not the same.",
      "summary": "An email marketing platform exists to send one message to many people who opted in, and to measure the result. Connect writes one message to one person, from one of your own mailboxes, because something specific happened. Neither substitutes for the other, and the reason is consent: a marketing list and a business correspondent have agreed to different things, and mixing them damages both.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/unsubscribe/",
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/docs/email/outreach-email/",
        "https://connectbyjbrh.com/docs/compare/connect-vs-sales-engagement/"
      ]
    },
    {
      "id": "L0046",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/connect-vs-helpdesk/",
      "markdown": "https://connectbyjbrh.com/docs/compare/connect-vs-helpdesk/index.md",
      "title": "Connect and a helpdesk",
      "description": "A helpdesk organises work into tickets and queues. Connect tries to finish the work before a queue exists, and keeps cases for what it cannot.",
      "summary": "A helpdesk turns a message into a ticket so a human can be assigned it, measured on it and escalated through it. Connect starts from the opposite end: it drafts the answer, and only what it cannot finish becomes a **Support Case** or an item in **Needs You**. Where a helpdesk is far ahead is anything that depends on a team — routing, workload, service levels and the reporting a manager lives in.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/cases/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/support/",
        "https://connectbyjbrh.com/docs/compare/connect-vs-call-centre/",
        "https://connectbyjbrh.com/docs/sales/safe-sales/"
      ]
    },
    {
      "id": "L0050",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/connect-vs-sales-engagement/",
      "markdown": "https://connectbyjbrh.com/docs/compare/connect-vs-sales-engagement/index.md",
      "title": "Connect and sales engagement tools",
      "description": "Sequence tools optimise cadence and volume. Connect optimises whether the message should be sent at all, and refuses to guess an address or a price.",
      "summary": "A sales engagement tool is a cadence machine: contacts in, a sequence of touches out, activity measured per representative. Connect approaches the same funnel from the evidence end — it researches, attaches evidence to every claim, refuses to generate an address it cannot find, and escalates commercial questions it cannot ground. On raw throughput per rep, the cadence machine wins.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/prospects/prospect-counts/",
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/compare/connect-vs-email-marketing/"
      ]
    },
    {
      "id": "L0047",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/connect-vs-workflow-automation/",
      "markdown": "https://connectbyjbrh.com/docs/compare/connect-vs-workflow-automation/index.md",
      "title": "Connect and workflow automation",
      "description": "Automation runs a path you drew in advance. Connect decides what a message needs. Where each belongs, and what happens when you pick the wrong one.",
      "summary": "Workflow automation executes a graph you drew: this trigger, that condition, this action, every time. Connect reads something written by a human and works out what it needs. Use automation wherever the correct response is knowable in advance — it will be faster, cheaper and exactly repeatable. Use Connect where the input is prose and the right answer depends on who sent it and what happened before.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/compare/rules-vs-instructions/",
        "https://connectbyjbrh.com/docs/autonomy/standing-instructions/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/docs/compare/connect-vs-crm/"
      ]
    },
    {
      "id": "L0051",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/digital-employee-vs-ai-agent/",
      "markdown": "https://connectbyjbrh.com/docs/compare/digital-employee-vs-ai-agent/index.md",
      "title": "Digital employee and AI agent",
      "description": "An AI agent is a technical pattern. A Digital Business Employee is a commitment to permanence, responsibility and oversight. Confusing them costs money.",
      "summary": "**AI agent** describes a mechanism: a model given tools, run in a loop until a task is done. **Digital Business Employee** describes an arrangement: one worker that holds a job permanently, remembers the business, follows through on commitments and can be held to account for what it did. Connect is built as the second, using the first. The words are not interchangeable and the difference shows up in what you buy.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/ai-agent/",
        "https://connectbyjbrh.com/docs/technology/digital-employee/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/compare/agent-vs-assistant/",
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/glossary/digital-employee/"
      ]
    },
    {
      "id": "L0065",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/draft-vs-send/",
      "markdown": "https://connectbyjbrh.com/docs/compare/draft-vs-send/index.md",
      "title": "Drafting and sending",
      "description": "Writing a reply and sending it are two acts with very different consequences. Why the approval gate sits exactly between them and nowhere else.",
      "summary": "A draft is private, free and reversible. A send leaves the business, cannot be recalled and becomes something the recipient acts on. Those are different enough that they deserve different permissions, which is why autonomy is a rule about sending rather than a rule about working, and why Connect can be fully useful in a workspace where it is not allowed to send anything at all.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/compare/autonomy-vs-approval/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "L0064",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/evidence-vs-inference/",
      "markdown": "https://connectbyjbrh.com/docs/compare/evidence-vs-inference/index.md",
      "title": "Evidence and inference",
      "description": "Something observed and something concluded are not the same claim. Where Connect draws the line, and what each kind of statement lets you act on.",
      "summary": "Evidence is something Connect observed and can point at: a message that arrived, a page that was read, a value in a record. An inference is a conclusion drawn from evidence. Connect is allowed to infer, and is not allowed to present an inference as an observation — which is why a prospect has a source you can open and why an email address is never invented to fill a gap.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/compare/record-vs-transcript/",
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/assistant/evidence-and-citation/",
        "https://connectbyjbrh.com/docs/assistant/uncertainty/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/"
      ]
    },
    {
      "id": "L0059",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/gmail-api-vs-imap/",
      "markdown": "https://connectbyjbrh.com/docs/compare/gmail-api-vs-imap/index.md",
      "title": "Gmail API and IMAP",
      "description": "Two ways to connect a mailbox to Connect. One knows about labels and history; the other works with any mail server in the world. What each costs you.",
      "summary": "Connecting a Gmail mailbox over Google OAuth and the Gmail API gives you history-based incremental sync, labels and write-back, and tokens that refresh rather than a stored password. IMAP/SMTP works with any server at all, which is the whole point of it. Downstream, neither choice changes anything: both land in the same canonical records.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/connect-gmail/",
        "https://connectbyjbrh.com/docs/email/connect-imap-smtp/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/email/imap-cursor/",
        "https://connectbyjbrh.com/research/cursor-loss/"
      ]
    },
    {
      "id": "L0054",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/knowledge-vs-memory/",
      "markdown": "https://connectbyjbrh.com/docs/compare/knowledge-vs-memory/index.md",
      "title": "Knowledge and memory",
      "description": "Knowledge is what you told Connect is true about your business. Memory is what it worked out about a person. Putting a fact in the wrong one has consequences.",
      "summary": "**Knowledge** is supplied truth: sources a workspace provides that answers must be grounded in, with **Facts** extracted from them. **Memory** is learned truth: what Connect has worked out or been told about a business and its people, at four tiers. A price belongs in Knowledge, because the refusal rule checks Knowledge. A customer's preference belongs in memory, because it is about them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/knowledge/knowledge-vs-fact/",
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/compare/memory-vs-context/"
      ]
    },
    {
      "id": "L0061",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/llms-txt-vs-sitemap/",
      "markdown": "https://connectbyjbrh.com/docs/compare/llms-txt-vs-sitemap/index.md",
      "title": "llms.txt and a sitemap",
      "description": "A sitemap is a protocol search engines actually read. llms.txt is a community proposal. Publishing one instead of the other costs you discovery.",
      "summary": "A sitemap is an established discovery protocol that search crawlers read and act on. `llms.txt` is a community proposal — not an IETF or W3C standard — and Google has said no Search system reads it. Connect publishes both, with the sitemap as the mechanism and `llms.txt` as a supplemental map, never as a substitute for HTML, robots or sitemaps.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/llms-txt/",
        "https://connectbyjbrh.com/docs/technology/sitemap/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/developers/crawler-policy/",
        "https://connectbyjbrh.com/docs/technology/robots-txt/",
        "https://connectbyjbrh.com/developers/llms-txt-here/"
      ]
    },
    {
      "id": "L0056",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/mcp-vs-a2a/",
      "markdown": "https://connectbyjbrh.com/docs/compare/mcp-vs-a2a/index.md",
      "title": "MCP and A2A",
      "description": "MCP hands tools and data to a model. A2A lets one agent give another agent a task. Connect publishes both, and they answer different questions.",
      "summary": "MCP is how a model client reaches tools and data: it calls a server, the server does something, the result comes back inside the client's own reasoning. A2A is how two agents deal with each other as peers: one delegates a task, the other owns it and reports. Connect publishes an MCP server and an A2A agent card, and choosing wrongly produces an integration that fights its own shape.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/mcp/",
        "https://connectbyjbrh.com/docs/protocols/a2a/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/agent-card/",
        "https://connectbyjbrh.com/docs/compare/mcp-vs-api/"
      ]
    },
    {
      "id": "L0057",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/mcp-vs-api/",
      "markdown": "https://connectbyjbrh.com/docs/compare/mcp-vs-api/index.md",
      "title": "MCP and a plain API",
      "description": "MCP exists so a model can discover what it may call at runtime. An HTTP API exists so your code can call exactly what it already knows it wants.",
      "summary": "Use the public API when your software knows what it wants: it has pagination, idempotency, versioning, webhooks and an OpenAPI description you can generate a client from. Use MCP when a *model* has to decide at runtime what to call, because MCP's contribution is discovery and descriptions written to be read by a model rather than by a developer.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/mcp/",
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/openapi-description/",
        "https://connectbyjbrh.com/docs/compare/mcp-vs-a2a/"
      ]
    },
    {
      "id": "L0053",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/memory-vs-context/",
      "markdown": "https://connectbyjbrh.com/docs/compare/memory-vs-context/index.md",
      "title": "Memory and context window",
      "description": "A context window is what the model can see during one call. Memory is what survives it. Enlarging the first will never produce the second.",
      "summary": "The context window is the model's working set for a single call: everything assembled for that one request, gone when it returns. Memory is stored, tiered and editable, and it is what makes the next call know anything. Memory is *selected into* the context window each time, under a budget — which is why remembering more does not mean sending more.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/technology/context-window/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/compare/knowledge-vs-memory/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/docs/memory/deleting/"
      ]
    },
    {
      "id": "L0063",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/owner-vs-tenant-concept/",
      "markdown": "https://connectbyjbrh.com/docs/compare/owner-vs-tenant-concept/index.md",
      "title": "Operator and customer, as a design idea",
      "description": "One codebase serving the platform operator and its customers: what the pattern costs on every change, and the class of defect it makes impossible.",
      "summary": "Connect runs one implementation for two audiences. The operator's workspace runs the platform; a customer workspace uses it. They share the code, the data model and the isolation, and differ only in which routes each may call and what a plan allows. The design decision is that a capability has one body and two doors — never two implementations that drift apart.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/research/closed-by-default-facade/",
        "https://connectbyjbrh.com/docs/compare/workspace-vs-account/"
      ]
    },
    {
      "id": "L0070",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/public-vs-private-docs/",
      "markdown": "https://connectbyjbrh.com/docs/compare/public-vs-private-docs/index.md",
      "title": "Public documentation and private help",
      "description": "Some of what Connect knows is written for anybody to read, and some can only be answered inside your workspace. The line between them, and why it is drawn there.",
      "summary": "Public documentation describes what Connect is and how it behaves: capabilities, their status, protocols, failure modes. It contains no customer, no message and no key, which is exactly why it can be published. Private help answers questions about your workspace — your records, your settings, your mailboxes — and that can only happen behind sign-in, because the answer is your data.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/developers/",
        "https://connectbyjbrh.com/developers/crawler-policy/",
        "https://connectbyjbrh.com/docs/security/public-vs-private/",
        "https://connectbyjbrh.com/research/documentation-as-a-build/",
        "https://connectbyjbrh.com/research/writing-for-people-and-machines/"
      ]
    },
    {
      "id": "L0058",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/realtime-vs-turn-based-voice/",
      "markdown": "https://connectbyjbrh.com/docs/compare/realtime-vs-turn-based-voice/index.md",
      "title": "Realtime and turn-based voice",
      "description": "Two voice engines with different physics: one speaks straight from the model, the other produces a sentence code can inspect before the caller hears it.",
      "summary": "The turn-based engine runs on the carrier path: the caller's turn becomes text, the model answers in text, and the text is spoken — so code sits between the answer and the caller. The realtime engine is speech-to-speech, opted into per workspace, and nothing sits in that gap. You are trading a checkpoint for immediacy, and that is the decision.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/realtime-engine/",
        "https://connectbyjbrh.com/docs/phone/turn-based-engine/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/docs/compare/rules-vs-instructions/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/"
      ]
    },
    {
      "id": "L0066",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/record-vs-transcript/",
      "markdown": "https://connectbyjbrh.com/docs/compare/record-vs-transcript/index.md",
      "title": "A record and a transcript",
      "description": "A transcript says what was said once. A record says what is true across everything that happened. Each answers questions the other cannot.",
      "summary": "A transcript is the words of one exchange, in order. A record is the structured thing that exchange belongs to — a person, a company, a deal, a case — carrying fields, links and a history. Disputes about wording need the transcript. Questions about a relationship need the record. Keeping only one of them is how a business loses either its evidence or its memory.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/transcript/",
        "https://connectbyjbrh.com/docs/phone/call-summary/",
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/compare/evidence-vs-inference/",
        "https://connectbyjbrh.com/docs/security/data-retention/",
        "https://connectbyjbrh.com/docs/relationships/"
      ]
    },
    {
      "id": "L0055",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/rules-vs-instructions/",
      "markdown": "https://connectbyjbrh.com/docs/compare/rules-vs-instructions/index.md",
      "title": "Rules and instructions",
      "description": "A rule is enforced in code whatever the model concludes. An instruction is text the model is asked to follow. One prevents; the other, at best, detects.",
      "summary": "A **rule** is a check in code: it runs before the action, and nothing the model decides can talk it out of running. An **instruction** is language handed to the model — a standing instruction, a behaviour setting, a speaking guide — and it is followed the way a person follows a briefing. Write a hard requirement as an instruction and you have bought detection, not prevention.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/standing-instructions/",
        "https://connectbyjbrh.com/docs/autonomy/explicit-gates/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/compare/connect-vs-workflow-automation/",
        "https://connectbyjbrh.com/docs/phone/speaking-guide/"
      ]
    },
    {
      "id": "L0067",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/scheduled-vs-triggered/",
      "markdown": "https://connectbyjbrh.com/docs/compare/scheduled-vs-triggered/index.md",
      "title": "Scheduled work and triggered work",
      "description": "Work that starts because something happened, and work that starts because a time arrived. Two clocks in one system, and what happens where they meet.",
      "summary": "Triggered work begins because something arrived — a message, a call, a webhook — and its job is to respond. Scheduled work begins because a time came round, and its job is to keep a promise made earlier. The difference that matters is age: a trigger acts on something current, while a scheduled action was decided in the past and has to be re-checked against the present before it runs.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/due-time/",
        "https://connectbyjbrh.com/docs/follow-ups/overdue/",
        "https://connectbyjbrh.com/docs/follow-ups/execution/",
        "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-executed/",
        "https://connectbyjbrh.com/docs/workflows/execute-follow-up/",
        "https://connectbyjbrh.com/research/single-thinker/"
      ]
    },
    {
      "id": "L0062",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/structured-data-vs-content/",
      "markdown": "https://connectbyjbrh.com/docs/compare/structured-data-vs-content/index.md",
      "title": "Structured data and content",
      "description": "Markup describes a page; it is not a second page. When the two disagree the markup is the thing that is wrong, and the cost is not theoretical.",
      "summary": "Structured data is a machine-readable description of what a page already says. Content is what a person can read. The rule that keeps both useful is that markup must describe what is visible — mark up a fact that is not on the page and you have published a claim nobody can check, which is both an eligibility problem and a credibility one.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/json-ld/",
        "https://connectbyjbrh.com/docs/protocols/schema-org/",
        "https://connectbyjbrh.com/docs/compare/",
        "https://connectbyjbrh.com/docs/compare/llms-txt-vs-sitemap/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/research/writing-for-people-and-machines/"
      ]
    },
    {
      "id": "L0068",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/suppression-vs-block/",
      "markdown": "https://connectbyjbrh.com/docs/compare/suppression-vs-block/index.md",
      "title": "Suppression and blocking",
      "description": "Two ways of telling Connect not to contact somebody, enforced in different places. Which one you need depends on whether you mean an address or a relationship.",
      "summary": "Suppression is a fact about one address or number: it will not be written to, and the refusal happens at the boundary where messages leave. A block is an instruction about behaviour: stop pursuing this company, this topic, this line of work. One is enforced by the send path, the other by the reasoning. Using the wrong one is how a gap appears.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/email/unsubscribe/",
        "https://connectbyjbrh.com/docs/sms/sms-suppression/",
        "https://connectbyjbrh.com/docs/troubleshooting/suppressed-recipient/",
        "https://connectbyjbrh.com/docs/how-to/clean-up-your-suppression-list/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "L0069",
      "kind": "comparison",
      "url": "https://connectbyjbrh.com/docs/compare/workspace-vs-account/",
      "markdown": "https://connectbyjbrh.com/docs/compare/workspace-vs-account/index.md",
      "title": "Workspace and account",
      "description": "Your account is who you are; a workspace is where the business lives. Which one owns what, and what happens when a person and a business part company.",
      "summary": "An account is a person: one identity, signed in with Google. A workspace is a business: the isolation root that every record belongs to. You reach a workspace through your account, and the records you see there belong to the workspace, not to you. That is why a colleague leaving takes nothing with them, and why nothing you do in one workspace is visible in another.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/account/workspace-resolution/",
        "https://connectbyjbrh.com/docs/account/google-sign-in/",
        "https://connectbyjbrh.com/docs/account/identity-binding/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/compare/owner-vs-tenant-concept/"
      ]
    },
    {
      "id": "C0059",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/email/",
      "markdown": "https://connectbyjbrh.com/docs/email/index.md",
      "title": "Email in Connect",
      "description": "The email channel end to end: the providers you can connect, what a mailbox owns, how a provider message becomes canonical, and where every other email page sits.",
      "summary": "Connect reads a workspace's mail through the mailboxes you connect — Gmail, a Microsoft mailbox over Graph, or any IMAP and SMTP server — copies each message into canonical records the engine reads, decides what it needs, and drafts a reply that goes out under the autonomy rule for that mailbox. Several mailboxes run at once, each with its own role, signature, autonomy and health.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/email/message-canonicalisation/",
        "https://connectbyjbrh.com/docs/email/sending/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/technology/"
      ]
    },
    {
      "id": "C0088",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/approve-reject/",
      "markdown": "https://connectbyjbrh.com/docs/email/approve-reject/index.md",
      "title": "Approving and rejecting a draft",
      "description": "The two decisions on a waiting reply, what each one records, why a rejection is not a lesson, and who is accountable afterwards.",
      "summary": "Approving runs the send immediately, through the same boundary a person's own send uses, and records who released it. Rejecting stops that message, records the decision against the thread, and prevents the engine from immediately producing the same reply again. Neither decision changes what Connect knows — that takes a separate, deliberate act.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/email/edit-draft/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/authority-separation/"
      ]
    },
    {
      "id": "C0081",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/attachments/",
      "markdown": "https://connectbyjbrh.com/docs/email/attachments/index.md",
      "title": "Email attachments",
      "description": "What Connect records about a document attached to an email, what it deliberately does not keep, and what a reply looks like when the enclosure was the message.",
      "summary": "The MIME parser records each enclosure's name, declared media type and byte size against the canonical message, and that list is shown beside the body. The bytes themselves are not kept, so an enclosure cannot be opened from inside Connect and its contents do not ground a reply. Putting a document into the workspace is a separate, deliberate act.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/html-email/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/email/draft-generation/",
        "https://connectbyjbrh.com/docs/email/message-canonicalisation/",
        "https://connectbyjbrh.com/research/files-through-one-service/"
      ]
    },
    {
      "id": "C0083",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/blocking/",
      "markdown": "https://connectbyjbrh.com/docs/email/blocking/index.md",
      "title": "Blocking a sender",
      "description": "Blocking a sender writes a memory row tagged block:email, not a column — which is why it holds across channels and across future conversations.",
      "summary": "A block is a `connect_memory` row against the contact, carrying `block:<channel>` **in its tag list**. It is deliberately not a column on the contact. Because `directives()` reads only tags, it is found wherever that person is considered — a different channel, a different thread, a conversation that has not happened yet — and it is undone by forgetting the row.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/email/dnc/",
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/email/triage/",
        "https://connectbyjbrh.com/research/structured-business-memory/"
      ]
    },
    {
      "id": "C0099",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/bounces/",
      "markdown": "https://connectbyjbrh.com/docs/email/bounces/index.md",
      "title": "Bounces",
      "description": "What Connect does when a message comes back undelivered: permanent against temporary failure, which one takes an address out of use, and how a person clears it.",
      "summary": "A bounce arrives after a send has already been accepted, so a message can be genuinely sent and still fail to arrive — the two are separate records. A permanent failure ends with the address suppressed, so nothing further is sent to it; a temporary failure is a result on that one message and does not condemn the address. Clearing a suppression is a person's decision.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/email/complaints/",
        "https://connectbyjbrh.com/docs/email/deliverability/",
        "https://connectbyjbrh.com/docs/troubleshooting/send-failed/",
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/"
      ]
    },
    {
      "id": "C0075",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/burst-handling/",
      "markdown": "https://connectbyjbrh.com/docs/email/burst-handling/index.md",
      "title": "Large batches and bursts",
      "description": "What happens when hundreds of messages arrive at once: the two different orderings involved, why screen cost stays flat, and what a burst can genuinely distort.",
      "summary": "A burst is fetched in cursor order and attended to in priority order, and those are deliberately not the same thing. Nothing is skipped: the read position advances only past work that was accepted, so a burst larger than the day's allowance is held rather than trimmed. What a burst changes is which conversation is looked at first, not whether any is looked at.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/inbox-sync/",
        "https://connectbyjbrh.com/docs/email/triage/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/research/n-plus-one-that-grows/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/"
      ]
    },
    {
      "id": "C0098",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/complaints/",
      "markdown": "https://connectbyjbrh.com/docs/email/complaints/index.md",
      "title": "Spam complaints",
      "description": "What a spam complaint changes in Connect: escalation instead of a reply, a suppressed address at the provider, and a reputation state that can stop outreach.",
      "summary": "A complaint is never answered automatically. The intent is hard-escalated to a person whatever the autonomy setting says, and the address usually ends up on the sending provider's suppression list, which refuses it thereafter. Separately, the provider's own complaint rate feeds a reputation state that can hold or stop outreach entirely.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/email/bounces/",
        "https://connectbyjbrh.com/docs/email/deliverability/",
        "https://connectbyjbrh.com/docs/email/unsubscribe/",
        "https://connectbyjbrh.com/docs/email/outreach-email/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/"
      ]
    },
    {
      "id": "C0063",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/connect-gmail/",
      "markdown": "https://connectbyjbrh.com/docs/email/connect-gmail/index.md",
      "title": "Connecting Gmail",
      "description": "Connecting a Google mailbox: the consent path, why signing in and connecting a mailbox are different acts, and what the mailbox row holds afterwards.",
      "summary": "You connect Gmail by adding a mailbox and choosing Google, which sends you to Google's own consent screen. Google returns tokens, Connect seals them into the mailbox's `config`, and the adapter then reads and sends over the Gmail API. The Owner and a customer take the same path through the same console; the Owner's flow falls back to the platform's own Google client.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/gmail-scopes/",
        "https://connectbyjbrh.com/docs/email/gmail-history-sync/",
        "https://connectbyjbrh.com/docs/email/gmail-writeback/",
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/technology/oauth/",
        "https://connectbyjbrh.com/docs/technology/gmail-api/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/"
      ]
    },
    {
      "id": "C0065",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/connect-imap-smtp/",
      "markdown": "https://connectbyjbrh.com/docs/email/connect-imap-smtp/index.md",
      "title": "Connecting an IMAP and SMTP server",
      "description": "Connecting a mailbox on your own mail server: the two halves of the connection, what a saved connection proves, and the ladder of checks that proves the rest.",
      "summary": "Any IMAP and SMTP server can be a Connect mailbox. You supply the incoming and outgoing server details and the credentials; `providers.build()` constructs the adapter from the mailbox's `transport` and `config`, and everything after that — canonicalisation, triage, drafting, autonomy, audit — is identical to Gmail. A saved connection is a beginning, not a verdict.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/imap-cursor/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/technology/imap/",
        "https://connectbyjbrh.com/docs/technology/smtp/"
      ]
    },
    {
      "id": "C0078",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/contact-resolution/",
      "markdown": "https://connectbyjbrh.com/docs/email/contact-resolution/index.md",
      "title": "Resolving a sender to a person",
      "description": "How an email address becomes an identity, an identity a person and a person part of a company — and what happens the first time a stranger writes to you.",
      "summary": "An address is an **identity**: one address on one channel. An identity resolves to a **person**, and a person may belong to a **company**. An unknown sender is resolved into a new person rather than left as an anonymous string, which is what lets their second message, their phone call and their WhatsApp reply all arrive at the same history.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/email/threads/",
        "https://connectbyjbrh.com/docs/email/message-canonicalisation/",
        "https://connectbyjbrh.com/docs/email/dnc/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/"
      ]
    },
    {
      "id": "C0094",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/daily-allowance/",
      "markdown": "https://connectbyjbrh.com/docs/email/daily-allowance/index.md",
      "title": "The daily email allowance",
      "description": "What the daily email allowance counts, what happens when it is spent, and why the read cursor deliberately stays where it is on a refusal.",
      "summary": "A customer workspace has daily counters — messages ingested, messages sent — reserved before the work is done rather than counted after it. When one is spent the work is held rather than dropped: a reply waits, and unread mail stays unread at the provider because the read cursor is deliberately not advanced. The Owner has no plan and no allowance.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/email/sending/",
        "https://connectbyjbrh.com/docs/email/inbox-sync/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/research/cursor-loss/"
      ]
    },
    {
      "id": "C0102",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/deliverability/",
      "markdown": "https://connectbyjbrh.com/docs/email/deliverability/index.md",
      "title": "Deliverability",
      "description": "What Connect controls about whether mail arrives, what belongs to your own sending domain and its history, and the order worth fixing things in.",
      "summary": "Connect sends through your own mailbox with your own provider, so the reputation being judged is your domain's, not a shared pool's. What Connect controls is discipline: one send boundary, evidence before a message is reported as sent, one compliance check before outreach, and no invented recipients. Whether a particular message reaches an inbox is never promised, here or anywhere.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/sending/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/email/bounces/",
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/"
      ]
    },
    {
      "id": "C0101",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/dnc/",
      "markdown": "https://connectbyjbrh.com/docs/email/dnc/index.md",
      "title": "Do not contact",
      "description": "The strongest entry in Connect's compliance record: what a do-not-contact instruction stops, how it is set, and why the Connect Assistant cannot lift one.",
      "summary": "A do-not-contact instruction is the strongest thing in the compliance record. It is checked with every other compliance entry in the one place asked before outreach goes anywhere, it refuses a held draft at the moment somebody approves it, and it is not lifted casually. The Connect Assistant cannot lift one at all — that path does not exist for it, on purpose.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/email/unsubscribe/",
        "https://connectbyjbrh.com/docs/email/blocking/",
        "https://connectbyjbrh.com/docs/prospects/compliance-check/",
        "https://connectbyjbrh.com/research/authority-separation/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/"
      ]
    },
    {
      "id": "C0085",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/draft-generation/",
      "markdown": "https://connectbyjbrh.com/docs/email/draft-generation/index.md",
      "title": "How a reply is drafted",
      "description": "What goes into a reply before a word of it is written: the thread, grounded knowledge, memory at four tiers, the rules — and the answers Connect declines to give.",
      "summary": "The agent loop in `agent.py` triages the thread, gathers grounding from Knowledge, resolves memory narrowest-first across the four tiers, applies the workspace's rules, and only then writes. Autonomy decides separately whether the result may leave. A reply that would need a fact nobody supplied is refused rather than invented.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/email/guidance/",
        "https://connectbyjbrh.com/research/grounding-without-a-vector-database/"
      ]
    },
    {
      "id": "C0087",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/edit-draft/",
      "markdown": "https://connectbyjbrh.com/docs/email/edit-draft/index.md",
      "title": "Editing a draft before it goes",
      "description": "Changing a reply before it goes out: which fields are editable, why the sending mailbox is not, and what your edit does to the record.",
      "summary": "Subject, body and recipients are yours to change. The mailbox the reply will leave from is not, because that was settled by the mailbox's role and the thread it belongs to. What you leave on the screen is exactly what is sent — Connect does not rewrite over an edit, and does not quietly regenerate one after you have touched it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/email/approve-reject/",
        "https://connectbyjbrh.com/docs/email/regenerate-draft/",
        "https://connectbyjbrh.com/docs/email/mailbox-roles/",
        "https://connectbyjbrh.com/docs/email/guidance/"
      ]
    },
    {
      "id": "C0095",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/email-follow-up/",
      "markdown": "https://connectbyjbrh.com/docs/email/email-follow-up/index.md",
      "title": "Following up by email",
      "description": "Creating a dated commitment to write again, what is drafted when it falls due, and the reference rule that stops the same follow-up existing twice.",
      "summary": "A follow-up is one row per intention, hung off the person rather than the conversation, carrying the channel, the reason in words, when it is due, who asked for it and how many attempts are allowed. When it comes due the ordinary drafting and autonomy path runs — a follow-up is not a second sender. The same reference schedules it once, however many times the evidence arrives.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/email/sending/",
        "https://connectbyjbrh.com/docs/email/draft-generation/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/email/outreach-email/"
      ]
    },
    {
      "id": "C0103",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/email-owner-tenant/",
      "markdown": "https://connectbyjbrh.com/docs/email/email-owner-tenant/index.md",
      "title": "Email for the Owner and for a customer",
      "description": "Email runs on one implementation behind two doors. What the plan changes for a customer, what is identical, and where the asymmetry has actually gone wrong before.",
      "summary": "The operator's own workspace and a customer's run the same mail code. One console sits over one policy, and each audience's router adds a route rather than a second implementation. What differs is the allowance a plan sets, the Google client an operator's connection falls back to, and the operator-only parts of the usage ledger. The mail behaviour itself does not differ.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/email/connect-gmail/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/research/invisible-not-missing/"
      ]
    },
    {
      "id": "C0092",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/failed-send/",
      "markdown": "https://connectbyjbrh.com/docs/email/failed-send/index.md",
      "title": "A send that failed",
      "description": "A message that did not go: the failure classes, which ones are worth another attempt, what Connect completed anyway, and where the failure appears.",
      "summary": "A failed send is one the provider refused, or one a check refused before the provider saw it. Nothing was delivered. The reason is recorded against the thread and escalated into Needs You, and whether another attempt makes sense depends entirely on which of four classes the failure belongs to.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/sending/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/email/bounces/",
        "https://connectbyjbrh.com/docs/email/connect-gmail/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "C0073",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/gmail-history-sync/",
      "markdown": "https://connectbyjbrh.com/docs/email/gmail-history-sync/index.md",
      "title": "Gmail history sync",
      "description": "How a Gmail mailbox resumes by history ID instead of re-reading, what a gap in that history means, and what has to happen when the provider can no longer answer.",
      "summary": "Gmail keeps a change log, and each position in it has a history ID. Connect stores the last one it processed and asks Gmail what changed since — so catching up after an hour, or after a day, costs the changes rather than the mailbox. When the stored position is too old for Gmail to answer from, the incremental question can no longer be asked and a new starting point has to be established.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/inbox-sync/",
        "https://connectbyjbrh.com/docs/email/imap-cursor/",
        "https://connectbyjbrh.com/docs/email/connect-gmail/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/technology/gmail-api/",
        "https://connectbyjbrh.com/research/cursor-loss/"
      ]
    },
    {
      "id": "C0064",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/gmail-scopes/",
      "markdown": "https://connectbyjbrh.com/docs/email/gmail-scopes/index.md",
      "title": "Gmail OAuth scopes and why each is asked for",
      "description": "The permissions a Google mailbox connection asks for, the capability behind each one, and precisely what stops working when one is withheld or withdrawn.",
      "summary": "Each permission Connect asks Google for exists because one capability cannot work without it: reading mail, sending it, writing read state and labels back, and identifying which account was connected. Google's consent screen at the moment you connect is the authority on what was granted; the set Connect requests is held in `google_scopes.py` rather than assembled per workspace.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/connect-gmail/",
        "https://connectbyjbrh.com/docs/email/gmail-writeback/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/technology/oauth/",
        "https://connectbyjbrh.com/docs/technology/gmail-api/",
        "https://connectbyjbrh.com/docs/protocols/oauth-for-agents/"
      ]
    },
    {
      "id": "C0093",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/gmail-writeback/",
      "markdown": "https://connectbyjbrh.com/docs/email/gmail-writeback/index.md",
      "title": "Writing back to Gmail",
      "description": "After Connect answers a Gmail thread it labels it and marks it read in the customer's own mailbox — and a failure to do so never blocks the reply.",
      "summary": "When a reply leaves a Gmail mailbox, Connect labels the whole thread **Connect by JBRH** and removes its unread state, in one call, so people sharing that inbox can see it is handled without opening Connect. It runs after the send is committed and never raises: a thread that could not be labelled belongs to a customer who has still been answered.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/gmail-scopes/",
        "https://connectbyjbrh.com/docs/email/connect-gmail/",
        "https://connectbyjbrh.com/docs/email/sending/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/email/microsoft-graph/"
      ]
    },
    {
      "id": "C0084",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/guidance/",
      "markdown": "https://connectbyjbrh.com/docs/email/guidance/index.md",
      "title": "Giving guidance on a thread",
      "description": "The one-line direction you give on a thread: where it is stored, how far it reaches, and when it should be a standing instruction instead.",
      "summary": "Guidance is a short direction attached where the work happens — \"quote delivery at four weeks, not two\", \"do not discuss the renewal until legal have replied\". Written against the contact or the thread it becomes memory at that tier and reaches every later piece of work about that person; typed into a single draft it changes that draft only.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/email/draft-generation/",
        "https://connectbyjbrh.com/docs/email/approve-reject/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/"
      ]
    },
    {
      "id": "C0086",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/held-drafts/",
      "markdown": "https://connectbyjbrh.com/docs/email/held-drafts/index.md",
      "title": "Held drafts",
      "description": "What happens to a reply Connect has written but is not allowed to send yet: where it waits, what the recipient sees, and how it is released.",
      "summary": "A held draft is a finished reply that Connect wrote and did not send, because the autonomy rule for that channel says a person decides. It waits in Needs You with the message it answers, the recipient sees nothing at all, and it goes out unchanged the moment somebody approves it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/email/approve-reject/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/email/regenerate-draft/"
      ]
    },
    {
      "id": "C0079",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/html-email/",
      "markdown": "https://connectbyjbrh.com/docs/email/html-email/index.md",
      "title": "Rendering HTML email safely",
      "description": "How Connect renders an HTML message: what the sanitiser removes, why remote images never load from the sender, and what you read instead.",
      "summary": "Connect renders HTML through `mail_render.py`, which strips the markup that could act — script, embedded objects, event handlers, styling that escapes the message frame — and rewrites every remote image to load through a proxy. What you read is the sender's words and layout, not the sender's code, and opening a message does not report back to whoever sent it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/remote-images/",
        "https://connectbyjbrh.com/docs/email/attachments/",
        "https://connectbyjbrh.com/docs/email/message-canonicalisation/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/",
        "https://connectbyjbrh.com/docs/technology/"
      ]
    },
    {
      "id": "C0074",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/imap-cursor/",
      "markdown": "https://connectbyjbrh.com/docs/email/imap-cursor/index.md",
      "title": "IMAP UID and cursor lifecycle",
      "description": "The UID cursor on an IMAP mailbox: what it records, the only outcome that advances it, and the two server-side events that can invalidate it entirely.",
      "summary": "An IMAP mailbox has no change log, so Connect resumes from a UID — the position in the folder up to which everything has been dealt with. It advances only for work that was actually processed. A refusal, a failure or a partial pass leaves it where it was, which means the same messages are offered again rather than skipped.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/connect-imap-smtp/",
        "https://connectbyjbrh.com/docs/email/gmail-history-sync/",
        "https://connectbyjbrh.com/docs/email/inbox-sync/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/technology/imap/",
        "https://connectbyjbrh.com/research/cursor-loss/"
      ]
    },
    {
      "id": "C0072",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/inbox-sync/",
      "markdown": "https://connectbyjbrh.com/docs/email/inbox-sync/index.md",
      "title": "Syncing an inbox",
      "description": "How a mailbox is read: what the first pass does that no later pass repeats, what each pass fetches, and what bounds a single pass rather than letting it run away.",
      "summary": "The first pass on a new mailbox has no position to resume from, so it reads what the provider offers and builds the workspace's starting history. Every later pass resumes from where the last one stopped, fetches what is new, and hands it to the bridge. A pass is bounded by the workspace's daily allowance, and reaching that bound holds work rather than dropping it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/gmail-history-sync/",
        "https://connectbyjbrh.com/docs/email/imap-cursor/",
        "https://connectbyjbrh.com/docs/email/burst-handling/",
        "https://connectbyjbrh.com/docs/email/message-canonicalisation/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/"
      ]
    },
    {
      "id": "C0068",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/mailbox-autonomy/",
      "markdown": "https://connectbyjbrh.com/docs/email/mailbox-autonomy/index.md",
      "title": "Autonomy on one mailbox",
      "description": "Giving one address its own rule about what Connect may do: how the endpoint scope resolves against the channel and the workspace, and when it is the right tool.",
      "summary": "Autonomy is a field on the mailbox row as well as a channel-wide setting, and a mailbox is the *endpoint* scope. Scopes resolve narrowest-first — contact, then endpoint, then channel, then workspace — so a rule set on one address overrides the channel's for that address only. It is the tool for making one inbox stricter without slowing the others down.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/email/blocking/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "C0071",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/mailbox-disconnect/",
      "markdown": "https://connectbyjbrh.com/docs/email/mailbox-disconnect/index.md",
      "title": "Disconnecting a mailbox",
      "description": "Removing a mailbox from a workspace: exactly what stops, exactly what is kept, what happens to work in flight, and the safer order to do it in.",
      "summary": "Disconnecting ends the connection, not the history. New mail stops arriving at that address and nothing more can be sent from it; the threads, messages, contacts, memory and audit entries it produced are canonical workspace records and remain exactly as they were. Anything held for that mailbox stops being sendable, which is the part worth planning for.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/email/primary-mailbox/",
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/email/connect-gmail/",
        "https://connectbyjbrh.com/docs/account/"
      ]
    },
    {
      "id": "C0069",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/mailbox-health/",
      "markdown": "https://connectbyjbrh.com/docs/email/mailbox-health/index.md",
      "title": "Mailbox health",
      "description": "Why a mailbox that authenticates can still be failing, what the health verdicts on the row are derived from, and which action each situation actually calls for.",
      "summary": "\"Connected\" says a credential was accepted. Health says what the mailbox has actually been doing — whether mail arrived, whether sends were acknowledged, whether work was refused. The verdicts on a mailbox row are derived from those events rather than from its configuration, which is why a row can read connected and unhealthy at the same time without either being wrong.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/quiet-mailbox/",
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/"
      ]
    },
    {
      "id": "C0061",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/mailbox-roles/",
      "markdown": "https://connectbyjbrh.com/docs/email/mailbox-roles/index.md",
      "title": "Mailbox roles",
      "description": "Why a mailbox carries a role, what the role changes about which address a reply leaves from and how it is written, and how to choose one deliberately.",
      "summary": "A role is a stored value on the mailbox row that says what the address is for. It is the thing that later decides which mailbox a reply is sent from, and it gives the engine the standing context that a message arrived at a sales address rather than a support one. It is set on the mailbox and changed there; nothing else in the workspace has to be reconfigured when it changes.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/email/primary-mailbox/",
        "https://connectbyjbrh.com/docs/email/mailbox-autonomy/",
        "https://connectbyjbrh.com/docs/email/draft-generation/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0067",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/mailbox-signature/",
      "markdown": "https://connectbyjbrh.com/docs/email/mailbox-signature/index.md",
      "title": "Mailbox signatures",
      "description": "Where a signature is stored, which messages it is applied to, how it interacts with a reply you have edited, and what this documentation can and cannot say about footers.",
      "summary": "A signature is a field on the mailbox row, not a workspace-wide setting, so each connected address signs off in its own name. It is applied to messages sent from that mailbox, whoever composed them — Connect or a person — because both go through the same send boundary. Changing it affects what leaves next, not what has already gone.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/email/mailbox-roles/",
        "https://connectbyjbrh.com/docs/email/sending/",
        "https://connectbyjbrh.com/docs/email/outreach-email/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "C0060",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/mailboxes/",
      "markdown": "https://connectbyjbrh.com/docs/email/mailboxes/index.md",
      "title": "Mailboxes",
      "description": "What one mailbox row owns, how several run at once in a workspace, what changes when you add another, and the defect that made a connected mailbox invisible.",
      "summary": "A mailbox is one connected email identity plus the settings that govern it: a role, a signature, its own autonomy rule, its own health verdicts, and the transport and credentials its provider adapter is built from. A workspace can run several. Adding one adds a source of mail and a possible sending identity; it does not change how any existing mailbox behaves.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/docs/email/mailbox-roles/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/email/mailbox-disconnect/",
        "https://connectbyjbrh.com/research/invisible-not-missing/"
      ]
    },
    {
      "id": "C0076",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/message-canonicalisation/",
      "markdown": "https://connectbyjbrh.com/docs/email/message-canonicalisation/index.md",
      "title": "From a provider message to a canonical one",
      "description": "The journey from a provider's own message record to the canonical thread, message and contact the engine reads — and why the engine is not allowed near the provider table.",
      "summary": "Mail exists twice on purpose. `tenant_*` tables hold what the provider adapter fetched, in the provider's own shape; the canonical `threads`, `messages` and `contacts` are what the engine and every screen read. `connect_core.bridge_*` copies between them, in one direction, and the engine never reads the provider tables at all.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/threads/",
        "https://connectbyjbrh.com/docs/email/contact-resolution/",
        "https://connectbyjbrh.com/docs/email/inbox-sync/",
        "https://connectbyjbrh.com/docs/email/html-email/",
        "https://connectbyjbrh.com/docs/technology/mime/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/"
      ]
    },
    {
      "id": "C0066",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/microsoft-graph/",
      "markdown": "https://connectbyjbrh.com/docs/email/microsoft-graph/index.md",
      "title": "Connecting a Microsoft mailbox",
      "description": "Connecting a Microsoft mailbox over Graph: what the adapter covers, the two places it differs from Gmail, and the much larger part that is identical.",
      "summary": "A Microsoft mailbox connects as a third transport alongside Gmail and IMAP, and its adapter fetches mail through Microsoft Graph. Once a message crosses the bridge into canonical threads and messages, nothing downstream knows or cares that it came from Microsoft — triage, drafting, autonomy, sending, audit and memory are the same code for all three.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/email/connect-imap-smtp/",
        "https://connectbyjbrh.com/docs/email/message-canonicalisation/",
        "https://connectbyjbrh.com/docs/email/inbox-sync/",
        "https://connectbyjbrh.com/docs/technology/microsoft-graph/",
        "https://connectbyjbrh.com/docs/technology/oauth/"
      ]
    },
    {
      "id": "C0096",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/outreach-email/",
      "markdown": "https://connectbyjbrh.com/docs/email/outreach-email/index.md",
      "title": "Outreach email versus a customer reply",
      "description": "Outreach and a reply to a customer are two paths with different gates. What each must pass, why they are never merged, and what that costs in volume.",
      "summary": "A reply answers somebody who wrote to you. Outreach starts a conversation with somebody who did not. They share one send boundary and nothing else: outreach must additionally clear provenance, evidence freshness, a role address, an owner-reviewed offering, domain and daily caps, suppression, opt-out state, sender identity and a reputation state. A reply clears none of those.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/email/sending/",
        "https://connectbyjbrh.com/docs/email/unsubscribe/",
        "https://connectbyjbrh.com/docs/email/draft-generation/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/"
      ]
    },
    {
      "id": "C0062",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/primary-mailbox/",
      "markdown": "https://connectbyjbrh.com/docs/email/primary-mailbox/index.md",
      "title": "The primary mailbox",
      "description": "What falls back to a workspace's default sending mailbox, how that default is expressed and changed, and what to do when a workspace appears to have none.",
      "summary": "The primary mailbox is the one a workspace falls back to when nothing narrower has decided which address to use — a first message that is not a reply on an existing thread. It is expressed as a mailbox role rather than a flag on the workspace, so you change it by changing roles on the Mailboxes screen. A workspace with one connected mailbox has no ambiguity to resolve.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/mailbox-roles/",
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/email/mailbox-disconnect/",
        "https://connectbyjbrh.com/docs/email/outreach-email/",
        "https://connectbyjbrh.com/research/workspace-stamp/"
      ]
    },
    {
      "id": "C0070",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/quiet-mailbox/",
      "markdown": "https://connectbyjbrh.com/docs/email/quiet-mailbox/index.md",
      "title": "A quiet mailbox",
      "description": "A mailbox that authenticates and returns nothing: what the state means, the four ordinary reasons for it, and why it is reported as a signal rather than an error.",
      "summary": "A quiet mailbox is one that connects, fetches successfully and finds nothing. It is reported as a health signal rather than an error, because in most cases nothing is wrong — the address genuinely has no new mail. The point of naming it is that quiet and broken look identical from a distance, and only one of them needs you.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/email/inbox-sync/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/"
      ]
    },
    {
      "id": "C0089",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/regenerate-draft/",
      "markdown": "https://connectbyjbrh.com/docs/email/regenerate-draft/index.md",
      "title": "Regenerating a draft",
      "description": "When writing a reply again is the right move rather than editing it, what a fresh pass picks up, and what regenerating costs you.",
      "summary": "Regenerating runs the drafting pass again over the thread as it stands now, with the Knowledge, memory and directions that exist now. That is the only way a reply picks up messages that arrived while it waited, or a fact you added five minutes ago. It costs a model call and it discards whatever was there before, including your edits.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/edit-draft/",
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/email/draft-generation/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/"
      ]
    },
    {
      "id": "C0080",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/remote-images/",
      "markdown": "https://connectbyjbrh.com/docs/email/remote-images/index.md",
      "title": "Remote images in email",
      "description": "Why an image in a received message loads through Connect's proxy instead of your browser, and what that changes for the sender and for you.",
      "summary": "Every remote image in a received message is rewritten to load through Connect rather than directly from the sender's server. The sender's host sees a request from Connect, at a time Connect chose, with no browser fingerprint and no per-recipient identifier reaching your machine. Opening a message therefore does not tell the sender that a human opened it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/html-email/",
        "https://connectbyjbrh.com/docs/email/attachments/",
        "https://connectbyjbrh.com/docs/email/threads/",
        "https://connectbyjbrh.com/docs/email/deliverability/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "C0091",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/send-evidence/",
      "markdown": "https://connectbyjbrh.com/docs/email/send-evidence/index.md",
      "title": "Proof that a message was sent",
      "description": "Why Connect will not call a message sent without the provider's own acknowledgement, what the third state means, and how a message in doubt is resolved.",
      "summary": "**Sent** means the provider acknowledged the message and that acknowledgement is stored against it. Where the acknowledgement never arrived — a timeout, a broken connection, an answer Connect cannot interpret — the state is *uncertain*, and it stays that way on screen. Guessing in either direction produces a worse outcome than admitting the doubt.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/sending/",
        "https://connectbyjbrh.com/docs/email/failed-send/",
        "https://connectbyjbrh.com/docs/email/bounces/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/"
      ]
    },
    {
      "id": "C0090",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/sending/",
      "markdown": "https://connectbyjbrh.com/docs/email/sending/index.md",
      "title": "Sending email",
      "description": "The path an outbound message takes through Connect's single send boundary, the checks along it, and the narrow meaning the word sent may carry.",
      "summary": "Every outbound message — written by the engine or typed by a person — leaves through `outbound.py`. One boundary, one set of checks: compliance on the recipients, the daily allowance, then the provider. The word **sent** is reserved for a message the provider has acknowledged; anything else is *uncertain* or *failed*, and is shown as what it is.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/email/failed-send/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/email/deliverability/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/"
      ]
    },
    {
      "id": "C0100",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/suppression-list/",
      "markdown": "https://connectbyjbrh.com/docs/email/suppression-list/index.md",
      "title": "The suppression list",
      "description": "The one list checked before any outreach: what puts an address on it, what it blocks, who may take an entry off, and how it differs from blocking a person.",
      "summary": "The suppression list is the single place asked before outreach goes anywhere. Unsubscribes, complaints, permanent bounces, manual entries and do-not-contact instructions all resolve through it, and every entry carries where it came from. Some entries may be cleared by a person with a reason; a do-not-contact entry may not, and the Connect Assistant cannot clear one at all.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/unsubscribe/",
        "https://connectbyjbrh.com/docs/email/complaints/",
        "https://connectbyjbrh.com/docs/email/bounces/",
        "https://connectbyjbrh.com/docs/email/dnc/",
        "https://connectbyjbrh.com/docs/email/blocking/",
        "https://connectbyjbrh.com/docs/prospects/compliance-check/"
      ]
    },
    {
      "id": "C0077",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/threads/",
      "markdown": "https://connectbyjbrh.com/docs/email/threads/index.md",
      "title": "Conversation threads",
      "description": "How a canonical thread is formed, which signals attach a message to one, what a person's own marks on a thread control, and the ordinary ways a thread breaks.",
      "summary": "A thread is a canonical record created by the bridge: one conversation, the mailbox it arrived on, the people in it, and every message in order. It is the unit the engine picks work by and the unit a person marks up, because `threads.priority`, `threads.starred` and `threads.deleted_at` all live on it rather than on individual messages.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/message-canonicalisation/",
        "https://connectbyjbrh.com/docs/email/contact-resolution/",
        "https://connectbyjbrh.com/docs/email/triage/",
        "https://connectbyjbrh.com/docs/email/blocking/",
        "https://connectbyjbrh.com/research/one-person-many-channels/"
      ]
    },
    {
      "id": "C0082",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/triage/",
      "markdown": "https://connectbyjbrh.com/docs/email/triage/index.md",
      "title": "Triage and priority",
      "description": "How a thread gets a priority, why `threads.priority` changes what the engine does next, and which triage marks belong to you alone.",
      "summary": "Triage sets `threads.priority` on the canonical thread, and the engine reads that column when it picks what to work on. Correcting a priority therefore changes behaviour rather than re-sorting a list. Starring and deleting are yours alone — they organise your view and the engine does not act on them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/threads/",
        "https://connectbyjbrh.com/docs/email/guidance/",
        "https://connectbyjbrh.com/docs/email/blocking/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/"
      ]
    },
    {
      "id": "C0097",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/email/unsubscribe/",
      "markdown": "https://connectbyjbrh.com/docs/email/unsubscribe/index.md",
      "title": "Unsubscribe",
      "description": "How Connect honours an unsubscribe: the request is acted on rather than answered, a do-not-contact entry is written, and every send path checks it.",
      "summary": "An unsubscribe is one of the few intents Connect never replies to — it acts instead. The person is marked do-not-contact, the conversation is closed, and every later send checks that mark before anything reaches a provider, whether the send was started by the engine or by a person. Promotional mail carries a one-click header as well, handled by the sending provider.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/dnc/",
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/email/outreach-email/",
        "https://connectbyjbrh.com/docs/email/complaints/",
        "https://connectbyjbrh.com/docs/assistant/"
      ]
    },
    {
      "id": "C0275",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/files-data/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/index.md",
      "title": "Files and data in Connect",
      "description": "The two halves of Files and data: one file service shared by both audiences, and a grid over 13 record sheets that never writes to a table directly.",
      "summary": "Files and data are two surfaces over records that already exist. Files go through one service both audiences share, storing versions rather than overwriting. The Data grid is a spreadsheet view of 13 record sheets, and every edit it makes goes through the service that owns the record. Neither surface holds a private copy of anything.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/upload/",
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/assistant/files-in-assistant/",
        "https://connectbyjbrh.com/research/grid-over-services/"
      ]
    },
    {
      "id": "C0284",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/answer-from-file/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/answer-from-file/index.md",
      "title": "Answering from a file",
      "description": "Grounding an answer in an attachment instead of in a model's memory: how Connect quotes a file, what happens when the file does not say, and what a citation means.",
      "summary": "Ask a question with a file attached and Connect answers from that file. The `ask_file` tool reads the document you name and the reply carries the file it came from, so the claim and its evidence arrive together. If the document does not contain the answer, Connect says the document does not contain it rather than filling the gap from general knowledge.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/text-extraction/",
        "https://connectbyjbrh.com/docs/files-data/image-understanding/",
        "https://connectbyjbrh.com/docs/assistant/evidence-and-citation/",
        "https://connectbyjbrh.com/docs/assistant/source-conflict/",
        "https://connectbyjbrh.com/docs/workflows/upload-and-answer/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "C0296",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/bulk-actions/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/bulk-actions/index.md",
      "title": "Bulk selection and actions",
      "description": "Selecting many rows on the Data screen and acting on them at once: how a bulk change is applied row by row, and what a partial result means.",
      "summary": "Select the records you mean, choose an action, and Connect applies it to each one through the service that owns it. There is no bulk statement that writes past that service, so every row is validated on its own terms. The consequence is the thing to understand before you start: a bulk action can partly succeed, and it reports what happened to each one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/inline-edit/",
        "https://connectbyjbrh.com/docs/files-data/data-filtering/",
        "https://connectbyjbrh.com/docs/workflows/bulk-edit/",
        "https://connectbyjbrh.com/docs/files-data/data-import-export/",
        "https://connectbyjbrh.com/docs/files-data/data-duplicates/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0285",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/create-file/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/create-file/index.md",
      "title": "Creating a file",
      "description": "How Connect produces a file: what it can be built from, which formats it will and will not write, and where the finished document lands.",
      "summary": "Connect writes a file through the `create_file` tool, into the same store every uploaded file goes to. It builds the contents from what is already in the workspace and from the conversation you are having — never from figures it does not have. The result is version 1 of a chain, with provenance saying which request produced it, and it appears on the Files sheet straight away.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/modify-file/",
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/files-data/linking-files/",
        "https://connectbyjbrh.com/docs/workflows/create-document/",
        "https://connectbyjbrh.com/docs/assistant/action-cards/",
        "https://connectbyjbrh.com/docs/assistant/assistant-authority/"
      ]
    },
    {
      "id": "C0291",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/data-columns/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/data-columns/index.md",
      "title": "Columns, order and visibility",
      "description": "Arranging a sheet on the Data screen: resizing, reordering, hiding and showing columns, what a hidden column still does, and how to keep an arrangement.",
      "summary": "Each sheet arrives with the fields its record type has. You can drag a column wider or narrower, drag it into a different position, and hide the ones you are not reading. None of that changes the record — a hidden column is still a field on the row. To have the same arrangement tomorrow, save it as a [view](/docs/files-data/saved-views/).",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/files-data/saved-views/",
        "https://connectbyjbrh.com/docs/files-data/data-sorting-grouping/",
        "https://connectbyjbrh.com/docs/files-data/data-filtering/",
        "https://connectbyjbrh.com/docs/files-data/data-mobile/",
        "https://connectbyjbrh.com/developers/data-model-public/"
      ]
    },
    {
      "id": "C0298",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/data-duplicates/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/data-duplicates/index.md",
      "title": "Duplicates in the grid",
      "description": "How the Data screen surfaces records that look like the same person or company, what merging actually does, and why it is never done automatically.",
      "summary": "Connect surfaces rows that look like the same thing — two people with one address between them, two companies with the same name — and leaves the judgement to you. Merging is performed by the relationship service, which keeps one record and moves the other's identities and history onto it. Nothing merges on its own, and every merge is recorded.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/files-data/data-import-export/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/",
        "https://connectbyjbrh.com/research/one-person-many-channels/",
        "https://connectbyjbrh.com/docs/files-data/bulk-actions/"
      ]
    },
    {
      "id": "C0292",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/data-filtering/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/data-filtering/index.md",
      "title": "Filtering and searching a sheet",
      "description": "Narrowing a sheet on the Data screen: how filters on several columns combine, how search differs from a filter, and why a typed wildcard is just a character.",
      "summary": "A filter narrows a sheet to the rows that match. Filters on different columns apply together, so each one you add can only reduce the result. Search looks across the sheet rather than at one field. Both run over the whole sheet in the database, not over the rows that happen to be loaded — and what you type is treated as a value, never as a pattern.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/files-data/data-sorting-grouping/",
        "https://connectbyjbrh.com/docs/files-data/saved-views/",
        "https://connectbyjbrh.com/docs/files-data/bulk-actions/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/",
        "https://connectbyjbrh.com/docs/files-data/data-import-export/"
      ]
    },
    {
      "id": "C0290",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/data-grid/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/data-grid/index.md",
      "title": "The Data grid",
      "description": "The Data screen: an Excel-like grid over thirteen record sheets, what each sheet holds, and why it is a view of Connect rather than a second database.",
      "summary": "`#/data` is a spreadsheet-shaped view over thirteen sheets of real records — companies, people, leads, prospects, follow-ups, deals, conversations, calls, cases, onboarding, knowledge, files and memory. Rows are virtualised so a large sheet scrolls without loading everything. Every edit made here is handed to the service that owns that record, so the grid can never accept something the rest of Connect would refuse.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/data-columns/",
        "https://connectbyjbrh.com/docs/files-data/data-filtering/",
        "https://connectbyjbrh.com/docs/files-data/inline-edit/",
        "https://connectbyjbrh.com/docs/files-data/saved-views/",
        "https://connectbyjbrh.com/research/grid-over-services/",
        "https://connectbyjbrh.com/docs/files-data/data-import-export/"
      ]
    },
    {
      "id": "C0297",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/data-import-export/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/data-import-export/index.md",
      "title": "Importing and exporting",
      "description": "Getting records into and out of the Data screen: how an import is validated row by row, and why an exported CSV escapes cells that begin with an equals sign.",
      "summary": "Import reads a spreadsheet or a delimited file and offers each row to the service that owns the record, so a row that would be invalid anywhere else is refused here too and reported rather than dropped in silence. Export writes CSV, and it neutralises anything a spreadsheet application would treat as a formula — which is why some cells look escaped when you open the file.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/files-data/data-filtering/",
        "https://connectbyjbrh.com/docs/files-data/data-duplicates/",
        "https://connectbyjbrh.com/docs/workflows/data-import/",
        "https://connectbyjbrh.com/docs/troubleshooting/csv-export-formula/",
        "https://connectbyjbrh.com/docs/files-data/safe-parsing/"
      ]
    },
    {
      "id": "C0299",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/data-mobile/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/data-mobile/index.md",
      "title": "The grid on a small screen",
      "description": "What the Data screen becomes on a phone: the controls that survive the loss of width, the ones that are dropped, and why dropping them is the right answer.",
      "summary": "A grid is a horizontal instrument, and a phone has no horizontal room. On a narrow display the Data screen falls back to a stacked layout: one record at a time, its fields listed down the page, with search and the filters already in force still working. The controls that only make sense across width — resizing, reordering, freezing — are not offered.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/files-data/data-columns/",
        "https://connectbyjbrh.com/docs/files-data/saved-views/",
        "https://connectbyjbrh.com/docs/assistant/assistant-responsive/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/docs/files-data/inline-edit/"
      ]
    },
    {
      "id": "C0293",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/data-sorting-grouping/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/data-sorting-grouping/index.md",
      "title": "Sorting, grouping and freezing",
      "description": "Ordering rows, gathering them under a shared value and pinning the columns you read against — and what happens when you use all three at once.",
      "summary": "Sorting orders rows by a column. Grouping gathers rows that share a value into collapsible blocks. Freezing pins the leading columns so they stay put while the rest scrolls sideways. The first two change which row you are looking at and the third only changes where it sits on screen — which is why grouping and sorting interact and freezing never does.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/files-data/data-columns/",
        "https://connectbyjbrh.com/docs/files-data/data-filtering/",
        "https://connectbyjbrh.com/docs/files-data/saved-views/",
        "https://connectbyjbrh.com/docs/files-data/data-mobile/",
        "https://connectbyjbrh.com/docs/sales/"
      ]
    },
    {
      "id": "C0289",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/file-audit/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/file-audit/index.md",
      "title": "The record of a file",
      "description": "The trail a file leaves in Connect: who added it, who changed it, what was refused, and what was produced from it — and what the trail deliberately does not hold.",
      "summary": "Every action on a file leaves an entry in the workspace audit trail: what was decided, by what, under which rule, and what happened. That covers adding a file, changing it, linking it, and being refused permission to do any of those. The trail sits beside the file's own version chain and answers a different question — not what the document says, but how it came to say it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/files-data/modify-file/",
        "https://connectbyjbrh.com/docs/files-data/linking-files/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/authority-separation/",
        "https://connectbyjbrh.com/docs/workflows/modify-document/"
      ]
    },
    {
      "id": "C0287",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/file-versions/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/file-versions/index.md",
      "title": "File versions",
      "description": "The version chain a file keeps in Connect: what one version records, what provenance means here, and how the chain relates to the audit trail.",
      "summary": "Every file in Connect is a chain of versions rather than a single document. Version 1 is however it arrived — uploaded or produced — and each later version is one recorded change on top of the one before it. Each carries provenance: what produced it, from which request, and under whose confirmation. The chain is append-only and no version is ever rewritten.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/modify-file/",
        "https://connectbyjbrh.com/docs/files-data/file-audit/",
        "https://connectbyjbrh.com/docs/files-data/create-file/",
        "https://connectbyjbrh.com/docs/workflows/file-version-chain/",
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0283",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/image-understanding/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/image-understanding/index.md",
      "title": "Understanding an image",
      "description": "How Connect reads a photo or a screenshot: the image formats it accepts, what the model is actually shown, and the questions a picture cannot answer.",
      "summary": "Connect reads PNG, JPEG and WebP. An image is sent to the model as an image, alongside your question and whatever record you were looking at, and the answer comes back as ordinary text you can check against the picture. There is no separate OCR service, no face matching and no image search: what you get is one model's reading of one picture, cited to the file it came from.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/supported-formats/",
        "https://connectbyjbrh.com/docs/files-data/answer-from-file/",
        "https://connectbyjbrh.com/docs/files-data/preview/",
        "https://connectbyjbrh.com/docs/files-data/table-extraction/",
        "https://connectbyjbrh.com/docs/assistant/evidence-and-citation/"
      ]
    },
    {
      "id": "C0295",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/inline-edit/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/inline-edit/index.md",
      "title": "Editing in the grid",
      "description": "Changing a value in a cell on the Data screen: which fields accept an edit, which service actually performs it, and why some edits are refused.",
      "summary": "Editing a cell does not write to a table. The grid hands the change to the service that owns that record — the same service the ordinary screen and the Assistant's tools call — and shows you what it did. A field that service will not accept cannot be written from the grid either, and the refusal you see is its refusal, in its own words.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/files-data/bulk-actions/",
        "https://connectbyjbrh.com/docs/troubleshooting/grid-edit-refused/",
        "https://connectbyjbrh.com/docs/workflows/data-grid-edit/",
        "https://connectbyjbrh.com/research/grid-over-services/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0288",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/linking-files/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/linking-files/index.md",
      "title": "Linking a file to a record",
      "description": "Attaching a file to a company, a deal, a case or a conversation: what the link changes, what it does not, and where the file actually lives.",
      "summary": "A file is stored once and linked to the records it belongs to. The link is what makes the document appear on that company, deal or case, and what lets a question asked on that record reach it. Linking copies nothing, changes no contents, and can be removed later without the file going anywhere.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/file-audit/",
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/assistant/record-context/",
        "https://connectbyjbrh.com/docs/files-data/create-file/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/sales/"
      ]
    },
    {
      "id": "C0278",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/mime-validation/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/mime-validation/index.md",
      "title": "Validating a file",
      "description": "What Connect checks about a file before any parser touches it: the type check against the bytes, and the two structural attacks the checks exist to stop.",
      "summary": "Validation happens before parsing, not during it. The declared type is checked against what the bytes actually are, and two structural refusals are applied: a document that declares external entities, and an archive-backed format that expands out of proportion. A file that fails is refused at the door, before any reader has seen it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/upload/",
        "https://connectbyjbrh.com/docs/files-data/safe-parsing/",
        "https://connectbyjbrh.com/docs/troubleshooting/file-rejected/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/files-through-one-service/"
      ]
    },
    {
      "id": "C0286",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/modify-file/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/modify-file/index.md",
      "title": "Changing a file",
      "description": "Why changing a file in Connect always produces a new version instead of overwriting it, and exactly what the version you started from keeps.",
      "summary": "Connect never edits a file in place. `modify_file` reads the version you point at, applies the change and writes the result as the next version in the chain. The version you started from keeps its bytes, its place in the history and every audit entry that ever referred to it, so an answer given last month still points at what was actually read.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/files-data/create-file/",
        "https://connectbyjbrh.com/docs/files-data/file-audit/",
        "https://connectbyjbrh.com/docs/workflows/modify-document/",
        "https://connectbyjbrh.com/docs/workflows/file-version-chain/",
        "https://connectbyjbrh.com/docs/files-data/safe-parsing/"
      ]
    },
    {
      "id": "C0280",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/preview/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/preview/index.md",
      "title": "Previewing a file",
      "description": "What a file preview shows and what it deliberately does not: stored bytes for an image, extracted content for a document, and nothing fetched from the network.",
      "summary": "A preview is drawn from what the file service already holds. An image is shown from its stored bytes; a plain format is shown as it was written; a document or spreadsheet is shown through what extraction produced, not through a page-faithful renderer. Nothing a document points at is fetched, which is the same refusal that applies when it is validated.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/files-data/text-extraction/",
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/troubleshooting/pdf-no-text/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "C0279",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/safe-parsing/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/safe-parsing/index.md",
      "title": "Parsing a file safely",
      "description": "Three refusals that keep document handling safe: external entity declarations, archives that expand out of proportion, and formulas neutralised on the way out.",
      "summary": "Two refusals apply on the way in and one protection applies on the way out. A document declaring external entities is refused; an archive-backed format whose contents expand out of proportion is refused; and a CSV export neutralises formulas so a spreadsheet cannot execute a cell that came from your data. None of the three depends on recognising a known attack.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/mime-validation/",
        "https://connectbyjbrh.com/docs/files-data/upload/",
        "https://connectbyjbrh.com/docs/troubleshooting/csv-export-formula/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/"
      ]
    },
    {
      "id": "C0294",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/saved-views/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/saved-views/index.md",
      "title": "Saved views",
      "description": "What a saved view on the Data screen keeps, why it grants nobody any access they did not have, and how to get a sheet back to how it arrived.",
      "summary": "A saved view is a named arrangement of one sheet: which columns are shown, their order and width, what is frozen, what it is filtered and sorted by, and how it is grouped. It stores no rows and no permissions. Returning a sheet to how it arrived is a matter of switching back to the default view rather than undoing each control in turn.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/files-data/data-filtering/",
        "https://connectbyjbrh.com/docs/files-data/data-columns/",
        "https://connectbyjbrh.com/docs/files-data/data-sorting-grouping/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "C0277",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/supported-formats/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/supported-formats/index.md",
      "title": "File formats Connect reads",
      "description": "Every file format Connect reads, what is actually extracted from each one, and the limits worth knowing before you rely on an answer drawn from it.",
      "summary": "Connect reads images as PNG, JPEG and WebP; documents as PDF, DOCX and PPTX; spreadsheets as XLSX; delimited text as CSV and TSV; and plain formats as TXT, Markdown and JSON. Extraction uses the standard library, format by format. A PDF that carries a text layer gives it up exactly; one without is read as images instead, which answers questions but yields nothing selectable.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/files-data/text-extraction/",
        "https://connectbyjbrh.com/docs/files-data/table-extraction/",
        "https://connectbyjbrh.com/docs/troubleshooting/pdf-no-text/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/"
      ]
    },
    {
      "id": "C0282",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/table-extraction/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/table-extraction/index.md",
      "title": "Reading tables out of a file",
      "description": "How XLSX and delimited files are read into rows and columns, what survives the trip, and the four things that are reliably lost on the way.",
      "summary": "A spreadsheet is read as values, row by row and sheet by sheet. A CSV or TSV is read as delimited rows. What survives is the grid of values and the headers you gave it. What does not survive is the formula behind a cell, the formatting on it, anything drawn on top of the sheet, and any type you believed a column had but never declared.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/supported-formats/",
        "https://connectbyjbrh.com/docs/files-data/text-extraction/",
        "https://connectbyjbrh.com/docs/files-data/data-import-export/",
        "https://connectbyjbrh.com/docs/troubleshooting/import-rows-dropped/",
        "https://connectbyjbrh.com/research/grid-over-services/"
      ]
    },
    {
      "id": "C0281",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/text-extraction/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/text-extraction/index.md",
      "title": "Reading text out of a document",
      "description": "How words come out of a PDF, a DOCX, a PPTX or a plain file, what reading order means in practice, and what happens when a document has no text layer at all.",
      "summary": "Extraction pulls the words a document actually stores. A PDF exported from an application carries a text layer and gives it up exactly; a DOCX gives its body; a PPTX gives what is on the slides; TXT, Markdown and JSON are already words. A scanned PDF stores pictures of words and has no layer to extract, so the model reads the pages instead.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/supported-formats/",
        "https://connectbyjbrh.com/docs/files-data/preview/",
        "https://connectbyjbrh.com/docs/files-data/table-extraction/",
        "https://connectbyjbrh.com/docs/troubleshooting/pdf-no-text/",
        "https://connectbyjbrh.com/research/grounding-without-a-vector-database/"
      ]
    },
    {
      "id": "C0276",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/files-data/upload/",
      "markdown": "https://connectbyjbrh.com/docs/files-data/upload/index.md",
      "title": "Adding a file",
      "description": "Three ways to add a file — button, drag-and-drop, paste — what happens the instant it lands, and the checks it must pass before anything reads it.",
      "summary": "Add a file with the button, by dropping it onto the panel, or by pasting from the clipboard. All three take the same path: the bytes go to the file service, the file is validated before anything parses it, and only then does a reader run. A refused file is refused before extraction, so nothing half-processed is left behind.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/files-data/supported-formats/",
        "https://connectbyjbrh.com/docs/files-data/mime-validation/",
        "https://connectbyjbrh.com/docs/troubleshooting/file-rejected/",
        "https://connectbyjbrh.com/docs/workflows/upload-and-answer/"
      ]
    },
    {
      "id": "C0161",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/follow-ups/",
      "markdown": "https://connectbyjbrh.com/docs/follow-ups/index.md",
      "title": "Follow-ups in Connect",
      "description": "The section map: what a dated commitment is, the six channels one can sit on, which of them a drain executes, and where every other page here lives.",
      "summary": "A follow-up is a dated commitment on a channel, carrying a reason. There are six channels — `email`, `whatsapp`, `sms`, `phone`, `any` and `task` — and a drain executes the ones it owns when they fall due. The `task` channel is the exception: it is work for a person, and no drain ever sends it. Almost every rule in this section follows from those two facts.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/creating/",
        "https://connectbyjbrh.com/docs/follow-ups/execution/",
        "https://connectbyjbrh.com/docs/follow-ups/task-channel/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/workflows/create-follow-up/"
      ]
    },
    {
      "id": "C0168",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/follow-ups/approval/",
      "markdown": "https://connectbyjbrh.com/docs/follow-ups/approval/index.md",
      "title": "Approval on a follow-up",
      "description": "When executing a follow-up needs a person's yes, what the approver is shown, and what a rejection does to the commitment underneath.",
      "summary": "A follow-up is executed through its channel's ordinary gates, so the autonomy rule governing that channel decides whether the action leaves or waits for a person. On the phone drain a held row's outcome is recorded literally as \"awaiting approval\". A rejection ends that attempt and leaves the commitment open — it does not decide the commitment is gone.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/execution/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/workflows/follow-up-approval/",
        "https://connectbyjbrh.com/docs/autonomy/rejecting/"
      ]
    },
    {
      "id": "C0165",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/follow-ups/channel-choice/",
      "markdown": "https://connectbyjbrh.com/docs/follow-ups/channel-choice/index.md",
      "title": "Choosing the channel",
      "description": "Which of the six channels a commitment lands on, how a call decides it, when to use `any`, and the one channel that nothing ever sends.",
      "summary": "Two things decide it: what was promised, and what can carry it. A call-back becomes `phone`; a person's own work becomes `task`; a written commitment usually stays on the channel the conversation was on. `any` defers the choice until the row comes due. `sms` is the one to check before promising it, because outbound SMS depends on a provider that carries SMS.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "sms",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/task-channel/",
        "https://connectbyjbrh.com/docs/follow-ups/execution/",
        "https://connectbyjbrh.com/docs/follow-ups/stale/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
        "https://connectbyjbrh.com/docs/follow-ups/creating/"
      ]
    },
    {
      "id": "C0170",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/follow-ups/completion/",
      "markdown": "https://connectbyjbrh.com/docs/follow-ups/completion/index.md",
      "title": "Completing a follow-up",
      "description": "The two ways a follow-up closes as kept, the third state that looks like completion and is not, and what each one records against the relationship.",
      "summary": "Two things close a row as kept. A person marks it complete — the only route for a `task` row, because nothing else ever acts on one. Or the drain's action succeeds and the outcome is written back, so the commitment stops being owed. `attempted` is the third state and is not completion: something was tried and the promise is still outstanding.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/execution/",
        "https://connectbyjbrh.com/docs/follow-ups/editing/",
        "https://connectbyjbrh.com/docs/follow-ups/overdue/",
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/follow-ups/task-channel/"
      ]
    },
    {
      "id": "C0162",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/follow-ups/creating/",
      "markdown": "https://connectbyjbrh.com/docs/follow-ups/creating/index.md",
      "title": "Creating a follow-up",
      "description": "The three routes to a follow-up — by hand, from a conversation, from a call — and what each one records about the promise behind it.",
      "summary": "`schedule` is the one entry point, whether a person fills the form, the engine spots a commitment in a thread, or the voice books one mid-call. Each route supplies the same four things — person, when, channel, reason — and differs only in how much evidence it can attach. The call route is the strictest, because a promise made aloud is the easiest one to mis-hear.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/due-time/",
        "https://connectbyjbrh.com/docs/follow-ups/reason/",
        "https://connectbyjbrh.com/docs/follow-ups/channel-choice/",
        "https://connectbyjbrh.com/docs/workflows/create-follow-up/",
        "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-booked/"
      ]
    },
    {
      "id": "C0164",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/follow-ups/due-time/",
      "markdown": "https://connectbyjbrh.com/docs/follow-ups/due-time/index.md",
      "title": "Due dates and times",
      "description": "How a spoken or written promise becomes a due timestamp: the phrases that parse, the timezone it lands in, and the fallback when nothing usable was said.",
      "summary": "`voice_engine.due_at` turns the promised words into a time in the line's timezone — \"in 10 minutes\", \"tomorrow 11am\", \"Friday 3pm\", \"today evening\". When nothing usable was said it falls back to 11:00 tomorrow rather than to now. The due time is the moment a drain becomes willing to act on the row; it is not a promise about the minute.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/creating/",
        "https://connectbyjbrh.com/docs/follow-ups/stale/",
        "https://connectbyjbrh.com/docs/follow-ups/overdue/",
        "https://connectbyjbrh.com/docs/troubleshooting/follow-up-wrong-time/",
        "https://connectbyjbrh.com/docs/troubleshooting/time-is-wrong/"
      ]
    },
    {
      "id": "C0171",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/follow-ups/duplicates/",
      "markdown": "https://connectbyjbrh.com/docs/follow-ups/duplicates/index.md",
      "title": "Duplicate follow-ups",
      "description": "What counts as the same commitment: the person and the due time. What the rule catches, what it deliberately does not, and how to work with it.",
      "summary": "Sameness is decided on two things: the person, and the *when*. A follow-up with the same due time for the same person is a duplicate and the second is not created. Channel and reason are not part of the test — which keeps the rule easy to reason about, and means two genuinely different promises due at the same instant will collide.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/creating/",
        "https://connectbyjbrh.com/docs/follow-ups/editing/",
        "https://connectbyjbrh.com/docs/relationships/duplicates/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/troubleshooting/duplicate-follow-up/"
      ]
    },
    {
      "id": "C0167",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/follow-ups/editing/",
      "markdown": "https://connectbyjbrh.com/docs/follow-ups/editing/index.md",
      "title": "Changing a follow-up",
      "description": "What you can change on an open follow-up, which operation to reach for, and the one thing no operation will do — erase what already happened to the row.",
      "summary": "An open row is editable: the reason, the due time, the channel. Moving a time forward has its own operation — `snooze` — and ending a commitment you will not keep is `cancel`. What no operation does is erase what already happened: there is no verb that un-attempts a row, and that absence is deliberate rather than missing.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/duplicates/",
        "https://connectbyjbrh.com/docs/follow-ups/completion/",
        "https://connectbyjbrh.com/docs/follow-ups/due-time/",
        "https://connectbyjbrh.com/docs/follow-ups/stale/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/"
      ]
    },
    {
      "id": "C0169",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/follow-ups/execution/",
      "markdown": "https://connectbyjbrh.com/docs/follow-ups/execution/index.md",
      "title": "Executing a follow-up",
      "description": "What happens when a row comes due: the drain that picks it up, the gates it passes through unchanged, and the three outcomes written back against it.",
      "summary": "`runner.chase_phone` drains `phone` rows every tick, two at a time, through `voice_engine.place_call` — the same gates as any outbound call rather than a shortcut past them. Each attempt is written back as `call placed <id>`, `awaiting approval <id>` or `refused: <reason>`. A line that is not ready is retried in an hour.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/approval/",
        "https://connectbyjbrh.com/docs/follow-ups/stale/",
        "https://connectbyjbrh.com/docs/follow-ups/task-channel/",
        "https://connectbyjbrh.com/docs/workflows/execute-follow-up/",
        "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-executed/"
      ]
    },
    {
      "id": "C0174",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/follow-ups/followups-owner-tenant/",
      "markdown": "https://connectbyjbrh.com/docs/follow-ups/followups-owner-tenant/index.md",
      "title": "Follow-ups for the Owner and for a customer",
      "description": "One queue, one drain, two doors: what is identical for the Owner and a customer workspace, what differs, and the enquiry queue that belongs to neither.",
      "summary": "The Owner and a customer reach the same follow-up code through their own thin router, and the rows behave identically — same six channels, same gates, same duplicate and lateness rules. What differs is the vocabulary on the screen and the allowance behind the gates. Website enquiries are the one queue that belongs to JBRH rather than to any workspace.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/execution/",
        "https://connectbyjbrh.com/docs/support/website-enquiries/",
        "https://connectbyjbrh.com/docs/relationships/relationship-owner-tenant/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/follow-ups/approval/"
      ]
    },
    {
      "id": "C0173",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/follow-ups/overdue/",
      "markdown": "https://connectbyjbrh.com/docs/follow-ups/overdue/index.md",
      "title": "Overdue follow-ups",
      "description": "Where a follow-up past its time shows up, how it is ranked against everything else a person owes, and the four things that clear it.",
      "summary": "Overdue means the due time has passed and nothing has closed the row. It shows on the follow-ups screen, and in Needs You when it needs a decision rather than an action — ranked with everything else a person owes rather than in a queue of its own. Completing, cancelling or snoozing clears it; on the phone channel, the lateness rule eventually clears it for you.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/stale/",
        "https://connectbyjbrh.com/docs/follow-ups/approval/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you-ranking/",
        "https://connectbyjbrh.com/docs/follow-ups/completion/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/"
      ]
    },
    {
      "id": "C0163",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/follow-ups/reason/",
      "markdown": "https://connectbyjbrh.com/docs/follow-ups/reason/index.md",
      "title": "The reason on a follow-up",
      "description": "Every follow-up carries a reason. What a usable one contains, the four that are not reasons at all, and who ends up reading it.",
      "summary": "The reason is the part of a follow-up that survives the person who made it. A row without one says somebody owed somebody something and nothing else, which is unusable to a colleague covering on Tuesday and unusable to you in three weeks. A good reason names what was promised, what it depends on, and what would make it unnecessary.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/creating/",
        "https://connectbyjbrh.com/docs/follow-ups/editing/",
        "https://connectbyjbrh.com/docs/follow-ups/completion/",
        "https://connectbyjbrh.com/docs/relationships/person-memory/"
      ]
    },
    {
      "id": "C0172",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/follow-ups/stale/",
      "markdown": "https://connectbyjbrh.com/docs/follow-ups/stale/index.md",
      "title": "A follow-up that is too late",
      "description": "A phone follow-up more than twenty-four hours late is closed rather than rung. The cut-off, the reasoning behind it, and what the closed row records.",
      "summary": "A `phone` row more than twenty-four hours past due is closed as `missed:` and never rung — `PHONE_FOLLOWUP_MAX_LATE_HOURS` is that cut-off. The reasoning is about the person on the other end: a call-back a day and a half after it was promised is not a late kept promise, it is a surprise from a business that had visibly forgotten them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/overdue/",
        "https://connectbyjbrh.com/docs/follow-ups/execution/",
        "https://connectbyjbrh.com/docs/follow-ups/due-time/",
        "https://connectbyjbrh.com/docs/follow-ups/completion/",
        "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-executed/"
      ]
    },
    {
      "id": "C0166",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/follow-ups/task-channel/",
      "markdown": "https://connectbyjbrh.com/docs/follow-ups/task-channel/index.md",
      "title": "Follow-ups for a person to do",
      "description": "The `task` channel is work for a person, and no drain ever sends it. What lands there, where it appears, and why nothing sending it is correct.",
      "summary": "`task` is a follow-up whose channel says a human must do this. **No drain ever sends a `task` row.** It appears as \"For a person to do\" on the follow-ups screen and stays there until somebody completes it. It exists because much of what gets promised is not a message: a quotation to prepare, a recording to review, a colleague to ask.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/channel-choice/",
        "https://connectbyjbrh.com/docs/follow-ups/overdue/",
        "https://connectbyjbrh.com/docs/follow-ups/completion/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/follow-ups/execution/"
      ]
    },
    {
      "id": "G0001",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/index.md",
      "title": "Getting started with Connect",
      "description": "The shortest route from an empty workspace to Connect handling real work: the order to do things in, what each step proves, and where setups stall.",
      "summary": "Four things turn an empty workspace into a working one: sign in with Google, connect a mailbox, decide what Connect may do on each channel, and work the Needs You queue once. Phone, prospecting, follow-ups and the data grid are all worth adding afterwards — mail first, because mail is what proves the rest of the setup is right before anything is sent on your behalf.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/what-is-connect/",
        "https://connectbyjbrh.com/docs/getting-started/first-hour/",
        "https://connectbyjbrh.com/docs/getting-started/connect-your-mailbox/",
        "https://connectbyjbrh.com/docs/getting-started/set-what-connect-may-do/",
        "https://connectbyjbrh.com/docs/how-to/stop-connect-immediately/",
        "https://connectbyjbrh.com/docs/product/"
      ]
    },
    {
      "id": "G0005",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/connect-your-mailbox/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/connect-your-mailbox/index.md",
      "title": "Connect your mailbox",
      "description": "The first real step: connecting Gmail, Microsoft Graph or an IMAP server to Connect, giving the mailbox a role, and proving that it is genuinely working.",
      "summary": "Three provider paths lead to the same place. Gmail and Microsoft Graph are consented through their own sign-in screens; any other server is connected with IMAP and SMTP details. Once a mailbox is attached it gets a role, a signature and its own autonomy, and its conversations appear on `#/inbox` alongside every other channel.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/first-hour/",
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/docs/how-to/add-a-second-mailbox/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
        "https://connectbyjbrh.com/research/cursor-loss/",
        "https://connectbyjbrh.com/docs/getting-started/set-what-connect-may-do/"
      ]
    },
    {
      "id": "G0014",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/daily-routine/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/daily-routine/index.md",
      "title": "A working day with Connect",
      "description": "What a person actually does each day once Connect is running: one queue pass, a look at what went out, and the three habits that keep the rest honest.",
      "summary": "Most days are one pass through Needs You, a glance at what went out unsupervised, and nothing else. The work is not supervision — it is the handful of decisions Connect deliberately did not take, plus writing down any correction you found yourself making twice. Everything beyond that belongs to the weekly review rather than the daily one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/read-needs-you/",
        "https://connectbyjbrh.com/docs/getting-started/weekly-review/",
        "https://connectbyjbrh.com/docs/how-to/set-up-for-a-holiday/",
        "https://connectbyjbrh.com/docs/how-to/correct-a-mistake/",
        "https://connectbyjbrh.com/docs/getting-started/first-approval/",
        "https://connectbyjbrh.com/docs/how-to/audit-a-decision/"
      ]
    },
    {
      "id": "G0011",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/find-your-first-prospects/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/find-your-first-prospects/index.md",
      "title": "Find your first prospects",
      "description": "Writing a discovery brief that returns a short list you would actually ring, and the one guarantee that shapes everything prospecting gives you.",
      "summary": "Discovery is only as good as the brief. A brief that names an industry and a city returns many organisations and few you want; one that names the situation you are useful in returns fewer and better. Whatever the brief, one rule does not bend: Connect never guesses an email address, so a contact without an evidenced address arrives without one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/",
        "https://connectbyjbrh.com/docs/how-to/write-a-discovery-brief/",
        "https://connectbyjbrh.com/docs/how-to/stop-an-outreach-sequence/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/"
      ]
    },
    {
      "id": "G0008",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/first-approval/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/first-approval/index.md",
      "title": "Approve your first reply",
      "description": "Reading your first held draft, editing it, approving it, and the honest answer to what that approval does and does not teach Connect.",
      "summary": "A held draft sits in Needs You with the message it answers directly above it. Read both, edit anything you want, and approve — your edit is what goes out, unchanged. What approval does not do is teach: it releases one message. If the change you made will recur, write it down as a rule or a memory in the same sitting, or you will make it again next week.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/read-needs-you/",
        "https://connectbyjbrh.com/docs/getting-started/set-what-connect-may-do/",
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/docs/how-to/find-why-a-reply-was-held/",
        "https://connectbyjbrh.com/docs/how-to/correct-a-mistake/",
        "https://connectbyjbrh.com/docs/getting-started/daily-routine/"
      ]
    },
    {
      "id": "G0003",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/first-hour/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/first-hour/index.md",
      "title": "Your first hour",
      "description": "The four things worth doing in your first hour with Connect, in order, with the result each one produces and the mistake each one prevents.",
      "summary": "Connect a mailbox, set autonomy to hold replies, put three pieces of knowledge in, and read the first drafts. That is the hour. Everything else — the phone, prospecting, the pipeline, the data grid — is better after you have seen what Connect writes when it is grounded in your own material rather than in nothing at all.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/",
        "https://connectbyjbrh.com/docs/getting-started/connect-your-mailbox/",
        "https://connectbyjbrh.com/docs/getting-started/teach-connect-your-business/",
        "https://connectbyjbrh.com/docs/getting-started/first-approval/",
        "https://connectbyjbrh.com/docs/getting-started/first-week/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "G0004",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/first-week/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/first-week/index.md",
      "title": "Your first week",
      "description": "What to add once mail is flowing: knowledge that earns its place, standing instructions, a second channel, follow-ups, and when to loosen autonomy.",
      "summary": "Week one has one theme: make the drafts good enough that loosening autonomy is a small decision rather than a leap. That means adding knowledge where drafts were vague, writing standing instructions where you kept editing the same sentence, turning on one more channel, and letting the first follow-ups come round so you can see the chase actually happen.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/first-hour/",
        "https://connectbyjbrh.com/docs/getting-started/teach-connect-your-business/",
        "https://connectbyjbrh.com/docs/getting-started/your-first-follow-up/",
        "https://connectbyjbrh.com/docs/getting-started/weekly-review/",
        "https://connectbyjbrh.com/docs/how-to/write-a-standing-instruction/",
        "https://connectbyjbrh.com/docs/follow-ups/"
      ]
    },
    {
      "id": "G0020",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/glossary-for-new-users/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/glossary-for-new-users/index.md",
      "title": "The nine words you need first",
      "description": "Nine words that unlock the rest of this manual, grouped by what they are for, with the three distinctions new users most often get wrong.",
      "summary": "Nine words carry most of Connect: Workspace, Needs You, Autonomy, Approval, Standing Instruction, Knowledge, Memory, Follow-up and Prospect. Learn the three pairs people confuse — knowledge against memory, approval against instruction, prospect against person — and the rest of the documentation stops needing a translation.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/",
        "https://connectbyjbrh.com/docs/getting-started/",
        "https://connectbyjbrh.com/docs/getting-started/what-is-connect/",
        "https://connectbyjbrh.com/docs/getting-started/teach-connect-your-business/",
        "https://connectbyjbrh.com/docs/getting-started/set-what-connect-may-do/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "G0018",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/inviting-your-team/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/inviting-your-team/index.md",
      "title": "Inviting your team",
      "description": "Adding colleagues to a workspace: what an invitation really grants, what everyone shares, how work is divided, and why a colleague sometimes sees a refusal.",
      "summary": "A workspace is the boundary everything lives inside, so adding a colleague means giving a Google account access to that workspace — there is no password to issue, because Google sign-in is the only way in. Everyone who is in shares the same records, and every decision is recorded against the person who made it rather than against the workspace.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/research/closed-by-default-facade/",
        "https://connectbyjbrh.com/docs/getting-started/read-needs-you/",
        "https://connectbyjbrh.com/docs/how-to/hand-over-to-a-colleague/"
      ]
    },
    {
      "id": "G0017",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/keyboard/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/keyboard/index.md",
      "title": "Keyboard and speed",
      "description": "Getting around Connect quickly: hash routes you can type or bookmark, asking instead of navigating, and an honest note about published shortcuts.",
      "summary": "The fastest way around Connect is the address bar. Every screen has a hash route — thirty-four of them — so `#/needs-you` or `#/follow-ups` typed or bookmarked goes straight there without a single click through a menu. The second fastest is asking the Connect Assistant for the record you want instead of navigating to the screen that holds it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/getting-started/mobile/",
        "https://connectbyjbrh.com/docs/getting-started/daily-routine/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/research/n-plus-one-that-grows/",
        "https://connectbyjbrh.com/docs/how-to/stop-connect-immediately/"
      ]
    },
    {
      "id": "G0010",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/make-a-test-call/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/make-a-test-call/index.md",
      "title": "Make a test call",
      "description": "Ringing your own line for the first time: what to say, the four things to listen for, and how to read the transcript, summary and timings afterwards.",
      "summary": "Ring the number from a phone that is not in your workspace and hold an ordinary conversation — a real question, an interruption, and something you know it cannot answer. Then read the call record: the transcript, the summary, and the response timings. A call that felt fine and reads badly is more common than the reverse, which is why both halves matter.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/set-up-the-phone/",
        "https://connectbyjbrh.com/docs/how-to/review-a-call/",
        "https://connectbyjbrh.com/docs/how-to/check-a-number-before-going-live/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/research/silent-failure/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "G0016",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/mobile/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/mobile/index.md",
      "title": "Using Connect on a phone",
      "description": "Connect on a small screen: what is identical, what folds into a menu below 600 pixels, and the work that is genuinely better left for a desk.",
      "summary": "Connect runs in a phone's browser at the same address as everywhere else — there is no separate application to install. The screens are the same screens and the same session rules apply. Below about 600 pixels of width the Assistant's side panel folds into a menu instead of sitting beside the conversation, which is the main visible difference.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/read-needs-you/",
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/getting-started/keyboard/",
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/getting-started/daily-routine/"
      ]
    },
    {
      "id": "G0013",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/read-needs-you/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/read-needs-you/index.md",
      "title": "Your first pass through Needs You",
      "description": "Needs You is the one queue a person actually works: what lands in it, why it is ranked rather than chronological, and what an empty queue does and does not prove.",
      "summary": "Needs You holds every decision, approval and operational problem waiting on a person, in one place and in rank order rather than by arrival time. Working it is the daily habit that makes everything else safe to leave running. Entries drain by themselves when their cause clears, so an item that vanishes while you were reading it has usually resolved rather than been lost.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/getting-started/first-approval/",
        "https://connectbyjbrh.com/docs/getting-started/daily-routine/",
        "https://connectbyjbrh.com/docs/getting-started/set-what-connect-may-do/",
        "https://connectbyjbrh.com/research/approval-without-blocking/",
        "https://connectbyjbrh.com/docs/how-to/find-why-a-reply-was-held/"
      ]
    },
    {
      "id": "G0009",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/set-up-the-phone/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/set-up-the-phone/index.md",
      "title": "Set up the phone",
      "description": "Going from no number to a line that answers: the two voice engines, the settings that matter before the first call, and what is honestly not available yet.",
      "summary": "A working line needs three things: a number from a carrier, a voice channel set to something other than `off`, and a decision about which engine answers — the turn-based carrier path, or the realtime speech-to-speech engine a workspace opts into. Everything else, including what the line says and how it sounds, is tuning you can do after the first call connects.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/getting-started/make-a-test-call/",
        "https://connectbyjbrh.com/docs/how-to/check-a-number-before-going-live/",
        "https://connectbyjbrh.com/docs/how-to/change-the-voice/",
        "https://connectbyjbrh.com/docs/how-to/use-a-different-voice-per-line/",
        "https://connectbyjbrh.com/docs/getting-started/set-what-connect-may-do/"
      ]
    },
    {
      "id": "G0006",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/set-what-connect-may-do/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/set-what-connect-may-do/index.md",
      "title": "Decide what Connect may do",
      "description": "The four autonomy modes, the four scopes they can be set at, and the combination most businesses should start with before anything is sent for them.",
      "summary": "Autonomy is one setting per channel with four possible values — `off`, `draft_only`, `ask_before_send`, `autonomous` — and it can be set at four scopes: one contact, one endpoint, a whole channel, or the workspace. The narrowest rule that applies wins. Most businesses start every channel on `ask_before_send` and narrow from there once they have read a week of drafts.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/getting-started/first-approval/",
        "https://connectbyjbrh.com/docs/getting-started/read-needs-you/",
        "https://connectbyjbrh.com/docs/how-to/turn-off-one-channel/",
        "https://connectbyjbrh.com/docs/how-to/find-why-a-reply-was-held/",
        "https://connectbyjbrh.com/docs/getting-started/first-week/"
      ]
    },
    {
      "id": "G0007",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/teach-connect-your-business/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/teach-connect-your-business/index.md",
      "title": "Teach Connect about your business",
      "description": "What to put in Knowledge first, what belongs in Memory instead, and why the difference decides whether a correction applies to everyone or one person.",
      "summary": "Knowledge is the material your answers are grounded in and it applies to everybody. Memory is what Connect has learned about your business and its people, held at four tiers and applying only as widely as the tier it sits in. Almost every early mistake is a fact about one customer written into Knowledge, where it silently starts applying to all of them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/getting-started/first-week/",
        "https://connectbyjbrh.com/docs/how-to/check-what-connect-knows/",
        "https://connectbyjbrh.com/docs/how-to/give-connect-a-document/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "G0015",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/weekly-review/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/weekly-review/index.md",
      "title": "A weekly review",
      "description": "Five checks worth half an hour every week, what each one tells you that the daily pass cannot, and the change each finding should produce.",
      "summary": "The daily pass answers 'what needs me now'. The weekly review answers 'is this still set up correctly' — overdue commitments, what went out unsupervised, whether anything has quietly stopped working, whether allowances are being hit, and whether what Connect knows is still true. Half an hour, and each finding should produce a change rather than a note.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/daily-routine/",
        "https://connectbyjbrh.com/docs/how-to/measure-whether-it-is-working/",
        "https://connectbyjbrh.com/docs/how-to/clean-up-duplicates/",
        "https://connectbyjbrh.com/docs/how-to/reduce-your-costs/",
        "https://connectbyjbrh.com/docs/how-to/review-a-call/",
        "https://connectbyjbrh.com/docs/getting-started/your-first-follow-up/"
      ]
    },
    {
      "id": "G0019",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/what-connect-will-not-do/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/what-connect-will-not-do/index.md",
      "title": "What Connect will not do",
      "description": "The refusals that are designed rather than broken: what Connect declines in the moment, what is not built yet, and what it never claims about itself.",
      "summary": "Some of what Connect declines to do is policy you set, some is a capability that genuinely is not finished, and some is a claim it refuses to make about itself. Knowing which is which saves you from raising a support question about a refusal that is working exactly as intended — and every refusal is recorded, because a refusal is a decision.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/what-is-connect/",
        "https://connectbyjbrh.com/docs/how-to/stop-connect-immediately/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/research/status-vocabulary/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/getting-started/set-what-connect-may-do/"
      ]
    },
    {
      "id": "G0002",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/what-is-connect/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/what-is-connect/index.md",
      "title": "What Connect by JBRH is",
      "description": "Connect by JBRH in plain terms: one worker that reads mail, answers the phone and follows through — the category, and what it does not replace.",
      "summary": "Connect by JBRH is a Digital Business Employee: one application that reads a business's email, answers its phone, handles WhatsApp, keeps a single record per person and follows through on what was promised. It is not a chatbot attached to an inbox and not a CRM you fill in by hand. What it may do without being asked is a per-channel setting you control.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/",
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/docs/getting-started/what-connect-will-not-do/",
        "https://connectbyjbrh.com/docs/getting-started/glossary-for-new-users/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "G0012",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/getting-started/your-first-follow-up/",
      "markdown": "https://connectbyjbrh.com/docs/getting-started/your-first-follow-up/index.md",
      "title": "Create your first follow-up",
      "description": "The four parts of a follow-up — commitment, reason, due time, channel — and exactly what happens on each channel when one falls due.",
      "summary": "A follow-up is a dated commitment on a channel, with the reason attached. The reason is the part people leave out and the part that makes it work: when it falls due, whatever acts on it has to know why it exists. Six channels are available, and one of them — `task` — is deliberately work for a person that nothing will ever send.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/getting-started/first-week/",
        "https://connectbyjbrh.com/docs/how-to/close-the-loop-on-a-promise/",
        "https://connectbyjbrh.com/research/callback-promises/",
        "https://connectbyjbrh.com/docs/getting-started/weekly-review/",
        "https://connectbyjbrh.com/docs/getting-started/read-needs-you/"
      ]
    },
    {
      "id": "L0001",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/index.md",
      "title": "Glossary",
      "description": "One canonical definition per term in Connect, and the rule that every other page links here instead of defining a word a second time.",
      "summary": "This glossary holds one definition per term in Connect's product vocabulary — workspace, Needs You, autonomy, memory, identity, relationship — and it is the only place any of them is defined. Every other page links here rather than explaining a word again, so a term means the same thing on a phone page as it does in the developer reference.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/connect/",
        "https://connectbyjbrh.com/docs/glossary/workspace/",
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/docs/technology/",
        "https://connectbyjbrh.com/developers/data-model-public/"
      ]
    },
    {
      "id": "L0040",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/allowance/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/allowance/index.md",
      "title": "Allowance",
      "description": "An allowance is what remains of a period's permitted volume. Some are refused at the limit, some are ceilings on what may exist, and one is only counted.",
      "summary": "An **allowance** is what remains of a period's permitted volume for one metered activity — emails sent today, messages ingested, calls made. It is reserved atomically on the server as work happens, so two things starting at once cannot both spend the last unit. Reaching one is a refusal with a reason, never a silent failure.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/entitlement/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/account/usage/",
        "https://connectbyjbrh.com/docs/glossary/workspace/",
        "https://connectbyjbrh.com/developers/api-rate-limits/"
      ]
    },
    {
      "id": "L0014",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/approval/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/approval/index.md",
      "title": "Approval",
      "description": "An approval is one held action waiting for a human yes or no — what holds it, what the recipient sees meanwhile, and what a rejection does.",
      "summary": "An **approval** is one action Connect has prepared and is not allowed to complete on its own: a reply, a message, a call. It waits on the Waiting For You screen and in [Needs You](/docs/glossary/needs-you/), the recipient sees nothing at all, and it goes through unchanged the moment a person says yes.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/autonomy/",
        "https://connectbyjbrh.com/docs/glossary/needs-you/",
        "https://connectbyjbrh.com/docs/glossary/audit/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/undo-for-agents/"
      ]
    },
    {
      "id": "L0033",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/audit/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/audit/index.md",
      "title": "Audit",
      "description": "The audit trail records who did what, in what capacity, to what, and whether it worked — including the refusals, because a refusal is a decision too.",
      "summary": "The **audit** trail is Connect's accountability record: for each consequential action it stores the workspace, the actor and the capacity they acted in, the action, what it was done to, the before and after state, and the result. Refusals are recorded alongside successes, because deciding not to do something is a decision somebody may later need explained.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/autonomy/",
        "https://connectbyjbrh.com/docs/glossary/approval/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/derived-control-state/"
      ]
    },
    {
      "id": "L0013",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/autonomy/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/autonomy/index.md",
      "title": "Autonomy",
      "description": "Autonomy is the per-channel rule for what Connect may do without asking: four channels, four modes, four scopes, narrowest scope wins.",
      "summary": "**Autonomy** is the rule that says what Connect may do without asking, set per channel and enforced before anything leaves. There are four channels — email, WhatsApp, SMS and voice — four modes from off to autonomous, and four scopes; the narrowest scope that applies wins. The screen is called What Connect May Do.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/approval/",
        "https://connectbyjbrh.com/docs/glossary/needs-you/",
        "https://connectbyjbrh.com/docs/glossary/rule/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "L0032",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/carrier/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/carrier/index.md",
      "title": "Carrier",
      "description": "A carrier is the telephony provider specifically — the company that reaches the public phone network, and the authority for a call's duration and cost.",
      "summary": "A **carrier** is the [provider](/docs/glossary/provider/) that reaches the public telephone network on your behalf: it owns the numbers, connects the call and bills for it. Connect names one carrier per workspace for the network leg, and the carrier — not Connect — is the authority for what a call cost and how long it lasted.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/provider/",
        "https://connectbyjbrh.com/docs/glossary/outcome/",
        "https://connectbyjbrh.com/docs/phone/carrier-routing/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/technology/"
      ]
    },
    {
      "id": "L0030",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/channel/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/channel/index.md",
      "title": "Channel",
      "description": "A channel is a medium Connect communicates over. Four carry autonomy rules, one more exists for calls you make yourself, and the word is not the provider.",
      "summary": "A **channel** is a medium Connect communicates over: email, WhatsApp, SMS and voice. It is the unit that [autonomy](/docs/glossary/autonomy/) is set on, that [memory](/docs/glossary/memory/) has a tier for, and that a [follow-up](/docs/glossary/follow-up/) commits to. A channel is a medium, not the company that carries it — that is the [provider](/docs/glossary/provider/).",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/provider/",
        "https://connectbyjbrh.com/docs/glossary/mailbox/",
        "https://connectbyjbrh.com/docs/glossary/autonomy/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/whatsapp/"
      ]
    },
    {
      "id": "L0020",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/company/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/company/index.md",
      "title": "Company",
      "description": "A company in Connect is an organisation you deal with — never your own business, which is the workspace — and it is what people are attached to.",
      "summary": "A **company** is the record of an organisation your business deals with: the customer, the supplier, the prospect's employer. [People](/docs/glossary/person/) attach to it, and what is true of the firm lives here rather than being repeated on everyone who works there. Your own business is not a company record — it is the [workspace](/docs/glossary/workspace/).",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/person/",
        "https://connectbyjbrh.com/docs/glossary/relationship/",
        "https://connectbyjbrh.com/docs/glossary/workspace/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/grid-over-services/"
      ]
    },
    {
      "id": "L0002",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/connect/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/connect/index.md",
      "title": "Connect",
      "description": "What the name Connect covers: the product, the operator behind it, the work it does across four channels, and the names it is not.",
      "summary": "Connect — in full, **Connect by JBRH** — is one application that reads a business's incoming messages across email, WhatsApp, SMS and phone, decides what to do about each one, drafts the reply and sends it under rules the business sets. It is built and operated by JBRH Digital Solutions, and the current product version is 6.3.2.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/",
        "https://connectbyjbrh.com/docs/glossary/digital-employee/",
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/docs/getting-started/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/"
      ]
    },
    {
      "id": "L0015",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/conversation/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/conversation/index.md",
      "title": "Conversation",
      "description": "A conversation is Connect's channel-agnostic unit of exchange — one continuing exchange with one person, whether it arrived by email, WhatsApp, SMS or phone.",
      "summary": "A **conversation** is one continuing exchange with one person on one channel, and it is the unit the Conversations screen lists whatever the channel was: an email [thread](/docs/glossary/thread/), a WhatsApp exchange, an SMS exchange, a call. It is what Connect works on; a [relationship](/docs/glossary/relationship/) is what it accumulates into.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "sms",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/thread/",
        "https://connectbyjbrh.com/docs/glossary/person/",
        "https://connectbyjbrh.com/docs/glossary/relationship/",
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/research/one-person-many-channels/"
      ]
    },
    {
      "id": "L0028",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/customer-360/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/customer-360/index.md",
      "title": "Customer 360",
      "description": "Customer 360 is one person's whole history assembled across every channel — built when you ask for it, not stored as a separate record.",
      "summary": "**Customer 360** is one [person's](/docs/glossary/person/) whole history in one view: every email, call, WhatsApp message, deal, case, follow-up and remembered fact, gathered across channels rather than presented per channel. It is assembled from the records that already exist each time it is asked for, so it cannot be out of date with them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/person/",
        "https://connectbyjbrh.com/docs/glossary/relationship/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/research/one-person-many-channels/"
      ]
    },
    {
      "id": "L0042",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/customer-safe/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/customer-safe/index.md",
      "title": "Customer-safe",
      "description": "The allowlist that decides which API paths a customer session may call, how it differs from the rewrite that happens in the browser, and what its 403 means.",
      "summary": "`customer_safe` is the allowlist in Connect's HTTP middleware that decides which `/api/*` paths a customer session is permitted to call. A path it does not permit is refused with 403 before any handler runs. It is a route control, not a data control, and it is the usual reason a screen that works for the Owner returns nothing for a tenant.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/customer-facade/",
        "https://connectbyjbrh.com/docs/security/authorization/",
        "https://connectbyjbrh.com/docs/workflows/owner-tenant-routing/",
        "https://connectbyjbrh.com/docs/glossary/workspace-kernel/",
        "https://connectbyjbrh.com/docs/account/owner-vs-tenant/",
        "https://connectbyjbrh.com/docs/product/owner-and-customer/"
      ]
    },
    {
      "id": "L0024",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/deal/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/deal/index.md",
      "title": "Deal",
      "description": "Deal is the everyday word for an opportunity. Both appear in Connect because the screens speak plainly and the model and API do not.",
      "summary": "A **deal** is the same thing as an [opportunity](/docs/glossary/opportunity/): one piece of business with a value and a stage. There is one record and two words for it. *Opportunity* is the name in the data model, the API and this glossary; *deal* is what the screens and the sheets say, because that is what people say out loud.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/opportunity/",
        "https://connectbyjbrh.com/docs/glossary/lifecycle-stage/",
        "https://connectbyjbrh.com/docs/sales/pipeline/",
        "https://connectbyjbrh.com/docs/glossary/",
        "https://connectbyjbrh.com/developers/data-model-public/"
      ]
    },
    {
      "id": "L0003",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/digital-employee/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/digital-employee/index.md",
      "title": "Digital employee",
      "description": "The role-shaped definition of a Digital Business Employee, and the line that separates one from a task agent, a copilot or an automation.",
      "summary": "A Digital Business Employee is software defined by a **job** rather than by a feature: it owns a queue of incoming work, decides what each item needs, does as much as its permissions allow, and hands back what it may not do — carrying memory of the business between items. Connect is one. A tool you invoke and wait on is not.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/connect/",
        "https://connectbyjbrh.com/docs/glossary/autonomy/",
        "https://connectbyjbrh.com/docs/glossary/needs-you/",
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/research/authority-separation/"
      ]
    },
    {
      "id": "L0035",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/disposition/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/disposition/index.md",
      "title": "Disposition",
      "description": "A disposition is what a person decided a call was — stored apart from the engine's guess, and never overwritten by a model or a late carrier update.",
      "summary": "A **disposition** is a person's verdict on a call: what a human decided it actually was, recorded with who decided it. It is stored in its own field, separate from the [outcome](/docs/glossary/outcome/) the engine derived, and nothing automated ever writes over it — not the model, and not a carrier update that arrives after the call has ended.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/outcome/",
        "https://connectbyjbrh.com/docs/glossary/carrier/",
        "https://connectbyjbrh.com/docs/phone/call-record/",
        "https://connectbyjbrh.com/docs/phone/hangup-attribution/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "L0038",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/dnc/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/dnc/index.md",
      "title": "DNC",
      "description": "Do not contact is the strongest block a workspace can set on a person: every channel, no exceptions, and not something the Connect Assistant may clear.",
      "summary": "**DNC** — do not contact — is the strongest form of [suppression](/docs/glossary/suppression/): a flag on the person saying they are not to be contacted at all, on any channel, by anything. It is set and cleared by a person; the Connect Assistant is deliberately not permitted to clear one, and no allowance, rule or approval overrides it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/suppression/",
        "https://connectbyjbrh.com/docs/glossary/memory/",
        "https://connectbyjbrh.com/docs/email/dnc/",
        "https://connectbyjbrh.com/docs/email/unsubscribe/",
        "https://connectbyjbrh.com/docs/relationships/people/"
      ]
    },
    {
      "id": "L0039",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/entitlement/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/entitlement/index.md",
      "title": "Entitlement",
      "description": "An entitlement records what a workspace's subscription permits: which features it reaches and what daily volumes it may use, as two separate questions.",
      "summary": "An **entitlement** is what a workspace's subscription permits. It holds which commercial arrangement the workspace is on, whether that arrangement is in good standing, the daily limits it carries, and whether outbound mail must carry a sending signature. Feature access and usage volume are stored as separate things, and neither of them can move a safety rule.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/allowance/",
        "https://connectbyjbrh.com/docs/glossary/autonomy/",
        "https://connectbyjbrh.com/docs/account/entitlements/",
        "https://connectbyjbrh.com/docs/account/plan/",
        "https://connectbyjbrh.com/docs/glossary/workspace/"
      ]
    },
    {
      "id": "L0011",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/fact/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/fact/index.md",
      "title": "Fact",
      "description": "A fact in Connect is one grounded statement with provenance, extracted from knowledge or a conversation — and correctable on its own.",
      "summary": "A **fact** is a single grounded statement Connect holds — *the returns window is fourteen days* — extracted from a [knowledge](/docs/glossary/knowledge/) source or from a conversation, and carrying where it came from. Facts are managed one at a time, which is what makes a wrong one correctable without editing a document.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/knowledge/",
        "https://connectbyjbrh.com/docs/glossary/memory/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/research/grounding-without-a-vector-database/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/"
      ]
    },
    {
      "id": "L0025",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/follow-up/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/follow-up/index.md",
      "title": "Follow-up",
      "description": "A follow-up is a dated commitment to make contact on a named channel, with the reason recorded — including one channel that never sends anything.",
      "summary": "A **follow-up** is a dated commitment to make contact: a time it is due, a channel it will happen on, and the reason it exists. Connect creates them from promises made in conversations and from stage changes, drains the ones it is permitted to act on, and shows the rest to a person. One channel — *task* — is never sent by anything.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/approval/",
        "https://connectbyjbrh.com/docs/glossary/opportunity/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/task-channel/",
        "https://connectbyjbrh.com/research/callback-promises/"
      ]
    },
    {
      "id": "L0018",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/identity/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/identity/index.md",
      "title": "Identity",
      "description": "An identity is one address on one channel that resolves to a person — and it is not your own mailbox, not a sign-in, and never guessed.",
      "summary": "An **identity** is one address on one channel belonging to one [person](/docs/glossary/person/): an email address, a phone number, a WhatsApp number. It is how an arriving message finds its person, and it is the smallest unit of *how someone reaches you* — never a guess, and never your own address.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/person/",
        "https://connectbyjbrh.com/docs/glossary/mailbox/",
        "https://connectbyjbrh.com/docs/glossary/relationship/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/"
      ]
    },
    {
      "id": "L0010",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/knowledge/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/knowledge/index.md",
      "title": "Knowledge",
      "description": "Knowledge is the source material a workspace supplies for answers to be grounded in — what counts as a source, and why it is not the same as memory.",
      "summary": "**Knowledge** is the material a workspace supplies so that Connect's answers are grounded in something the business actually said: product pages, policies, price sheets, service descriptions, past answers worth reusing. It is the difference between a reply built from your material and a reply built from a model's general impression of your industry.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/fact/",
        "https://connectbyjbrh.com/docs/glossary/memory/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/research/grounding-without-a-vector-database/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/"
      ]
    },
    {
      "id": "L0022",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/lead/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/lead/index.md",
      "title": "Lead",
      "description": "A lead in Connect is a contact captured from a conversation you were already having — a different record from a prospect, and from a person.",
      "summary": "A **lead** is somebody who has shown interest, captured from a conversation rather than from research: an enquiry, a reply, a caller. In Connect it is a contact row carrying a name, the ways of reaching them, a pipeline stage, a score and a do-not-contact flag, and it is what the Leads sheet and the Assistant's lead tools read.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/prospect/",
        "https://connectbyjbrh.com/docs/glossary/opportunity/",
        "https://connectbyjbrh.com/docs/glossary/person/",
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "L0027",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/lifecycle-stage/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/lifecycle-stage/index.md",
      "title": "Lifecycle stage",
      "description": "A lifecycle stage says how far one relationship has got, in six words — and the transition into client is the one Connect may not make alone.",
      "summary": "A **lifecycle stage** is where one relationship has got to, chosen from six: prospect, qualified, opportunity, client, onboarding, active. It sits on the [person](/docs/glossary/person/), not on a deal, and every move is written down separately with who made it and why — so the stage answers *what are they to us now* and the history answers *since when, and on whose say-so*.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/opportunity/",
        "https://connectbyjbrh.com/docs/glossary/prospect/",
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/",
        "https://connectbyjbrh.com/docs/relationships/stage-normalisation/",
        "https://connectbyjbrh.com/docs/glossary/relationship/"
      ]
    },
    {
      "id": "L0029",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/mailbox/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/mailbox/index.md",
      "title": "Mailbox",
      "description": "A mailbox is one email account connected to a workspace, with its own role, signature and autonomy — and it is not the same thing as an identity.",
      "summary": "A **mailbox** is one email account a workspace has connected — a Gmail account, a Microsoft 365 account, or any IMAP and SMTP server. A workspace may hold several. Each carries its own role, its own signature and its own [autonomy](/docs/glossary/autonomy/) rule, and mail arrives and leaves through the mailbox rather than through the workspace in general.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/channel/",
        "https://connectbyjbrh.com/docs/glossary/identity/",
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/email/mailbox-roles/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/"
      ]
    },
    {
      "id": "L0009",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/memory/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/memory/index.md",
      "title": "Memory",
      "description": "Memory in Connect is what it knows about a business and its people, held at four tiers and resolved narrowest-first — readable and erasable at each one.",
      "summary": "**Memory** is what Connect knows about a business and the people it deals with, held at four tiers — workspace, channel, endpoint, contact — and resolved narrowest-first for each piece of work. It is a record you can read and erase at every tier, not a transcript of past chats and not a longer prompt.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/knowledge/",
        "https://connectbyjbrh.com/docs/glossary/standing-instruction/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/research/structured-business-memory/",
        "https://connectbyjbrh.com/research/relationship-memory/"
      ]
    },
    {
      "id": "L0007",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/needs-you/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/needs-you/index.md",
      "title": "Needs You",
      "description": "Needs You is the ranked queue of decisions, approvals and operational problems waiting for a person — what qualifies for it and how it empties.",
      "summary": "**Needs You** is the one place Connect puts everything that requires a person: a held reply waiting for a yes, a judgement it declined to make alone, and an operational problem such as a phone line that is not healthy. It is ranked by what is at stake rather than sorted by arrival, and an item leaves when its cause clears.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/approval/",
        "https://connectbyjbrh.com/docs/glossary/autonomy/",
        "https://connectbyjbrh.com/docs/glossary/follow-up/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "L0023",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/opportunity/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/opportunity/index.md",
      "title": "Opportunity",
      "description": "An opportunity is one commercial deal on the pipeline, with a value and one of five stages — and winning it is a change only a person confirms.",
      "summary": "An **opportunity** is one commercial deal Connect tracks on the pipeline: a title, a value, the person and company it belongs to, and exactly one of five stages — open, proposal sent, negotiating, won or lost. The first three are the open stages that make up the pipeline; the last two close it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/deal/",
        "https://connectbyjbrh.com/docs/glossary/lifecycle-stage/",
        "https://connectbyjbrh.com/docs/sales/opportunities/",
        "https://connectbyjbrh.com/docs/sales/won-and-lost/",
        "https://connectbyjbrh.com/research/evidence-for-next-action/"
      ]
    },
    {
      "id": "L0036",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/outcome/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/outcome/index.md",
      "title": "Outcome",
      "description": "An outcome is the engine's verdict on a call, derived from the conversation — and it decides whether anything is scheduled to happen next.",
      "summary": "An **outcome** is what Connect's engine concluded a call was, derived from the conversation itself: a new enquiry, a demo request, a pricing question, support, a complaint, something not relevant, or a call that never became a conversation at all. It is stored beside — never on top of — the [disposition](/docs/glossary/disposition/) a person sets.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/disposition/",
        "https://connectbyjbrh.com/docs/glossary/follow-up/",
        "https://connectbyjbrh.com/docs/phone/call-outcome/",
        "https://connectbyjbrh.com/docs/phone/not-a-conversation/",
        "https://connectbyjbrh.com/research/silent-failure/"
      ]
    },
    {
      "id": "L0005",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/owner/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/owner/index.md",
      "title": "Owner",
      "description": "Owner in Connect means the platform operator's own workspace and session — what that changes, and the three things that are correctly operator-only.",
      "summary": "**Owner** is the platform operator's own workspace and session: JBRH Digital Solutions using Connect for its own business, in a workspace with no plan and no allowances. It is not a permission level, and it is not the person who owns your company — a customer's most senior administrator is not an Owner in this sense.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/tenant/",
        "https://connectbyjbrh.com/docs/glossary/workspace/",
        "https://connectbyjbrh.com/docs/glossary/customer-safe/",
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/"
      ]
    },
    {
      "id": "L0017",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/person/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/person/index.md",
      "title": "Person",
      "description": "A person is the canonical human record in Connect: one human however many addresses they use, and the thing every conversation resolves to.",
      "summary": "A **person** is one human in a workspace's relationships — a single record however many addresses, numbers and channels they reach you on. Every conversation resolves to a person through an [identity](/docs/glossary/identity/), and it is the person that carries history, memory and lifecycle stage.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/identity/",
        "https://connectbyjbrh.com/docs/glossary/relationship/",
        "https://connectbyjbrh.com/docs/glossary/company/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/one-person-many-channels/"
      ]
    },
    {
      "id": "L0021",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/prospect/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/prospect/index.md",
      "title": "Prospect",
      "description": "A prospect is an organisation research found and kept as a candidate — held deliberately even before any contact address for it exists.",
      "summary": "A **prospect** is an organisation or person Connect's research discovered, kept as a candidate record that is not yet a relationship. Discovery and contactability are separate on purpose: a prospect is stored the moment the organisation is identified, whether or not a usable public address for it has been found, and it never carries an address that was guessed.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/lead/",
        "https://connectbyjbrh.com/docs/glossary/lifecycle-stage/",
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/"
      ]
    },
    {
      "id": "L0031",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/provider/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/provider/index.md",
      "title": "Provider",
      "description": "A provider is the external service behind a channel — the mail host, the messaging platform, the carrier. Connect keeps their shape out of its own records.",
      "summary": "A **provider** is the external service that actually carries a [channel](/docs/glossary/channel/): Gmail or Microsoft Graph or an IMAP and SMTP server for email, a WhatsApp Business provider for WhatsApp, a [carrier](/docs/glossary/carrier/) for the telephone. Connect speaks to each through an adapter, and what the provider returns is translated into Connect's own records before anything downstream reads it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/channel/",
        "https://connectbyjbrh.com/docs/glossary/carrier/",
        "https://connectbyjbrh.com/docs/glossary/mailbox/",
        "https://connectbyjbrh.com/docs/technology/",
        "https://connectbyjbrh.com/research/provider-independent-telephony/"
      ]
    },
    {
      "id": "L0019",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/relationship/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/relationship/index.md",
      "title": "Relationship",
      "description": "A relationship is the ongoing connection between a business and a person or company — everything that has happened, across channels and years, in one record.",
      "summary": "A **relationship** is the standing connection between your business and one [person](/docs/glossary/person/) or [company](/docs/glossary/company/): every conversation on every channel, the commitments made, the deals and cases, and what Connect remembers. Conversations end; a relationship does not, which is why it is the record worth looking at before you reply.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/person/",
        "https://connectbyjbrh.com/docs/glossary/company/",
        "https://connectbyjbrh.com/docs/glossary/customer-360/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/relationship-memory/"
      ]
    },
    {
      "id": "L0012",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/rule/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/rule/index.md",
      "title": "Rule",
      "description": "A rule in Connect constrains behaviour rather than granting permission — where rules are written, and how they differ from filters and from autonomy.",
      "summary": "A **rule** is a constraint on how Connect behaves — what it must always do, what it must never do, and where the edge of its judgement lies. Rules live on the Connect Rules screen alongside behaviour settings and the intelligence boundary. A rule narrows what Connect will do; it never widens what it is allowed to do.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/autonomy/",
        "https://connectbyjbrh.com/docs/glossary/standing-instruction/",
        "https://connectbyjbrh.com/docs/glossary/audit/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/authority-separation/"
      ]
    },
    {
      "id": "L0008",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/standing-instruction/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/standing-instruction/index.md",
      "title": "Standing instruction",
      "description": "A standing instruction is a durable direction a person gives Connect — how it differs from a memory, from a rule and from an autonomy setting.",
      "summary": "A **standing instruction** is a direction you give Connect that keeps applying until you change it — *always copy the accounts address on an invoice question*, *never contact this person on WhatsApp*. It is an instruction rather than a fact, it outlives the conversation it was given in, and it is visible and reversible rather than buried in a prompt.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/memory/",
        "https://connectbyjbrh.com/docs/glossary/rule/",
        "https://connectbyjbrh.com/docs/glossary/autonomy/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/"
      ]
    },
    {
      "id": "L0026",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/support-case/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/support-case/index.md",
      "title": "Support case",
      "description": "A support case is one post-sale thing a customer needs sorted out, with a state and an owner — and deliberately not a helpdesk ticket.",
      "summary": "A **support case** is one thing a customer needs sorted out after they have bought: a subject, the detail, the person it belongs to, the conversation it came from, a priority, and a state — open, waiting on the customer, resolved or closed. It exists so that *what is still open for this customer?* has an answer without a second product.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/conversation/",
        "https://connectbyjbrh.com/docs/glossary/customer-360/",
        "https://connectbyjbrh.com/docs/support/cases/",
        "https://connectbyjbrh.com/docs/support/resolving/",
        "https://connectbyjbrh.com/docs/support/"
      ]
    },
    {
      "id": "L0037",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/suppression/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/suppression/index.md",
      "title": "Suppression",
      "description": "Suppression is a standing block on contacting an address or number. It outranks every other reason to send, and its origin decides whether it can be lifted.",
      "summary": "**Suppression** is a standing block on contacting one address or number. It is checked before every outbound message, it outranks anything that would otherwise permit the send — a rule, an [approval](/docs/glossary/approval/), an allowance with room left — and where its state cannot be read, the send is refused rather than attempted.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/dnc/",
        "https://connectbyjbrh.com/docs/glossary/approval/",
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/email/unsubscribe/",
        "https://connectbyjbrh.com/docs/troubleshooting/suppressed-recipient/"
      ]
    },
    {
      "id": "L0006",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/tenant/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/tenant/index.md",
      "title": "Tenant",
      "description": "Tenant is the engineering word for a customer workspace: where it appears, why the product says customer instead, and what it is not.",
      "summary": "A **tenant** is a customer workspace — one business's account, isolated from every other. The word is engineering vocabulary: it appears in route names, isolation code and this manual's technical pages, while the same thing is called a *customer* in prose written for the business using it. Both name the identical record.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/workspace/",
        "https://connectbyjbrh.com/docs/glossary/owner/",
        "https://connectbyjbrh.com/docs/glossary/customer-safe/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/closed-by-default-facade/"
      ]
    },
    {
      "id": "L0016",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/thread/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/thread/index.md",
      "title": "Thread",
      "description": "A thread is the email-shaped conversation in Connect: what joins messages into one, what does not, and the triage state the engine reads from it.",
      "summary": "A **thread** is the email-shaped [conversation](/docs/glossary/conversation/): the messages of one exchange, joined by mail's own threading references rather than by their subject line, held as one canonical record with its own triage state. Every thread is a conversation; not every conversation is a thread.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/conversation/",
        "https://connectbyjbrh.com/docs/glossary/mailbox/",
        "https://connectbyjbrh.com/docs/glossary/person/",
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/research/cursor-loss/"
      ]
    },
    {
      "id": "L0034",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/voice-lab/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/voice-lab/index.md",
      "title": "Voice Lab",
      "description": "Voice Lab is where a workspace tunes how Connect sounds on the phone and reviews finished calls against measurements the worker took on the wire.",
      "summary": "**Voice Lab** is the screen where a workspace tunes the realtime phone voice and reviews how it performed. Its settings split in two: some become parameters the model session is opened with, and the rest become written directions inside the instructions. The review half turns a finished call into measurements and findings, each paired with the setting that would address it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/outcome/",
        "https://connectbyjbrh.com/docs/phone/voice-lab/",
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/research/model-limited-findings/"
      ]
    },
    {
      "id": "L0041",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/workspace-kernel/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/workspace-kernel/index.md",
      "title": "Workspace kernel",
      "description": "The layer that filters every database query by workspace, why it is not the same thing as row-level security, and what an empty workspace stamp does to a record.",
      "summary": "The workspace kernel is the object-relational layer in Connect that adds a workspace filter to every query before it reaches PostgreSQL, and stamps the owning workspace on every row it writes. It is the middle of three isolation layers: a route allowlist above it, row-level security in the database below it. It lives in `workspace_kernel.py`.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/security/rls/",
        "https://connectbyjbrh.com/docs/glossary/customer-safe/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/technology/row-level-security/",
        "https://connectbyjbrh.com/research/workspace-stamp/"
      ]
    },
    {
      "id": "L0004",
      "kind": "glossary",
      "url": "https://connectbyjbrh.com/docs/glossary/workspace/",
      "markdown": "https://connectbyjbrh.com/docs/glossary/workspace/index.md",
      "title": "Workspace",
      "description": "The isolation root in Connect: what belongs to one workspace, how the boundary is enforced three times, and what deliberately sits outside it.",
      "summary": "A workspace is the isolation root. Every record Connect holds — a mailbox, a thread, a call, a person, a memory, an autonomy rule, a follow-up — belongs to exactly one workspace, and no query returns a row from another. One business is one workspace; the platform operator's own is a workspace too.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/tenant/",
        "https://connectbyjbrh.com/docs/glossary/owner/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/research/workspace-stamp/"
      ]
    },
    {
      "id": "G0021",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/index.md",
      "title": "How-to guides",
      "description": "Task-shaped instructions for Connect: each guide is one job from first action to proof it worked, with the recovery when it did not.",
      "summary": "Every page under this hub is a single job done end to end. Each one names the screen, gives the steps with the result you should see after each, then says how to prove the change took effect and what to do when it did not. If you want the concepts instead of the tasks, the section pages for autonomy, memory, email and phone are the better starting point.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/",
        "https://connectbyjbrh.com/docs/how-to/stop-connect-immediately/",
        "https://connectbyjbrh.com/docs/how-to/correct-a-mistake/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/docs/workflows/"
      ]
    },
    {
      "id": "G0025",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/add-a-second-mailbox/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/add-a-second-mailbox/index.md",
      "title": "Add a second mailbox",
      "description": "A workspace can hold several mailboxes, each with its own role, signature, autonomy and health. What to set, and what changes about replies.",
      "summary": "Add it on the Mailboxes screen, give it a role and a signature, and set its autonomy separately from the first mailbox's. Adding one changes nothing about existing threads: replies keep going out from the mailbox the conversation already belongs to. What changes is that new mail arriving at the second address is triaged, drafted and answered under that mailbox's own rules.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/email/mailbox-roles/",
        "https://connectbyjbrh.com/docs/email/quiet-mailbox/",
        "https://connectbyjbrh.com/docs/email/mailbox-autonomy/",
        "https://connectbyjbrh.com/docs/how-to/route-mail-to-a-person/",
        "https://connectbyjbrh.com/research/invisible-not-missing/"
      ]
    },
    {
      "id": "G0045",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/ask-connect-about-a-customer/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/ask-connect-about-a-customer/index.md",
      "title": "Ask Connect about a customer",
      "description": "Get an answer about one customer that is worth acting on: the question to ask first, the four follow-ups that add most, and how to tell an answer from a guess.",
      "summary": "Ask the Connect Assistant from the customer's own record rather than from a blank screen, because the record is what the answer is grounded in. Start with the whole history, then narrow: what was promised, what is open, what was refused, what to do next. Each of those maps to a different tool and a different set of records.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/assistant/uncertainty/",
        "https://connectbyjbrh.com/docs/assistant/evidence-and-citation/",
        "https://connectbyjbrh.com/docs/how-to/check-what-connect-knows/",
        "https://connectbyjbrh.com/docs/relationships/duplicates/"
      ]
    },
    {
      "id": "G0044",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/attach-a-document-to-a-deal/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/attach-a-document-to-a-deal/index.md",
      "title": "Attach a document to a deal",
      "description": "Put a quote, a specification or a signed order on an opportunity so that Connect can answer from it, and so the next version does not overwrite the last.",
      "summary": "Attach the file from the opportunity itself. It is stored once by the file service, linked to the deal, and becomes readable by the Assistant against that record. Replacing it later creates a new version rather than overwriting the old one, so the quote that was actually sent is still retrievable after three rounds of revision.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/linking-files/",
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/sales/quotes-and-documents/",
        "https://connectbyjbrh.com/docs/how-to/give-connect-a-document/",
        "https://connectbyjbrh.com/docs/files-data/supported-formats/",
        "https://connectbyjbrh.com/docs/sales/safe-sales/"
      ]
    },
    {
      "id": "G0037",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/audit-a-decision/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/audit-a-decision/index.md",
      "title": "Find out why Connect did something",
      "description": "Trace an action back to the rule that produced it: what the decision log records, how to read it, and why refusals appear there as decisions too.",
      "summary": "Open the decision log and find the action. Each entry records what was decided, by what, under which rule, and what happened — refusals included, because a refusal is a decision. That chain is what turns \"why did it do that\" from a theory about settings into a fact you can read, months after the settings have changed.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/phone/call-outcome/",
        "https://connectbyjbrh.com/docs/how-to/correct-a-mistake/",
        "https://connectbyjbrh.com/docs/how-to/find-why-a-reply-was-held/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/"
      ]
    },
    {
      "id": "G0027",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/block-a-sender/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/block-a-sender/index.md",
      "title": "Block someone",
      "description": "A block is one directive stored against the person, tagged per channel, so it holds on email, WhatsApp, SMS and phone and in future conversations.",
      "summary": "Set the block on the person, from the contact panel or the memory viewer. It is stored as a directive against that contact with a channel tag, which is why one action holds everywhere rather than needing repeating per channel — and why it applies to conversations that do not exist yet. Removing it is the same action in reverse, and takes effect from the next piece of work.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/email/blocking/",
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/email/dnc/",
        "https://connectbyjbrh.com/docs/how-to/check-what-connect-knows/",
        "https://connectbyjbrh.com/docs/how-to/clean-up-your-suppression-list/"
      ]
    },
    {
      "id": "G0043",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/bulk-update-records/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/bulk-update-records/index.md",
      "title": "Update many records at once",
      "description": "Change many rows at once in the Data grid without turning it into a second database: selection, bulk actions, the services underneath, and what gets refused.",
      "summary": "Select rows in the Data grid, choose a bulk action, and every change is applied one record at a time by the service that owns that record — the same code path an edit on the record's own screen would take. That is why some rows in a selection succeed and others are refused, and why the refusals are worth reading rather than retrying.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/files-data/bulk-actions/",
        "https://connectbyjbrh.com/docs/files-data/saved-views/",
        "https://connectbyjbrh.com/docs/how-to/import-contacts/",
        "https://connectbyjbrh.com/docs/how-to/export-your-data/",
        "https://connectbyjbrh.com/docs/troubleshooting/grid-edit-refused/"
      ]
    },
    {
      "id": "G0024",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/change-the-voice/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/change-the-voice/index.md",
      "title": "Change how Connect sounds on the phone",
      "description": "The Voice Lab splits settings that reach the engine from directions that only ask the model. How to change one, and prove it with a test call.",
      "summary": "Open the Voice Lab from the Phone screen's setup area, change one control, then place a test call and read its review. The realtime path is speech-to-speech, so there is no synthesiser with a pitch dial: half the controls become real session parameters and the other half become lines of instruction the model is asked to follow. The Lab labels which is which, and the distinction decides how reliably your change lands.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-lab/",
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/docs/how-to/review-a-call/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/research/model-limited-findings/"
      ]
    },
    {
      "id": "G0023",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/change-what-connect-says/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/change-what-connect-says/index.md",
      "title": "Change how Connect writes",
      "description": "Tone, length and signature are owned by three different controls in Connect. Which one to change, in what order, and how to see the effect.",
      "summary": "Three separate controls decide how a reply reads, and picking the wrong one is why an edit appears to do nothing. Behaviour text on the Connect Rules screen owns register and length. The mailbox owns the signature. Knowledge owns the facts a reply is grounded in. Memory and thread guidance override any of them for one channel, one mailbox or one person.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/email/mailbox-signature/",
        "https://connectbyjbrh.com/docs/email/guidance/",
        "https://connectbyjbrh.com/docs/how-to/write-a-standing-instruction/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/"
      ]
    },
    {
      "id": "G0059",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/check-a-number-before-going-live/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/check-a-number-before-going-live/index.md",
      "title": "Check a phone number before you go live",
      "description": "Prove a phone number end to end before you publish it, one segment at a time, using only a handset you already hold and the records each test leaves behind.",
      "summary": "The path from a caller to an answer has four segments that fail independently: the carrier leg, the routing row, the worker and model session, and the record written afterwards. Test them in that order with your own handset. A single call that felt fine proves only whichever segments it happened to touch, which is why the tests are separate.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/make-a-test-call/",
        "https://connectbyjbrh.com/docs/phone/carrier-verification/",
        "https://connectbyjbrh.com/docs/phone/phone-health/",
        "https://connectbyjbrh.com/docs/troubleshooting/phone-line-not-ringing/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-answered-in-silence/",
        "https://connectbyjbrh.com/docs/how-to/review-a-call/",
        "https://connectbyjbrh.com/docs/phone/softphone/"
      ]
    },
    {
      "id": "G0052",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/check-what-connect-knows/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/check-what-connect-knows/index.md",
      "title": "Check what Connect knows about a person",
      "description": "Read everything Connect holds about one person, tier by tier, work out which tier is driving behaviour, and correct it so the change actually sticks.",
      "summary": "Open the memory viewer from the person's record. It shows four tiers — workspace, channel, endpoint and contact — and returns each one even when it is empty, so 'nothing is set here' is a visible answer rather than an absence you have to infer. The narrowest tier that holds something is the one shaping behaviour.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/memory/viewing/",
        "https://connectbyjbrh.com/docs/memory/superseding/",
        "https://connectbyjbrh.com/docs/memory/directives/",
        "https://connectbyjbrh.com/docs/how-to/correct-a-mistake/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/",
        "https://connectbyjbrh.com/docs/compare/knowledge-vs-memory/"
      ]
    },
    {
      "id": "G0039",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/clean-up-duplicates/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/clean-up-duplicates/index.md",
      "title": "Clean up duplicate records",
      "description": "Two records for one human split their history in half. Finding the pairs, merging safely, and the four things to check on the survivor afterwards.",
      "summary": "Connect proposes duplicate pairs; merging them is always a person's decision, never automatic. A merge preserves both sides — identities, lifecycle stages, follow-ups, deals, demos, cases and onboarding all survive — so the risk is not losing data, it is merging two people who genuinely are two people. Check the identities before you confirm, and check the survivor afterwards.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/how-to/import-contacts/",
        "https://connectbyjbrh.com/docs/how-to/check-what-connect-knows/",
        "https://connectbyjbrh.com/docs/prospects/prospect-identity/",
        "https://connectbyjbrh.com/research/one-person-many-channels/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/"
      ]
    },
    {
      "id": "G0060",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/clean-up-your-suppression-list/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/clean-up-your-suppression-list/index.md",
      "title": "Review your suppression list",
      "description": "Read the suppression list properly: where each entry came from, which kinds may be cleared, and why most of a tidy-up is leaving things exactly where they are.",
      "summary": "Suppression is a list of people who must not be contacted, and every entry has an origin: an unsubscribe, a complaint, a bounce, a STOP on SMS, an opt-out on WhatsApp, or a do-not-contact decision. Reviewing it means checking the origins are right — not shortening the list. Most entries should stay, and one kind should effectively never be cleared.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/email/dnc/",
        "https://connectbyjbrh.com/docs/email/unsubscribe/",
        "https://connectbyjbrh.com/docs/email/complaints/",
        "https://connectbyjbrh.com/docs/how-to/block-a-sender/",
        "https://connectbyjbrh.com/docs/compare/suppression-vs-block/",
        "https://connectbyjbrh.com/docs/prospects/compliance-check/"
      ]
    },
    {
      "id": "G0050",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/close-the-loop-on-a-promise/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/close-the-loop-on-a-promise/index.md",
      "title": "Make sure a promise is kept",
      "description": "Find every commitment a customer is waiting on, check each has something behind it that will actually fire, and close the ones that no longer mean anything.",
      "summary": "A promise is only kept if it exists as a follow-up, on a channel that can carry it, with a reason attached. Anything else — a line in a transcript, a sentence in a thread, an intention in somebody's head — is not a commitment the system can act on. The weekly job is turning the first kind into the second and closing what has gone stale.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/reason/",
        "https://connectbyjbrh.com/docs/follow-ups/overdue/",
        "https://connectbyjbrh.com/docs/follow-ups/task-channel/",
        "https://connectbyjbrh.com/docs/phone/promise-integrity/",
        "https://connectbyjbrh.com/research/callback-promises/",
        "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-booked/"
      ]
    },
    {
      "id": "G0041",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/connect-a-second-number/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/connect-a-second-number/index.md",
      "title": "Add a second phone number",
      "description": "Claim a second business line: the carrier side, the channel route, the purpose that decides its voice, and the checks that prove it actually rings.",
      "summary": "A second line is four decisions rather than a migration. The carrier has to point the number at Connect, Connect has to hold a `channel_routes` row for it, the line needs a purpose, and it needs its own autonomy. Voice then follows from the purpose or from the number itself, so a service line and an outbound line can sound different without running a second engine.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/business-number/",
        "https://connectbyjbrh.com/docs/phone/line-configuration/",
        "https://connectbyjbrh.com/docs/phone/carrier-routing/",
        "https://connectbyjbrh.com/docs/how-to/use-a-different-voice-per-line/",
        "https://connectbyjbrh.com/docs/how-to/check-a-number-before-going-live/",
        "https://connectbyjbrh.com/docs/autonomy/scopes/"
      ]
    },
    {
      "id": "G0028",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/correct-a-mistake/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/correct-a-mistake/index.md",
      "title": "Correct something Connect got wrong",
      "description": "Four places a correction can live in Connect — this message, this thread, this person, or the whole business — and how to pick the right one.",
      "summary": "Fix the message in front of you, then decide where the lesson belongs. A correction can live on one message, on one thread as guidance, on the person or channel as memory, or in Knowledge as a fact the whole business answers from. Editing a draft fixes the message and teaches nothing; a rejection on its own is a decision about one reply rather than a lesson.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/email/guidance/",
        "https://connectbyjbrh.com/docs/how-to/audit-a-decision/",
        "https://connectbyjbrh.com/docs/how-to/check-what-connect-knows/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/"
      ]
    },
    {
      "id": "G0030",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/export-your-data/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/export-your-data/index.md",
      "title": "Export your data",
      "description": "Exporting from the Connect data grid: which sheets, what CSV carries, and why an exported cell can look escaped when it starts with an equals sign.",
      "summary": "Export from the data grid, which is an Excel-like view over thirteen record sheets — companies, people, leads, prospects, follow-ups, deals, conversations, calls, cases, onboarding, knowledge, files and memory. CSV is the format. Export applies your current view, so filter and choose columns first, and expect any cell that begins like a formula to come out neutralised on purpose.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/how-to/bulk-update-records/",
        "https://connectbyjbrh.com/docs/how-to/import-contacts/",
        "https://connectbyjbrh.com/docs/how-to/recover-a-deleted-record/",
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/research/grid-over-services/"
      ]
    },
    {
      "id": "G0046",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/find-why-a-reply-was-held/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/find-why-a-reply-was-held/index.md",
      "title": "Find out why a reply was held",
      "description": "Work backwards from a reply that has not gone out to the exact setting that stopped it, in the order the holds are actually evaluated.",
      "summary": "Four things hold an outbound reply and they are checked in order: the channel's autonomy mode, a narrower rule set at a closer scope, the daily allowance, and a suppression on the recipient. Diagnosing a held reply means finding which of the four fired, and the Decision Log names it directly rather than leaving you to infer it from settings.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/scopes/",
        "https://connectbyjbrh.com/docs/how-to/audit-a-decision/",
        "https://connectbyjbrh.com/docs/troubleshooting/draft-never-sent/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/"
      ]
    },
    {
      "id": "G0051",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/give-connect-a-document/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/give-connect-a-document/index.md",
      "title": "Give Connect a document to answer from",
      "description": "Knowledge or attachment: which one a document belongs in, how to load it so answers are grounded in it, and the retrieval test that proves it took.",
      "summary": "If the document should shape answers everywhere and for months, it belongs in Knowledge. If it matters to one conversation or one deal, attach it there. The distinction is not about size — it is about whether you want the content retrievable by every future answer or scoped to the record it came with.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/knowledge/facts/",
        "https://connectbyjbrh.com/docs/knowledge/retrieval-test/",
        "https://connectbyjbrh.com/docs/knowledge/prompt-injection/",
        "https://connectbyjbrh.com/docs/how-to/attach-a-document-to-a-deal/",
        "https://connectbyjbrh.com/docs/files-data/supported-formats/",
        "https://connectbyjbrh.com/docs/compare/knowledge-vs-memory/"
      ]
    },
    {
      "id": "G0054",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/hand-over-to-a-colleague/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/hand-over-to-a-colleague/index.md",
      "title": "Hand a conversation to a colleague",
      "description": "Move a conversation to somebody else without losing the context: what transfers by itself, what you have to write down, and what the customer notices.",
      "summary": "Almost everything transfers by itself, because the record belongs to the workspace rather than to you: the thread, the timeline, memory, knowledge and any open commitments are already shared. What does not transfer is the part that only existed in your head — why the last decision was made, and what you were about to do next.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/how-to/share-a-record/",
        "https://connectbyjbrh.com/docs/follow-ups/task-channel/",
        "https://connectbyjbrh.com/docs/memory/person-memory/",
        "https://connectbyjbrh.com/docs/autonomy/standing-instructions/",
        "https://connectbyjbrh.com/docs/how-to/set-up-for-a-holiday/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/"
      ]
    },
    {
      "id": "G0034",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/handle-a-vip/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/handle-a-vip/index.md",
      "title": "Give one customer special treatment",
      "description": "Give one account slower, more careful handling without changing anything for everybody else: contact-scope autonomy, memory and guidance used together.",
      "summary": "Set the rules against the person rather than the channel. Autonomy and memory both resolve at four scopes with the narrowest winning, and a contact is the narrowest, so a rule on one account overrides everything above it. Three settings do the work: hold their replies for a person, record how they are to be handled, and give their conversations the priority the engine reads.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/how-to/route-mail-to-a-person/",
        "https://connectbyjbrh.com/docs/how-to/check-what-connect-knows/",
        "https://connectbyjbrh.com/research/relationship-memory/"
      ]
    },
    {
      "id": "G0031",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/import-contacts/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/import-contacts/index.md",
      "title": "Import contacts",
      "description": "Bringing a contact list into Connect: preparing the file, mapping columns, what identity resolution does with each row, and where bad rows end up.",
      "summary": "Prepare a spreadsheet with one row per human, map the columns to fields, and import. Each row is resolved against the people already in the workspace rather than appended blindly, which is why the same list imported twice does not double your records. Rows that cannot be resolved are surfaced rather than quietly discarded, and no address is ever invented for a row that lacks one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/prospect-upload/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/how-to/clean-up-duplicates/",
        "https://connectbyjbrh.com/docs/how-to/export-your-data/",
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/"
      ]
    },
    {
      "id": "G0056",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/measure-whether-it-is-working/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/measure-whether-it-is-working/index.md",
      "title": "Measure whether Connect is working",
      "description": "Five numbers Connect already reports that tell you whether it is earning its place, what each one moves with, and the vanity metrics to ignore.",
      "summary": "Watch five things weekly: how old the oldest item in the queue is, how often a draft is sent unedited, whether overdue commitments are shrinking, the call review score with its model-limited count beside it, and allowance consumption against the plan. All five come from what the product already records — none requires a spreadsheet.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/weekly-review/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you-ranking/",
        "https://connectbyjbrh.com/docs/follow-ups/overdue/",
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
        "https://connectbyjbrh.com/docs/account/usage/",
        "https://connectbyjbrh.com/docs/how-to/reduce-your-costs/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/"
      ]
    },
    {
      "id": "G0036",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/prepare-for-a-busy-week/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/prepare-for-a-busy-week/index.md",
      "title": "Prepare for a busy period",
      "description": "Four things to check before a peak: the daily allowance, autonomy on each channel, line hours and capacity, and who is actually working the queue.",
      "summary": "Check the allowance against the volume you expect, decide which channels are trusted to answer without a person, confirm the phone lines and their capacity, and name who works the queue each day. A spent allowance holds work rather than dropping it, so the failure of an unprepared peak is a backlog nobody planned for rather than lost mail.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/phone/phone-health/",
        "https://connectbyjbrh.com/docs/how-to/set-up-for-a-holiday/",
        "https://connectbyjbrh.com/docs/how-to/measure-whether-it-is-working/",
        "https://connectbyjbrh.com/docs/getting-started/read-needs-you/"
      ]
    },
    {
      "id": "G0053",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/recover-a-deleted-record/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/recover-a-deleted-record/index.md",
      "title": "Recover something that was removed",
      "description": "What can be brought back after a deletion, where it is recovered from, and the four things that are genuinely gone — with the reason each one is.",
      "summary": "Most removals in Connect are marks rather than erasures: a deleted conversation or call carries a deletion timestamp and the row is still there, and a modified file becomes a new version with the old one intact. What is genuinely irreversible is anything that has already left — a message a provider acknowledged, or a call that was placed.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/memory/deleting/",
        "https://connectbyjbrh.com/docs/troubleshooting/cannot-delete/",
        "https://connectbyjbrh.com/docs/troubleshooting/data-not-visible/",
        "https://connectbyjbrh.com/research/undo-for-agents/",
        "https://connectbyjbrh.com/research/workspace-stamp/",
        "https://connectbyjbrh.com/docs/how-to/audit-a-decision/"
      ]
    },
    {
      "id": "G0040",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/reduce-your-costs/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/reduce-your-costs/index.md",
      "title": "Reduce what Connect costs you",
      "description": "Where Connect's spend actually goes — carried context on voice calls, prompt size, research passes — and the four changes that move the number most.",
      "summary": "Voice dominates, and inside voice the dominant term is not what the model says but what it carries: a live session is re-billed for its entire context on every turn, and measured production calls were 92% carried context by input token. Shorter replies, a bounded prompt, fewer calls that were never conversations, and research that only goes deep where it changes a decision are the four levers that matter.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/docs/phone/voice-budget/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/prospects/prospect-costs/",
        "https://connectbyjbrh.com/research/research-cost-routing/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "G0057",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/report-a-problem/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/report-a-problem/index.md",
      "title": "Report a problem usefully",
      "description": "Capture the eight facts that turn a support question into a fixable one, in the order that finds the answer fastest — and the two nobody thinks to include.",
      "summary": "A report that gets answered in minutes says which account it happened on, on which screen, at what time, to which record, what you expected, what happened instead, and — the part almost nobody includes — what Connect did complete before it stopped. Screenshots help; timestamps and record identifiers help more.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/docs/how-to/audit-a-decision/",
        "https://connectbyjbrh.com/docs/troubleshooting/403-on-a-screen/",
        "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-happening/",
        "https://connectbyjbrh.com/docs/product/owner-and-customer/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/docs/security/customer-facade/"
      ]
    },
    {
      "id": "G0049",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/review-a-call/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/review-a-call/index.md",
      "title": "Review a call properly",
      "description": "Read a call in the order that finds the fault: outcome, timings on the wire, review findings, then the transcript — and act on the findings a control can change.",
      "summary": "Read the outcome first, the wire timings second, the review findings third and the transcript last. The review separates findings a setting can change from findings no setting reaches, and only the first kind is worth your afternoon. Listening to a call end to end before reading any of that is the slowest way to find out what went wrong.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/docs/phone/barge-in/",
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/research/model-limited-findings/",
        "https://connectbyjbrh.com/docs/how-to/use-a-different-voice-per-line/"
      ]
    },
    {
      "id": "G0026",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/route-mail-to-a-person/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/route-mail-to-a-person/index.md",
      "title": "Send certain mail to a person instead",
      "description": "Make certain mail reach a colleague instead of being answered: the rules that do it, how narrow each is, and what the exception looks like.",
      "summary": "There is no separate routing table for mail. You get the behaviour by narrowing autonomy at the scope that matches the exception — one contact, one mailbox, one channel or the whole workspace — so the reply is held for a person instead of sent. For work that is not a reply at all, a follow-up on the `task` channel is the mechanism: no drain ever sends one, so it can only be completed by somebody.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/email/triage/",
        "https://connectbyjbrh.com/docs/how-to/handle-a-vip/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "G0033",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/set-business-hours/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/set-business-hours/index.md",
      "title": "Set business hours",
      "description": "Hours belong to a phone line, not to the workspace. What a caller hears outside them, why the message names no times, and which clock is used.",
      "summary": "Set hours on the line itself. Every phone line is a routing record carrying its own provider, permissions, hours, routing and limits, so two numbers can keep different hours in the same workspace. A caller outside them hears a deterministic closed-line message in your business's name, the call ends, and the record carries an after-hours outcome rather than looking like a fault.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/business-hours/",
        "https://connectbyjbrh.com/docs/phone/line-off/",
        "https://connectbyjbrh.com/docs/phone/line-configuration/",
        "https://connectbyjbrh.com/docs/phone/phone-health/",
        "https://connectbyjbrh.com/docs/how-to/set-up-for-a-holiday/",
        "https://connectbyjbrh.com/docs/troubleshooting/after-hours-call/"
      ]
    },
    {
      "id": "G0048",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/set-up-a-second-language/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/set-up-a-second-language/index.md",
      "title": "Serve customers in a second language",
      "description": "Serve customers in another language across email, WhatsApp and the phone, and test each channel separately because they fail in different ways.",
      "summary": "Language is set in three places for three different reasons: the written channels take it as behaviour instruction, the phone takes it as a session parameter that can be pinned or left to detection, and Knowledge has to carry the material in that language or answers will be translated approximations of English source text. Configure all three, then test each one on its own.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/multilingual-calls/",
        "https://connectbyjbrh.com/docs/phone/language-detection/",
        "https://connectbyjbrh.com/docs/phone/regional-speech/",
        "https://connectbyjbrh.com/docs/phone/code-mixing/",
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-language-on-call/"
      ]
    },
    {
      "id": "G0055",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/set-up-for-a-holiday/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/set-up-for-a-holiday/index.md",
      "title": "Set Connect up before you go away",
      "description": "Leave Connect running while you are away: the autonomy decision, business hours, who reads the queue, and the dated commitments that will fire without you.",
      "summary": "Two decisions do most of the work: whether each channel keeps sending without you, and who reads the queue while you are gone. Everything else follows — hours, escalation, the commitments already dated inside your absence, and a written note so the person covering knows what is normal and what is not.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/how-to/set-business-hours/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you-ranking/",
        "https://connectbyjbrh.com/docs/how-to/write-a-standing-instruction/",
        "https://connectbyjbrh.com/docs/how-to/hand-over-to-a-colleague/",
        "https://connectbyjbrh.com/docs/how-to/prepare-for-a-busy-week/",
        "https://connectbyjbrh.com/docs/troubleshooting/after-hours-call/"
      ]
    },
    {
      "id": "G0032",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/share-a-record/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/share-a-record/index.md",
      "title": "Share a record with a colleague",
      "description": "What a link to a Connect record carries — a location, not access — and the three isolation layers that decide whether the person opening it sees anything.",
      "summary": "Copy the address of the screen you are on and send it. A link is a location inside the application, never a grant: whoever opens it must sign in with Google, and what they then see is decided by which workspace they belong to. Somebody outside the workspace sees nothing, because isolation is enforced in three independent places rather than by hiding the link.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/how-to/hand-over-to-a-colleague/",
        "https://connectbyjbrh.com/docs/getting-started/inviting-your-team/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/account/"
      ]
    },
    {
      "id": "G0029",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/stop-an-outreach-sequence/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/stop-an-outreach-sequence/index.md",
      "title": "Stop an outreach sequence",
      "description": "Five ways to stop cold outreach, ranked by how fast each takes effect and how wide it reaches — and which one to use while you work out the rest.",
      "summary": "The runtime switch is the fastest and the bluntest: it stops new work at once and needs nothing put back afterwards. Everything narrower — stopping the follow-up chain for one person or one thread, turning outreach autonomy down, recording a suppression — takes effect from the next piece of work rather than instantly, which is usually fine and occasionally not.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/cold-sequence-stop/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/email/unsubscribe/",
        "https://connectbyjbrh.com/docs/how-to/stop-connect-immediately/",
        "https://connectbyjbrh.com/docs/how-to/block-a-sender/",
        "https://connectbyjbrh.com/docs/email/outreach-email/"
      ]
    },
    {
      "id": "G0022",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/stop-connect-immediately/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/stop-connect-immediately/index.md",
      "title": "Stop Connect immediately",
      "description": "The runtime switch stops new work at once without changing a setting. What halts, what is already in flight, and how to start again cleanly.",
      "summary": "Use the runtime switch in the application shell. It stops new work instantly and changes no configuration, so autonomy modes, schedules and mailbox settings are exactly as you left them when you switch back on. Work already handed to a provider — a send in flight, a call in progress — is not recalled, because it is no longer Connect's to recall.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/how-to/turn-off-one-channel/",
        "https://connectbyjbrh.com/docs/how-to/block-a-sender/",
        "https://connectbyjbrh.com/docs/how-to/set-up-for-a-holiday/",
        "https://connectbyjbrh.com/docs/phone/line-off/",
        "https://connectbyjbrh.com/docs/getting-started/what-connect-will-not-do/"
      ]
    },
    {
      "id": "G0038",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/test-before-trusting/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/test-before-trusting/index.md",
      "title": "Test a change before trusting it",
      "description": "Safe ways to try a change on each channel — draft-only on mail, a test call on the phone — and how to read the result without fooling yourself.",
      "summary": "Every channel has a way to see what Connect would do without anyone receiving it. On mail that is `draft_only`, which writes and stops without even asking for approval. On the phone it is a test call with the Voice Lab's draft settings, judged by the call's review rather than by ear. Use one change at a time, or the result cannot be attributed.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/how-to/change-the-voice/",
        "https://connectbyjbrh.com/docs/getting-started/make-a-test-call/",
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
        "https://connectbyjbrh.com/developers/sandbox/",
        "https://connectbyjbrh.com/docs/how-to/check-a-number-before-going-live/"
      ]
    },
    {
      "id": "G0058",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/turn-off-one-channel/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/turn-off-one-channel/index.md",
      "title": "Turn off one channel without turning off Connect",
      "description": "Switch one channel off without stopping the rest: what `off` actually does, what keeps running behind it, and the three switches people confuse it with.",
      "summary": "Setting a channel to `off` on What Connect May Do disables that channel and nothing else. Messages still arrive, records still update, relationships still build, and every other channel carries on exactly as before. What stops is Connect drafting or sending on that one channel.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/per-channel/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/connect-on-off/",
        "https://connectbyjbrh.com/docs/how-to/stop-connect-immediately/",
        "https://connectbyjbrh.com/docs/phone/line-off/",
        "https://connectbyjbrh.com/docs/email/mailbox-autonomy/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/"
      ]
    },
    {
      "id": "G0042",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/use-a-different-voice-per-line/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/use-a-different-voice-per-line/index.md",
      "title": "Use a different voice for each line",
      "description": "Give each line its own voice: what a profile actually contains, the six-step resolution order behind it, and how to prove which one ran on a call.",
      "summary": "Voice resolves through six layers, narrowest last: the workspace setting, the default profile, a profile chosen by the line's purpose, a profile pinned to the number, a profile set on the contact, and finally the draft a Voice Lab test call is running. Pin by purpose when several lines do the same job; pin by number when one line is genuinely different.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-profile/",
        "https://connectbyjbrh.com/docs/phone/voice-lab/",
        "https://connectbyjbrh.com/docs/how-to/change-the-voice/",
        "https://connectbyjbrh.com/docs/how-to/review-a-call/",
        "https://connectbyjbrh.com/docs/phone/human-voice-profiles/",
        "https://connectbyjbrh.com/docs/how-to/connect-a-second-number/"
      ]
    },
    {
      "id": "G0047",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/write-a-discovery-brief/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/write-a-discovery-brief/index.md",
      "title": "Write a discovery brief that finds the right companies",
      "description": "The four parts of a discovery brief that finds companies worth contacting, with a weak brief rewritten and the reason each change alters the result.",
      "summary": "A brief that works names four things: who the organisation is, where it operates, what would make it a fit that a public source could actually prove, and what disqualifies it. The third is the one most briefs skip, and it is the one that decides whether research produces evidence or adjectives.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/discovery-criteria/",
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/docs/prospects/qualification/",
        "https://connectbyjbrh.com/docs/prospects/location-scope/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/"
      ]
    },
    {
      "id": "G0035",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/how-to/write-a-standing-instruction/",
      "markdown": "https://connectbyjbrh.com/docs/how-to/write-a-standing-instruction/index.md",
      "title": "Write a standing instruction that works",
      "description": "What separates a standing instruction that changes behaviour from one that reads well and does nothing — plus the three kinds that reliably fail.",
      "summary": "An instruction that works names a situation, an action and a boundary, and is written at the narrowest tier that covers the situation. Instructions that fail are usually one of three kinds: a prohibition with no alternative, a request for care that really needs a gate, and a fact dressed up as a direction when it belongs in Knowledge.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/how-to/correct-a-mistake/",
        "https://connectbyjbrh.com/docs/how-to/change-what-connect-says/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "C0242",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/knowledge/",
      "markdown": "https://connectbyjbrh.com/docs/knowledge/index.md",
      "title": "Knowledge in Connect",
      "description": "Where a grounded answer comes from: the sources a workspace supplies, the authority each one carries, and how a few passages reach a reply.",
      "summary": "Knowledge is the set of sources a workspace supplies for answers to be grounded in — an uploaded document, a fetched web page, or a short fact typed by hand. Each source carries an authority level that decides what it may be used to claim, and every question selects a handful of passages rather than the whole bank. There is no vector database behind this: selection is lexical scoring over the workspace's own text.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/knowledge/retrieval/",
        "https://connectbyjbrh.com/docs/knowledge/knowledge-vs-fact/",
        "https://connectbyjbrh.com/docs/knowledge/owner-authority/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/research/grounding-without-a-vector-database/"
      ]
    },
    {
      "id": "C0244",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/knowledge/extraction/",
      "markdown": "https://connectbyjbrh.com/docs/knowledge/extraction/index.md",
      "title": "Extracting text from a source",
      "description": "How a file becomes text: direct decoding for Markdown and plain text, model reading for PDF, image and video, and the limits on both.",
      "summary": "Text formats are decoded directly and cleaned. A PDF, an image or a video is read by a model under a fixed instruction that treats the file as data and quotes any embedded instructions rather than obeying them. Either way the result is one block of Markdown, capped at 500,000 characters, which is what everything downstream works from. The original file is kept and hashed.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/knowledge/indexing/",
        "https://connectbyjbrh.com/docs/knowledge/prompt-injection/",
        "https://connectbyjbrh.com/docs/troubleshooting/source-failed/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "C0248",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/knowledge/facts/",
      "markdown": "https://connectbyjbrh.com/docs/knowledge/facts/index.md",
      "title": "The facts editor",
      "description": "Typing a short grounded statement directly: the fields, what priority and keywords actually do, and when this beats uploading a document.",
      "summary": "The editor holds short statements typed by a person: a title, the text, comma-separated keywords, a category, a priority and an on/off switch. They are matched by word overlap and keyword hits rather than by document structure, and an entry with a priority of ten or better is included whenever Knowledge is consulted at all. It is the right home for a rule of a few lines.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/knowledge-vs-fact/",
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/knowledge/owner-authority/",
        "https://connectbyjbrh.com/docs/memory/creating-memory/",
        "https://connectbyjbrh.com/docs/knowledge/retrieval/"
      ]
    },
    {
      "id": "C0245",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/knowledge/indexing/",
      "markdown": "https://connectbyjbrh.com/docs/knowledge/indexing/index.md",
      "title": "How Knowledge is prepared for retrieval",
      "description": "What Connect actually builds from a source: heading-aware passages in the same database, no vector store, and an optional embedding column.",
      "summary": "Extracted text is split into heading-aware passages of about 1,800 characters with 180 characters of overlap, up to 240 per source, and each is stored as an ordinary row alongside its section name. **Connect has no vector database.** Where embeddings are configured, the vector sits in a column on that row and is one of two scores; there is no approximate nearest-neighbour index anywhere in the path.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/extraction/",
        "https://connectbyjbrh.com/docs/knowledge/retrieval/",
        "https://connectbyjbrh.com/docs/knowledge/knowledge-owner-tenant/",
        "https://connectbyjbrh.com/research/grounding-without-a-vector-database/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "C0254",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/knowledge/knowledge-owner-tenant/",
      "markdown": "https://connectbyjbrh.com/docs/knowledge/knowledge-owner-tenant/index.md",
      "title": "Knowledge for the Owner and for a customer",
      "description": "One Knowledge implementation reached by two routes: what is identical for both audiences, what a plan scopes, and where a customer workspace stops.",
      "summary": "Both audiences use the same source records, the same authority ladder and the same ranking in a reply. What differs is at the edges: a customer workspace supplies text rather than having media read for it, its lookup preview is a simpler containment search, and it never touches the operator's provider credentials. Isolation between workspaces is absolute in both directions.",
      "status": "available",
      "audiences": [
        "owner",
        "customer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/knowledge/retrieval-test/",
        "https://connectbyjbrh.com/docs/knowledge/indexing/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/"
      ]
    },
    {
      "id": "C0249",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/knowledge/knowledge-vs-fact/",
      "markdown": "https://connectbyjbrh.com/docs/knowledge/knowledge-vs-fact/index.md",
      "title": "Knowledge and Fact are different things",
      "description": "Knowledge is the body of material a workspace supplies; a Fact is one statement inside it. Blurring the two produces confident, unsupported answers.",
      "summary": "Knowledge names the whole supplied body — documents, fetched pages and typed entries, each with authority and scope. A Fact is one grounded statement drawn from that body. The distinction is not pedantry: a source can be entirely legitimate and still contain no statement that settles the question in front of it, and treating the presence of a document as proof of a claim is how an agent asserts something nobody agreed to.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/knowledge/facts/",
        "https://connectbyjbrh.com/docs/knowledge/unsupported-claims/",
        "https://connectbyjbrh.com/docs/knowledge/owner-authority/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/glossary/"
      ]
    },
    {
      "id": "C0252",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/knowledge/owner-authority/",
      "markdown": "https://connectbyjbrh.com/docs/knowledge/owner-authority/index.md",
      "title": "Who decides what is true",
      "description": "Authority is set by a person and enforced in code before the model sees anything, which is why no document and no message can promote itself.",
      "summary": "Every source's authority is assigned by a person in the workspace that owns it. Eligibility, ranking and sufficiency are then decided in code, before any text reaches a model, and the context the model receives is labelled with what each block may be used for. Nothing a document says about itself can raise its own standing, and no reply can grant authority the source lacked.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/knowledge-vs-fact/",
        "https://connectbyjbrh.com/docs/knowledge/source-conflict/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/authority-separation/",
        "https://connectbyjbrh.com/docs/knowledge/knowledge-owner-tenant/",
        "https://connectbyjbrh.com/docs/workflows/knowledge-audit/"
      ]
    },
    {
      "id": "C0253",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/knowledge/prompt-injection/",
      "markdown": "https://connectbyjbrh.com/docs/knowledge/prompt-injection/index.md",
      "title": "Instructions hidden in content",
      "description": "Received and fetched text is data, never instruction. What is stripped, what is flagged, what stops before any model runs, and what none of it guarantees.",
      "summary": "An attempt to hijack an agent arrives looking like an enquiry. Connect treats every external message, fetched page and uploaded file as data: invisible characters are stripped, known instruction patterns are flagged, a flagged Knowledge source parks in review rather than activating, and a flagged inbound email is held for a person before any reasoning or tool call happens at all.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/knowledge/extraction/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/knowledge/owner-authority/",
        "https://connectbyjbrh.com/developers/agent-safety/"
      ]
    },
    {
      "id": "C0247",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/knowledge/retrieval-test/",
      "markdown": "https://connectbyjbrh.com/docs/knowledge/retrieval-test/index.md",
      "title": "Testing retrieval",
      "description": "The search tool that shows what a question would actually fetch, how to read its score and authority columns, and what it cannot tell you.",
      "summary": "Search runs the same selection a reply runs, for a question you type, and returns the passages with their score, source, authority and section. It is the fastest way to find out whether a document is reachable before a customer finds out for you. It does not write an answer and it does not prove the model will use what it returns.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/retrieval/",
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/knowledge/knowledge-owner-tenant/",
        "https://connectbyjbrh.com/docs/memory/viewing/",
        "https://connectbyjbrh.com/docs/troubleshooting/knowledge-insufficient/"
      ]
    },
    {
      "id": "C0246",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/knowledge/retrieval/",
      "markdown": "https://connectbyjbrh.com/docs/knowledge/retrieval/index.md",
      "title": "Retrieving Knowledge for an answer",
      "description": "What is fetched for one question: eligibility, the scoring terms in order, the three labelled blocks, and why a live call gets only four entries.",
      "summary": "For each question Connect narrows to active sources whose scope fits the work, drops any that fail their integrity hash or have unreviewed problems, scores every remaining passage, and returns the top few above a floor. The result is grouped into three labelled blocks so fact evidence and background are not read as the same kind of statement. On a call the cap is four entries and 2,000 characters.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/indexing/",
        "https://connectbyjbrh.com/docs/knowledge/retrieval-test/",
        "https://connectbyjbrh.com/docs/knowledge/unsupported-claims/",
        "https://connectbyjbrh.com/docs/workflows/grounded-answer/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "C0250",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/knowledge/source-conflict/",
      "markdown": "https://connectbyjbrh.com/docs/knowledge/source-conflict/index.md",
      "title": "When two sources disagree",
      "description": "Contradiction detection when a source is added, why a conflicted source stops answering, and why nobody but a person may decide the winner.",
      "summary": "Adding a source with fact, instruction or playbook authority triggers a contradiction check against everything already approved. Anything found is recorded on the source as a claim, a counter-claim, a severity and a reason, and the source is parked in `needs_review` instead of going live. Connect does not pick a winner — a person edits one of the two documents.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/knowledge/owner-authority/",
        "https://connectbyjbrh.com/docs/workflows/resolve-conflict/",
        "https://connectbyjbrh.com/docs/knowledge/prompt-injection/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-answer-from-knowledge/"
      ]
    },
    {
      "id": "C0243",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/knowledge/sources/",
      "markdown": "https://connectbyjbrh.com/docs/knowledge/sources/index.md",
      "title": "Knowledge sources",
      "description": "What can be added as a Knowledge source, the size ceiling for each kind, the authority and scope it is given, and why one stops answering.",
      "summary": "A Knowledge source is one uploaded file or one fetched web page, stored with a SHA-256 hash, an authority level, a set of scopes and a status. SKILL.md, Markdown, plain text, PDF, PNG/JPEG/WebP images and MP4/MOV/WebM video are accepted; anything else is refused at upload. Only a source whose status is `active` is ever read into an answer.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/knowledge/extraction/",
        "https://connectbyjbrh.com/docs/knowledge/indexing/",
        "https://connectbyjbrh.com/docs/knowledge/prompt-injection/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/workflows/add-knowledge/"
      ]
    },
    {
      "id": "C0251",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/knowledge/unsupported-claims/",
      "markdown": "https://connectbyjbrh.com/docs/knowledge/unsupported-claims/index.md",
      "title": "Claims Knowledge does not support",
      "description": "What happens when an answer would need something Knowledge does not carry: no draft is written, a person is asked, and the miss is recorded.",
      "summary": "Knowledge is checked before a reply is drafted, not after. If nothing carries the authority to answer, Connect does not write a hedged reply — it stops, asks the person who owns the workspace, and records what it matched and why that was not enough. The customer waits for an answer somebody stands behind rather than receiving a confident guess.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/retrieval/",
        "https://connectbyjbrh.com/docs/knowledge/knowledge-vs-fact/",
        "https://connectbyjbrh.com/docs/troubleshooting/knowledge-insufficient/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/"
      ]
    },
    {
      "id": "C0227",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/memory/",
      "markdown": "https://connectbyjbrh.com/docs/memory/index.md",
      "title": "Memory in Connect",
      "description": "What Connect remembers about a business and its people: four tiers resolved narrowest-first, how each is written, and how a person reads or forgets any of it.",
      "summary": "Memory is what Connect has learned about a business and the people it deals with, held at four tiers — workspace, channel, endpoint and contact — and resolved narrowest-first when a reply is being written. Anyone in the workspace can read every tier, correct a line that is wrong, and forget any of it. Nothing here is a black box you have to argue with.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/memory/creating-memory/",
        "https://connectbyjbrh.com/docs/memory/viewing/",
        "https://connectbyjbrh.com/docs/memory/directives/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0229",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/memory/business-memory/",
      "markdown": "https://connectbyjbrh.com/docs/memory/business-memory/index.md",
      "title": "Business memory",
      "description": "The workspace tier: what a business should tell Connect once so it holds everywhere, and the four kinds of line that do not belong there.",
      "summary": "Workspace memory is what stays true no matter who is writing, which channel they arrived on or which mailbox took it: what the business does, how it refers to itself, what it will not promise. It is the broadest tier, so every line in it is applied to every piece of work — which makes it the cheapest place to be right and the most expensive place to be wrong.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/memory/channel-context/",
        "https://connectbyjbrh.com/docs/memory/person-memory/",
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/memory/memory-in-channels/",
        "https://connectbyjbrh.com/research/structured-business-memory/"
      ]
    },
    {
      "id": "C0231",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/memory/channel-context/",
      "markdown": "https://connectbyjbrh.com/docs/memory/channel-context/index.md",
      "title": "Channel and endpoint memory",
      "description": "The two middle tiers: what Connect should know about a whole channel, and what belongs to one mailbox or one phone number instead.",
      "summary": "Channel memory holds what is true of a medium — email, whatsapp, sms or voice — and endpoint memory holds what is true of one mailbox or one phone number. They sit between the business and the person, and they exist because a business rarely wants the same tone, the same signature and the same purpose on a sales line as on an accounts mailbox.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp",
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/memory/business-memory/",
        "https://connectbyjbrh.com/docs/memory/memory-in-channels/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "C0232",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/memory/creating-memory/",
      "markdown": "https://connectbyjbrh.com/docs/memory/creating-memory/index.md",
      "title": "How a memory is created",
      "description": "The four ways a memory gets written in Connect — by hand, by the Assistant, at the end of a call, or as a deliberate correction — and what each one records.",
      "summary": "A memory is written in one of four ways: a person types it into the viewer, the Connect Assistant is asked to remember it, a phone call produces it when the call is closed, or somebody corrects behaviour that was wrong. Each records what was written and where it came from, and every one of them lands in the same place — a `connect_memory` row at a named tier.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/memory/memory-from-conversation/",
        "https://connectbyjbrh.com/docs/memory/memory-from-call/",
        "https://connectbyjbrh.com/docs/memory/editing/",
        "https://connectbyjbrh.com/docs/workflows/memory-correction/",
        "https://connectbyjbrh.com/docs/assistant/"
      ]
    },
    {
      "id": "C0238",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/memory/deleting/",
      "markdown": "https://connectbyjbrh.com/docs/memory/deleting/index.md",
      "title": "Forgetting something",
      "description": "What forgetting actually removes in Connect, what deliberately survives it, and the two deletions that have consequences people do not expect.",
      "summary": "Forgetting removes a memory row, so the claim stops reaching any future reply or call. It does not remove the conversation it came from, the record of decisions already taken, or a suppression that protects somebody from being contacted. Two deletions surprise people: forgetting a block unblocks the contact, and forgetting a memory does not delete the person.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/editing/",
        "https://connectbyjbrh.com/docs/memory/superseding/",
        "https://connectbyjbrh.com/docs/memory/directives/",
        "https://connectbyjbrh.com/docs/workflows/memory-review/",
        "https://connectbyjbrh.com/docs/workflows/blocking-someone/",
        "https://connectbyjbrh.com/research/undo-for-agents/"
      ]
    },
    {
      "id": "C0239",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/memory/directives/",
      "markdown": "https://connectbyjbrh.com/docs/memory/directives/index.md",
      "title": "Block and guidance directives",
      "description": "The two memories that direct behaviour rather than describe it: a block carried in the tag list, and a standing instruction carried in the text.",
      "summary": "Most memory describes how things are. Two kinds direct what Connect does. A **block** stops contact with somebody on a channel and is carried as a tag, `block:<channel>`, because `directives()` reads the tag list and nothing else. A **standing instruction** is a durable direction written as the row's text, rendered into a draft or a call brief along with the rest of the tier.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/editing/",
        "https://connectbyjbrh.com/docs/memory/deleting/",
        "https://connectbyjbrh.com/docs/workflows/blocking-someone/",
        "https://connectbyjbrh.com/docs/memory/person-memory/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/authority-separation/"
      ]
    },
    {
      "id": "C0236",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/memory/editing/",
      "markdown": "https://connectbyjbrh.com/docs/memory/editing/index.md",
      "title": "Editing a memory",
      "description": "Changing a memory that is worded badly or plainly wrong: what an edit touches, what it does not touch, and when superseding is the right move instead.",
      "summary": "You can change the text of a memory and the tags it carries, from the viewer or the memory sheet in the grid. The change governs the next piece of work and nothing already done: replies already sent stay as they were, and the decision log still shows what was decided under the rule that applied at the time. Edit when the wording was wrong; supersede when the truth changed.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/superseding/",
        "https://connectbyjbrh.com/docs/memory/deleting/",
        "https://connectbyjbrh.com/docs/memory/directives/",
        "https://connectbyjbrh.com/docs/memory/viewing/",
        "https://connectbyjbrh.com/docs/troubleshooting/memory-not-applied/",
        "https://connectbyjbrh.com/research/undo-for-agents/"
      ]
    },
    {
      "id": "C0234",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/memory/memory-from-call/",
      "markdown": "https://connectbyjbrh.com/docs/memory/memory-from-call/index.md",
      "title": "Memory from a phone call",
      "description": "What a phone call leaves behind: the end-of-call write, the two filters that stop a thin call producing facts, and the guards that refuse a misheard name.",
      "summary": "When a call ends, `voice.end_call` produces four things in one place: a summary, a lead where there is one, memory, and any follow-up that was promised. What survives is what was said clearly enough to be worth keeping — a thin call is never summarised at all, and a name that might be a form of address is refused rather than stored.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/person-memory/",
        "https://connectbyjbrh.com/docs/memory/creating-memory/",
        "https://connectbyjbrh.com/docs/workflows/memory-from-call-workflow/",
        "https://connectbyjbrh.com/docs/memory/provenance/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/callback-promises/"
      ]
    },
    {
      "id": "C0233",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/memory/memory-from-conversation/",
      "markdown": "https://connectbyjbrh.com/docs/memory/memory-from-conversation/index.md",
      "title": "Memory from an email or a chat",
      "description": "Why an email or a chat does not silently become memory, what a person or the Assistant may take from one, and how a written instruction inside content is treated.",
      "summary": "Reading an email or a chat does not write memory. Threads and messages are already stored and already readable, so nothing is mined out of them behind your back. A memory from a written conversation is a deliberate act: a person writes it, or asks the Connect Assistant to. That restraint is also the defence against an instruction planted inside a message.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/creating-memory/",
        "https://connectbyjbrh.com/docs/memory/provenance/",
        "https://connectbyjbrh.com/docs/memory/memory-from-call/",
        "https://connectbyjbrh.com/docs/knowledge/prompt-injection/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/",
        "https://connectbyjbrh.com/docs/assistant/"
      ]
    },
    {
      "id": "C0241",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/memory/memory-in-channels/",
      "markdown": "https://connectbyjbrh.com/docs/memory/memory-in-channels/index.md",
      "title": "How memory reaches a reply",
      "description": "The door memory goes through on each channel, the character budgets on the voice path, and why instruction size is a latency decision rather than a preference.",
      "summary": "On the written channels memory is assembled into the draft, and the limit is relevance rather than length. On a live phone call it goes through `voice_engine.brief()` once, under hard character budgets — knowledge 4 facts and 2,000 characters, memory 700, the contact block 600 — because every character is paid for in the silence before the caller hears a voice.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/memory/business-memory/",
        "https://connectbyjbrh.com/docs/knowledge/retrieval/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/docs/troubleshooting/memory-budget/"
      ]
    },
    {
      "id": "C0230",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/memory/person-memory/",
      "markdown": "https://connectbyjbrh.com/docs/memory/person-memory/index.md",
      "title": "Person memory",
      "description": "The contact tier: what Connect keeps about one human, how it follows them across channels, and the 600-character block that reaches a live call.",
      "summary": "Contact memory is what Connect knows about one person: preferences, constraints, the things somebody would want a colleague to remember before picking up the phone. It is the narrowest tier, so it outranks the other three, and it belongs to the person rather than to an address — which is why it applies on a call to somebody you have only ever emailed.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/memory/directives/",
        "https://connectbyjbrh.com/docs/memory/memory-from-call/",
        "https://connectbyjbrh.com/docs/workflows/memory-review/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/one-person-many-channels/"
      ]
    },
    {
      "id": "C0240",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/memory/provenance/",
      "markdown": "https://connectbyjbrh.com/docs/memory/provenance/index.md",
      "title": "Where a memory came from",
      "description": "Why every memory needs an answer to 'who said so': the four origins, what the record keeps, and how to write a row that explains itself later.",
      "summary": "A memory changes behaviour, so it has to be answerable for. Every row belongs to exactly one workspace and one tier, carries its own tags, and came from one of four places: a person, the Assistant on request, the end of a call, or a deliberate correction. Actions taken under it are recorded separately in the audit trail, including the ones that were refused.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/creating-memory/",
        "https://connectbyjbrh.com/docs/memory/superseding/",
        "https://connectbyjbrh.com/docs/memory/memory-from-call/",
        "https://connectbyjbrh.com/docs/memory/viewing/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/evidence-for-next-action/"
      ]
    },
    {
      "id": "C0237",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/memory/superseding/",
      "markdown": "https://connectbyjbrh.com/docs/memory/superseding/index.md",
      "title": "Superseding a memory",
      "description": "Replacing a memory whose truth has changed while keeping the earlier statement readable, and why that is different from editing it in place.",
      "summary": "Superseding replaces the claim that governs behaviour while leaving the earlier one readable as history. Only the current version reaches a reply or a call; the previous one is there so a message sent under the old truth can still be explained. Use it when something was true and stopped being true — not when the wording was simply wrong.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/editing/",
        "https://connectbyjbrh.com/docs/memory/deleting/",
        "https://connectbyjbrh.com/docs/memory/provenance/",
        "https://connectbyjbrh.com/docs/workflows/memory-supersede/",
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/"
      ]
    },
    {
      "id": "C0228",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/memory/tiers/",
      "markdown": "https://connectbyjbrh.com/docs/memory/tiers/index.md",
      "title": "The four memory tiers",
      "description": "Workspace, channel, endpoint and contact: what each tier is for, how tiers() resolves them narrowest-first, and why an empty tier is still returned.",
      "summary": "Connect keeps memory at four scopes and resolves them narrowest-first: contact beats endpoint, endpoint beats channel, channel beats workspace. `tiers()` returns all four for a piece of work, each labelled with the tier that owns it, and a tier with nothing in it comes back empty rather than being left out. That is the whole model — there is no fifth scope and no hidden precedence.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/memory/business-memory/",
        "https://connectbyjbrh.com/docs/memory/person-memory/",
        "https://connectbyjbrh.com/docs/memory/channel-context/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/troubleshooting/memory-not-applied/"
      ]
    },
    {
      "id": "C0235",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/memory/viewing/",
      "markdown": "https://connectbyjbrh.com/docs/memory/viewing/index.md",
      "title": "Seeing what Connect knows",
      "description": "Where the memory viewer opens from, how it groups what it shows, and the second route through the Data grid when you want to read a whole tier at once.",
      "summary": "Everything Connect has learned is readable. The viewer opens from the mailbox row, the channel screen and the contact panel, and it groups what it shows by the tier that owns it — including tiers with nothing in them. For a whole tier at once, the memory sheet in the Data grid is the same records in a table you can sort, filter and export.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/memory/editing/",
        "https://connectbyjbrh.com/docs/workflows/memory-review/",
        "https://connectbyjbrh.com/docs/troubleshooting/memory-viewer-empty/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "C0001",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/phone/",
      "markdown": "https://connectbyjbrh.com/docs/phone/index.md",
      "title": "Phone and voice in Connect",
      "description": "How Connect answers and places calls: the two voice engines, what a line owns, and where every phone topic in this manual sits.",
      "summary": "Connect answers your business number and places calls on it, on either of two engines: a turn-based carrier path that hears a sentence and reads a reply back, or a realtime speech-to-speech path where Connect holds the call itself. Both write the same `calls` record, obey the same autonomy and budget gates, and are configured from the Phone screen.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/business-number/",
        "https://connectbyjbrh.com/docs/phone/inbound-calls/",
        "https://connectbyjbrh.com/docs/phone/realtime-engine/",
        "https://connectbyjbrh.com/docs/phone/call-record/",
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0025",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/abandonment/",
      "markdown": "https://connectbyjbrh.com/docs/phone/abandonment/index.md",
      "title": "Abandoned calls",
      "description": "Calls the caller walked away from: how the hang-up watcher recognises real abandonment, what it records, and why no closing line is spoken.",
      "summary": "An abandoned call is one where the caller has gone and the line is still open. The hang-up watcher ends it without saying anything — the default model has no way to speak a closing line in its own voice — and the record keeps three things apart: that the call ended, who ended it, and whether it was ever a conversation at all.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/silence/",
        "https://connectbyjbrh.com/docs/phone/not-a-conversation/",
        "https://connectbyjbrh.com/docs/phone/hangup-attribution/",
        "https://connectbyjbrh.com/docs/phone/stuck-calls/",
        "https://connectbyjbrh.com/docs/phone/session-limits/"
      ]
    },
    {
      "id": "C0022",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/barge-in/",
      "markdown": "https://connectbyjbrh.com/docs/phone/barge-in/index.md",
      "title": "Barge-in",
      "description": "Speaking over the voice on a live call: what stops it, the two-second rule that decides an interruption was ignored, and why the greeting is protected.",
      "summary": "Talking over Connect stops it. The realtime engine listens while it speaks, and a caller's voice cuts the reply so the two are not talking at once. Two things are deliberately outside that: the greeting, which is played with the caller's audio muted, and any interruption the voice kept speaking through for more than two seconds — that one is recorded as ignored and shows up in the call's review.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/turn-detection/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/docs/phone/voice-lab/",
        "https://connectbyjbrh.com/docs/phone/realtime-engine/",
        "https://connectbyjbrh.com/research/barge-in-without-cutting-the-greeting/"
      ]
    },
    {
      "id": "C0008",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/business-hours/",
      "markdown": "https://connectbyjbrh.com/docs/phone/business-hours/index.md",
      "title": "Business hours and the closed line",
      "description": "How opening hours are set on a line, what a caller hears outside them, and why the closed-line message never speaks the hours aloud.",
      "summary": "Hours are set per line, in the line's own timezone, and they narrow what the line's permissions already allow. A call outside them is answered — not ignored — with a short spoken message in the business's own name, and the row is closed with outcome `after_hours`. That message deliberately carries no hours in it, so nothing spoken can contradict how the line is configured.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/line-off/",
        "https://connectbyjbrh.com/docs/phone/line-configuration/",
        "https://connectbyjbrh.com/docs/phone/not-a-conversation/",
        "https://connectbyjbrh.com/docs/phone/call-follow-up/",
        "https://connectbyjbrh.com/docs/phone/greeting/",
        "https://connectbyjbrh.com/developers/time-and-timezones/"
      ]
    },
    {
      "id": "C0002",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/business-number/",
      "markdown": "https://connectbyjbrh.com/docs/phone/business-number/index.md",
      "title": "Your business number in Connect",
      "description": "What a phone number becomes once a workspace claims it: a channel_routes line that carries the provider, the permissions, the hours and the routing.",
      "summary": "Your business number becomes a line the moment a workspace claims it as a `channel_routes` row. That row is the whole configuration: which provider carries the number, who or what it is assigned to, whether it may take calls in or place them out, its opening hours, its routing, its recording policy, the provider capabilities behind it and its limits.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/line-configuration/",
        "https://connectbyjbrh.com/docs/phone/carrier-routing/",
        "https://connectbyjbrh.com/docs/phone/business-hours/",
        "https://connectbyjbrh.com/docs/phone/softphone/",
        "https://connectbyjbrh.com/docs/phone/voice-profile/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "C0056",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/call-consent/",
      "markdown": "https://connectbyjbrh.com/docs/phone/call-consent/index.md",
      "title": "Consent on calls",
      "description": "Where consent for a phone call is decided, the single outbound path every call passes through, and why a block recorded elsewhere already applies to the phone.",
      "summary": "Consent belongs to the person, not to the phone handler. Every outbound call — placed by the engine, by a due follow-up, by the Assistant or by somebody on the browser line — goes through one path, and that path asks about memory blocks, consent, autonomy and budget before anything rings. An inbound call needs no consent: the caller rang you.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/outbound-calls/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/phone/softphone/",
        "https://connectbyjbrh.com/docs/phone/live-transfer/",
        "https://connectbyjbrh.com/research/one-person-many-channels/"
      ]
    },
    {
      "id": "C0036",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/call-context/",
      "markdown": "https://connectbyjbrh.com/docs/phone/call-context/index.md",
      "title": "The call brief",
      "description": "Everything assembled before a call starts: persona, purpose, contact facts, knowledge, rules and guidance — each with a character budget, and why the budgets exist.",
      "summary": "`voice_engine.brief()` builds one document per call — the persona, the line's purpose, the contact's facts and standing instructions, knowledge, the hard rules and any supervisor guidance — and hands it to the model once. Its size is recorded as `session.instructions_chars`, because size is measurably latency: 7,500 characters gave a 1.2–1.8 second first token and 9,600 gave 2.3–3.4.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/returning-caller/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/docs/phone/voice-lab/",
        "https://connectbyjbrh.com/docs/phone/supervisor/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "C0050",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/call-facts/",
      "markdown": "https://connectbyjbrh.com/docs/phone/call-facts/index.md",
      "title": "Facts learned on a call",
      "description": "What a phone call leaves behind in Memory, which extracted facts are refused outright, and how something heard on a call reaches a conversation on another channel.",
      "summary": "What a caller says can outlive the call. When a call ends, Connect writes durable facts about the person and the business into Memory, and the next conversation reads them — on any channel, not only the phone. What is refused matters as much: a form of address is never taken as a name, and a call that was never a conversation contributes nothing at all.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/phone/call-context/",
        "https://connectbyjbrh.com/docs/phone/names-on-calls/",
        "https://connectbyjbrh.com/docs/phone/not-a-conversation/",
        "https://connectbyjbrh.com/research/structured-business-memory/",
        "https://connectbyjbrh.com/research/one-person-many-channels/"
      ]
    },
    {
      "id": "C0047",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/call-follow-up/",
      "markdown": "https://connectbyjbrh.com/docs/phone/call-follow-up/index.md",
      "title": "Follow-ups from a call",
      "description": "How a spoken commitment on a call becomes a dated follow-up: the words that parse into a time, the channel it lands on, and the default when nothing parses.",
      "summary": "When a caller and the voice agree on something that happens later, the call ends with a dated commitment rather than a sentence in a transcript. `schedule_follow_up` takes the promised words, `voice_engine.due_at` turns them into a time in the line's own timezone, and `follow_up_channel` decides whether that is a call-back or work for a person.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/promise-integrity/",
        "https://connectbyjbrh.com/docs/phone/phone-followup-drain/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/phone/call-summary/",
        "https://connectbyjbrh.com/research/callback-promises/",
        "https://connectbyjbrh.com/docs/phone/call-outcome/"
      ]
    },
    {
      "id": "C0013",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/call-outcome/",
      "markdown": "https://connectbyjbrh.com/docs/phone/call-outcome/index.md",
      "title": "Call outcomes and dispositions",
      "description": "The engine's outcome and a person's disposition are two columns answering two questions. What each one says, and how to use them together.",
      "summary": "Two columns answer two different questions. `outcome` is the engine's verdict on what the call was — `line_off`, `after_hours`, `no_answer`, `not_reached` and the conversational endings — written when the call closes. `disposition` is a person's verdict, written whenever somebody says so, and nothing the provider sends later can overwrite it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/not-a-conversation/",
        "https://connectbyjbrh.com/docs/phone/call-record/",
        "https://connectbyjbrh.com/docs/phone/hangup-attribution/",
        "https://connectbyjbrh.com/docs/phone/phone-health/",
        "https://connectbyjbrh.com/docs/phone/lead-from-call/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/"
      ]
    },
    {
      "id": "C0010",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/call-record/",
      "markdown": "https://connectbyjbrh.com/docs/phone/call-record/index.md",
      "title": "The call record",
      "description": "Every field on a call: ring and answer times, provider status, cost, participants, quality, and why outcome and disposition are separate columns.",
      "summary": "`calls` is the canonical record of every call, on either engine. One row holds the ring and answer times, the provider's own status, the cost in minor units, the recording and transfer fields, the participants, the resolved voice settings under `quality`, the engine's `outcome` and a person's `disposition` — separate columns, so a webhook arriving late cannot overwrite what somebody decided.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/call-outcome/",
        "https://connectbyjbrh.com/docs/phone/transcript/",
        "https://connectbyjbrh.com/docs/phone/hangup-attribution/",
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/docs/phone/stuck-calls/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "C0012",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/call-summary/",
      "markdown": "https://connectbyjbrh.com/docs/phone/call-summary/index.md",
      "title": "Call summaries",
      "description": "When a call summary is written, the two conditions under which Connect refuses to write one, and what a summary is allowed to contain.",
      "summary": "A summary is written once, in the background, after the call row has already been closed and the cost booked. Calls with fewer than two caller lines and fewer than five caller words are never sent to the summariser at all, because a model given almost nothing invents the rest. What a summary may contain is filtered on the way out — a form of address is never a name.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/transcript/",
        "https://connectbyjbrh.com/docs/phone/call-outcome/",
        "https://connectbyjbrh.com/docs/phone/lead-from-call/",
        "https://connectbyjbrh.com/docs/phone/promise-integrity/",
        "https://connectbyjbrh.com/docs/phone/names-on-calls/",
        "https://connectbyjbrh.com/docs/relationships/"
      ]
    },
    {
      "id": "C0033",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/caller-identity/",
      "markdown": "https://connectbyjbrh.com/docs/phone/caller-identity/index.md",
      "title": "Identifying the caller",
      "description": "Turning the number that rang into a person: the phone key, the rule when two records share a number, and what happens when nobody gives a name.",
      "summary": "`identify_caller` resolves the calling number against the workspace's own people. If two records share that number it takes the **oldest**, deliberately, so the same call never lands on a different record twice. An unrecognised number is not a problem to be solved with a guess: the call proceeds with an unknown caller, and nothing invents a person.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/names-on-calls/",
        "https://connectbyjbrh.com/docs/phone/returning-caller/",
        "https://connectbyjbrh.com/docs/phone/call-context/",
        "https://connectbyjbrh.com/docs/phone/lead-from-call/",
        "https://connectbyjbrh.com/research/one-person-many-channels/"
      ]
    },
    {
      "id": "C0004",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/carrier-routing/",
      "markdown": "https://connectbyjbrh.com/docs/phone/carrier-routing/index.md",
      "title": "How a call reaches your workspace",
      "description": "How a dialled number becomes a workspace, why every handler enters that workspace before reading a setting, and what an unclaimed number does.",
      "summary": "A call arrives as a signed request naming the number that was dialled. Connect matches that number to a `channel_routes` row, learns which workspace owns it, and enters that workspace before it reads a single setting. Everything after that point — credentials, greeting, hours, behaviour — is read inside the owning workspace, because reading it outside answered live calls with a goodbye message.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/carrier-verification/",
        "https://connectbyjbrh.com/docs/phone/inbound-calls/",
        "https://connectbyjbrh.com/docs/phone/business-number/",
        "https://connectbyjbrh.com/docs/phone/softphone/",
        "https://connectbyjbrh.com/research/invisible-not-missing/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "C0005",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/carrier-verification/",
      "markdown": "https://connectbyjbrh.com/docs/phone/carrier-verification/index.md",
      "title": "Carrier callback verification",
      "description": "Why every carrier callback is signature-checked inside the owning workspace, what a replayed webhook looks like, and the index that stops one.",
      "summary": "Every carrier callback is verified against the provider's signature before any value in it is used, and every normalised event is stored once in `call_events` with its signature nonce under a partial unique index. That index is the replay protection: a webhook delivered twice writes one event. Verification runs inside the workspace that owns the number, because the credentials it needs are workspace-scoped.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/carrier-routing/",
        "https://connectbyjbrh.com/docs/phone/call-record/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
        "https://connectbyjbrh.com/developers/webhook-signatures/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "C0032",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/code-mixing/",
      "markdown": "https://connectbyjbrh.com/docs/phone/code-mixing/index.md",
      "title": "Light code-mixing and slang",
      "description": "Hinglish and light slang on a call: when a mixed sentence counts as evidence and when it does not, and what asking a model for a register achieves.",
      "summary": "Mixing two languages inside one sentence is how a great many people speak, and Connect treats it as a register rather than an instruction. A Hinglish line is a switch only where the contact's city or state already made that language likely; otherwise it moves nothing. What you can ask for beyond that is limited: register is a prompt direction the model approximates, and two attempts to control fine speech behaviour were measured, found to change nothing and removed.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/language-detection/",
        "https://connectbyjbrh.com/docs/phone/multilingual-calls/",
        "https://connectbyjbrh.com/docs/phone/regional-speech/",
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/docs/phone/transcript/"
      ]
    },
    {
      "id": "C0042",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/connect-voice-tts/",
      "markdown": "https://connectbyjbrh.com/docs/phone/connect-voice-tts/index.md",
      "title": "Connect's own voice",
      "description": "Why the words a caller hears are synthesised by Connect rather than the carrier, how a sentence becomes a cached MP3, and the rule that forbids silence.",
      "summary": "On the carrier path the words a caller hears are synthesised by Connect, not by the carrier. A sentence goes to Google's Text-to-Speech API, comes back as a small 8 kHz MP3, is stored by content digest and handed to the carrier as a `<Play>`. If any part of that fails, the carrier's own voice reads the line instead, so a caller is never met with silence.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/greeting/",
        "https://connectbyjbrh.com/docs/phone/greeting-prewarm/",
        "https://connectbyjbrh.com/docs/phone/turn-based-engine/",
        "https://connectbyjbrh.com/docs/phone/speaking-guide/",
        "https://connectbyjbrh.com/docs/phone/multilingual-calls/",
        "https://connectbyjbrh.com/docs/phone/line-off/"
      ]
    },
    {
      "id": "C0021",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/greeting-prewarm/",
      "markdown": "https://connectbyjbrh.com/docs/phone/greeting-prewarm/index.md",
      "title": "Greeting warm-up",
      "description": "How Connect has the first sentence of a call already synthesised before the phone is picked up, and the quota refusal that once cost every restart its warm greeting.",
      "summary": "Every idle voice worker process synthesises the greetings a workspace might need before any call arrives and keeps them in that process's own cache. When somebody rings, the opening line is already audio: the wait went from about three seconds to none. A miss is not a failure — the sentence is synthesised live instead, a little slower.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/greeting/",
        "https://connectbyjbrh.com/docs/phone/voice-worker/",
        "https://connectbyjbrh.com/docs/phone/connect-voice-tts/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/research/silent-failure/"
      ]
    },
    {
      "id": "C0020",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/greeting/",
      "markdown": "https://connectbyjbrh.com/docs/phone/greeting/index.md",
      "title": "The greeting",
      "description": "How the first sentence of a call is chosen, why it is synthesised while the phone is still ringing, and what happens when it cannot be spoken.",
      "summary": "The first sentence is chosen per line and synthesised while the phone is still ringing, so it plays the instant the caller picks up rather than after a pause. The caller's own audio is muted for its length, and the model is told the opening has already been said — which is what stopped the voice introducing itself twice. If it cannot be said at all, the call is ended rather than left silent.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/greeting-prewarm/",
        "https://connectbyjbrh.com/docs/phone/inbound-calls/",
        "https://connectbyjbrh.com/docs/phone/not-a-conversation/",
        "https://connectbyjbrh.com/docs/phone/connect-voice-tts/",
        "https://connectbyjbrh.com/docs/phone/speaking-guide/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "C0014",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/hangup-attribution/",
      "markdown": "https://connectbyjbrh.com/docs/phone/hangup-attribution/index.md",
      "title": "Who ended the call",
      "description": "The six values of hangup_by, why every non-caller ending once read as 'agent', and how to tell an ended call from a dropped one.",
      "summary": "`hangup_by` names which of six parties ended the call: caller, model, owner, engine, carrier or agent. Before this vocabulary existed, every ending that was not the caller's read as `agent`, which made a model that stopped talking, a colleague hanging up and a carrier dropping the leg indistinguishable in the record.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/call-outcome/",
        "https://connectbyjbrh.com/docs/phone/abandonment/",
        "https://connectbyjbrh.com/docs/phone/stuck-calls/",
        "https://connectbyjbrh.com/docs/phone/greeting/",
        "https://connectbyjbrh.com/docs/phone/supervisor/",
        "https://connectbyjbrh.com/research/silent-failure/"
      ]
    },
    {
      "id": "C0038",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/human-voice-profiles/",
      "markdown": "https://connectbyjbrh.com/docs/phone/human-voice-profiles/index.md",
      "title": "Human voice profiles",
      "description": "One choice that yields a whole person: 86 parameters across identity, speech, imperfections and psychology, and the ones marked unsupported rather than faked.",
      "summary": "A human profile is a structured description of a person — identity, voice, speech, human imperfections, language, psychology, conversation, emotion, adaptation — compiled into session parameters where the stack can set something and into prompt directions where it cannot. Twenty-eight are supplied, all invented, with values drawn from published speech research rather than impression.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-profile/",
        "https://connectbyjbrh.com/docs/phone/regional-speech/",
        "https://connectbyjbrh.com/docs/phone/voice-lab/",
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/docs/phone/call-context/"
      ]
    },
    {
      "id": "C0006",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/inbound-calls/",
      "markdown": "https://connectbyjbrh.com/docs/phone/inbound-calls/index.md",
      "title": "Answering inbound calls",
      "description": "From ring to greeting to first reply: the gates a caller passes, what they hear at each refusal, and what is written down while they talk.",
      "summary": "An inbound call is answered inside the workspace that owns the number, greeted with a sentence synthesised during the ring, and then held as a conversation until somebody ends it. Before the greeting there are two gates — the line's permission and hours, and the budget — and a refusal at either is spoken aloud in the business's own name rather than left as silence.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/greeting/",
        "https://connectbyjbrh.com/docs/phone/carrier-routing/",
        "https://connectbyjbrh.com/docs/phone/business-hours/",
        "https://connectbyjbrh.com/docs/phone/call-record/",
        "https://connectbyjbrh.com/docs/phone/not-a-conversation/",
        "https://connectbyjbrh.com/research/silent-failure/"
      ]
    },
    {
      "id": "C0030",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/known-language/",
      "markdown": "https://connectbyjbrh.com/docs/phone/known-language/index.md",
      "title": "Remembering a caller's language",
      "description": "A caller's remembered speaking preference: where it is held, why Connect speaks it from the first reply, what overrides it, and what it costs in the brief.",
      "summary": "When a person has been spoken to before, what they speak is kept with their other facts and carried into the next call's brief. Connect speaks it from its first reply rather than waiting for proof, and a whole sentence from the caller in another language is what overrides it. The fact competes for space in a contact block capped at 600 characters.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/language-detection/",
        "https://connectbyjbrh.com/docs/phone/caller-identity/",
        "https://connectbyjbrh.com/docs/phone/call-context/",
        "https://connectbyjbrh.com/docs/phone/returning-caller/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "C0029",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/language-detection/",
      "markdown": "https://connectbyjbrh.com/docs/phone/language-detection/index.md",
      "title": "Detecting the caller's language",
      "description": "What counts as proof a caller has changed language: four tiers with four different bars, the transcript artefacts that never count, and what pinning overrides.",
      "summary": "Detection here means deciding, on evidence, that the caller is speaking something other than what the call opened in. There is no single bar. A whole sentence is needed to override a remembered language, or to move a call Connect knows nothing about; two or three words are enough where the contact's city or state makes a language likely; a pinned line never moves at all.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/multilingual-calls/",
        "https://connectbyjbrh.com/docs/phone/known-language/",
        "https://connectbyjbrh.com/docs/phone/code-mixing/",
        "https://connectbyjbrh.com/docs/phone/transcript/",
        "https://connectbyjbrh.com/docs/phone/model-limits/"
      ]
    },
    {
      "id": "C0026",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/latency/",
      "markdown": "https://connectbyjbrh.com/docs/phone/latency/index.md",
      "title": "Reply latency on a call",
      "description": "How long a caller waits for a reply: what the clock measures, where the floor comes from, and how to tell a slow reply from a slow model.",
      "summary": "Latency is timed on the wire: from the moment the caller's speech stops to the first audio coming back. The target is 2.5 seconds and 4 seconds is marked slow, but the realtime path has a floor — the model's own first token plus its end-of-turn detection — and the best measured call sat at a 3.3-second median. When the model is most of the wait, the review says so and offers no dial to turn.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/response-watchdog/",
        "https://connectbyjbrh.com/docs/phone/turn-detection/",
        "https://connectbyjbrh.com/docs/phone/call-context/",
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "C0051",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/lead-from-call/",
      "markdown": "https://connectbyjbrh.com/docs/phone/lead-from-call/index.md",
      "title": "Leads captured from a call",
      "description": "When a phone call creates a Person and a lead, the two call endings that deliberately create nothing, and the key the record carries from the very first ring.",
      "summary": "A call that was a conversation can create a Person and a lead; a call that was never a conversation never does. `_capture_lead` refuses `no_answer` — it rang and nobody picked up — and `not_reached`, where it never rang at all. When a lead is created, the record carries `phone_key` from the first ring, so the next call from that number finds the same person.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/not-a-conversation/",
        "https://connectbyjbrh.com/docs/phone/caller-identity/",
        "https://connectbyjbrh.com/docs/phone/returning-caller/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/",
        "https://connectbyjbrh.com/docs/phone/call-facts/"
      ]
    },
    {
      "id": "C0003",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/line-configuration/",
      "markdown": "https://connectbyjbrh.com/docs/phone/line-configuration/index.md",
      "title": "Configuring a phone line",
      "description": "The ten facts that make up a phone line, what each one refuses when it is set wrongly, and the order to decide them in.",
      "summary": "A line is configured by ten facts on one `channel_routes` row, and each one refuses something specific: assignment decides whose line it is, the two permissions decide direction, hours decide when, routing decides which workspace and behaviour, the recording policy and capabilities decide what the provider will allow, limits decide what may be spent, and status decides whether any of it runs.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/business-number/",
        "https://connectbyjbrh.com/docs/phone/business-hours/",
        "https://connectbyjbrh.com/docs/phone/line-off/",
        "https://connectbyjbrh.com/docs/phone/phone-health/",
        "https://connectbyjbrh.com/docs/phone/voice-profile/",
        "https://connectbyjbrh.com/docs/follow-ups/"
      ]
    },
    {
      "id": "C0009",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/line-off/",
      "markdown": "https://connectbyjbrh.com/docs/phone/line-off/index.md",
      "title": "Switching the line off",
      "description": "What switching a phone line off does to a caller, to the call record and to work already scheduled on that line — and why it is not silence.",
      "summary": "Switching a line off does not make it silent. A call to a line that is off is answered, given the same deterministic closed-line sentence in the business's own name, and closed with outcome `line_off`. Calls already in progress are not cut. Outbound follow-ups that would have used the line are refused with a reason and stay on the record rather than disappearing.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/business-hours/",
        "https://connectbyjbrh.com/docs/phone/line-configuration/",
        "https://connectbyjbrh.com/docs/phone/phone-health/",
        "https://connectbyjbrh.com/docs/phone/not-a-conversation/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0045",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/live-transfer/",
      "markdown": "https://connectbyjbrh.com/docs/phone/live-transfer/index.md",
      "title": "Transfer and escalation",
      "description": "What an escalation phrase queues on a live call, why the transfer capability is asked of the provider rather than assumed, and what the live carrier does not carry.",
      "summary": "Escalation is a direction in the voice's behaviour block and a queued action on the guidance log, not a completed handover. `telephony.can` asks the provider whether transfer is available before anything attempts it, and on the live carrier that capability is not enabled — so a caller who asks for a person gets an honest ending and a dated call-back rather than a hold that goes nowhere.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/supervisor/",
        "https://connectbyjbrh.com/docs/phone/call-follow-up/",
        "https://connectbyjbrh.com/docs/phone/call-outcome/",
        "https://connectbyjbrh.com/docs/phone/hangup-attribution/",
        "https://connectbyjbrh.com/research/provider-independent-telephony/",
        "https://connectbyjbrh.com/research/callback-promises/"
      ]
    },
    {
      "id": "C0041",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/model-limits/",
      "markdown": "https://connectbyjbrh.com/docs/phone/model-limits/index.md",
      "title": "What a setting cannot change",
      "description": "Findings the call review counts but does not score, why they come with no control to turn, and the two behaviours proven unreachable by prompting.",
      "summary": "Some of what happens on a call belongs to the model, not to you. The quality review marks a finding `MODEL_LIMITED` when the model's own first token accounts for 60% or more of the wait, lists it, counts it, and deliberately does not lower the call's score — because a score that punishes you for something no setting reaches is a score you stop reading.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
        "https://connectbyjbrh.com/docs/phone/voice-lab/",
        "https://connectbyjbrh.com/research/model-limited-findings/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/docs/phone/human-voice-profiles/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "C0028",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/multilingual-calls/",
      "markdown": "https://connectbyjbrh.com/docs/phone/multilingual-calls/index.md",
      "title": "Multilingual calling",
      "description": "Calls held in more than one language: how the opening choice is made, what may change part-way through, and what a mixed sentence does.",
      "summary": "A call opens in one language and can move to another on evidence. The realtime model speaks each one directly rather than switching a synthesiser, so the practical question is not which are supported but how much proof the move takes. That depends on what Connect already knows: a whole sentence where the language was remembered or unknown, two or three words where the contact's city makes one likely, and nothing at all on a pinned line.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/language-detection/",
        "https://connectbyjbrh.com/docs/phone/known-language/",
        "https://connectbyjbrh.com/docs/phone/code-mixing/",
        "https://connectbyjbrh.com/docs/phone/regional-speech/",
        "https://connectbyjbrh.com/docs/phone/connect-voice-tts/"
      ]
    },
    {
      "id": "C0034",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/names-on-calls/",
      "markdown": "https://connectbyjbrh.com/docs/phone/names-on-calls/index.md",
      "title": "Names heard on a call",
      "description": "What happens to a name spoken on a call: the protected markers, why a form of address never becomes one, and every door it must pass on the way in and out.",
      "summary": "A name heard on a call is guarded on the way into a record and on the way back out of one. `identity.PROTECTED_MARKERS`, with `name_rejected`, `clean_name` and `scrub_names`, sits on the summariser's output, lead capture, the person upsert and what gets remembered — and on every place one is read aloud again. A form of address is never treated as one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/caller-identity/",
        "https://connectbyjbrh.com/docs/phone/call-summary/",
        "https://connectbyjbrh.com/docs/phone/call-facts/",
        "https://connectbyjbrh.com/docs/phone/promise-integrity/",
        "https://connectbyjbrh.com/research/relationship-memory/"
      ]
    },
    {
      "id": "C0015",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/not-a-conversation/",
      "markdown": "https://connectbyjbrh.com/docs/phone/not-a-conversation/index.md",
      "title": "Calls that were never a conversation",
      "description": "no_answer, not_reached and silent failure are three different nothings. What each one means, how to tell them apart, and why none creates a lead.",
      "summary": "Three different nothings share one word in Connect: `NOT_A_CONVERSATION`. `no_answer` rang and nobody picked up. `not_reached` never rang at all — the dial, the dispatch or the worker failed. A silent failure is worse than both: the call connected and nothing could be said. None of the three creates a lead.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/call-outcome/",
        "https://connectbyjbrh.com/docs/phone/hangup-attribution/",
        "https://connectbyjbrh.com/docs/phone/greeting/",
        "https://connectbyjbrh.com/docs/phone/phone-health/",
        "https://connectbyjbrh.com/docs/phone/abandonment/",
        "https://connectbyjbrh.com/research/silent-failure/"
      ]
    },
    {
      "id": "C0007",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/outbound-calls/",
      "markdown": "https://connectbyjbrh.com/docs/phone/outbound-calls/index.md",
      "title": "Placing outbound calls",
      "description": "The five gates an outbound call passes before a number is dialled, what each refusal means, and how a call-back gets placed at all.",
      "summary": "An outbound call passes five gates before a number is dialled: consent to be called, any memory block against the contact, the autonomy mode for the voice channel, the budget, and the line's own permission and hours. Both engines dispatch through the same call, so an engine-placed call, a follow-up call and a browser call are gated identically, and a refusal is recorded with its reason.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/call-consent/",
        "https://connectbyjbrh.com/docs/phone/business-hours/",
        "https://connectbyjbrh.com/docs/phone/voice-budget/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "C0049",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/phone-followup-drain/",
      "markdown": "https://connectbyjbrh.com/docs/phone/phone-followup-drain/index.md",
      "title": "Executing phone follow-ups",
      "description": "The drain that places a due call-back, the gates each one passes, the retry when no voice worker is ready, and the point at which a late follow-up is abandoned.",
      "summary": "A follow-up on the `phone` channel is executed by a drain in the runner: when one comes due, it places the call through the same outbound path any other call uses. The gates are the ordinary ones — memory blocks, consent, autonomy, budget, the line's hours — plus two the drain adds: a voice worker that is not ready, and a cut-off once a follow-up is a day late.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/call-follow-up/",
        "https://connectbyjbrh.com/docs/phone/voice-budget/",
        "https://connectbyjbrh.com/docs/phone/worker-capacity/",
        "https://connectbyjbrh.com/docs/phone/phone-health/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/phone/outbound-calls/"
      ]
    },
    {
      "id": "C0052",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/phone-health/",
      "markdown": "https://connectbyjbrh.com/docs/phone/phone-health/index.md",
      "title": "Phone line health",
      "description": "The four things line health reports about a phone line, what each one means for somebody ringing the number, and why none of them has to be cleared by hand.",
      "summary": "`line_health` reports four things about a phone line, and each clears by itself once its cause goes away: no voice worker has checked in, the fleet has no capacity left, too many calls inside the window never rang, and the model refused too many sessions. A line that read \"ready\" while no worker was alive is the defect that made all four necessary.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/worker-capacity/",
        "https://connectbyjbrh.com/docs/phone/voice-worker/",
        "https://connectbyjbrh.com/docs/phone/stuck-calls/",
        "https://connectbyjbrh.com/docs/phone/not-a-conversation/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
        "https://connectbyjbrh.com/docs/phone/phone-followup-drain/"
      ]
    },
    {
      "id": "C0058",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/phone-owner-tenant/",
      "markdown": "https://connectbyjbrh.com/docs/phone/phone-owner-tenant/index.md",
      "title": "Phone for the Owner and for a customer",
      "description": "What the phone channel does identically for the operator and for a customer workspace, what a plan changes, and the small set of things that stay operator-only.",
      "summary": "The phone channel is one implementation with two doors. A customer workspace configures its line, tunes the voice, supervises a live call and reads its own call records through the same modules the operator uses; the routers differ, not the behaviour. What stays operator-only is the platform ledger and running the voice fleet itself.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/docs/phone/voice-lab/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/"
      ]
    },
    {
      "id": "C0048",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/promise-integrity/",
      "markdown": "https://connectbyjbrh.com/docs/phone/promise-integrity/index.md",
      "title": "Promises made on a call",
      "description": "The rule that refuses a follow-up time the caller never said, what counts as agreeing to one, when a read-back is asked, and the finding for an empty promise.",
      "summary": "A promise on a call is checked against what the caller actually said. `record_event` refuses a `when` that shares no time word with the caller's latest time-bearing line, unless the caller just agreed to a time the voice proposed. The refusal comes back as \"NOT recorded\", and a promise left with nothing behind it becomes the `promised_unbooked` finding on the review.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/call-follow-up/",
        "https://connectbyjbrh.com/research/callback-promises/",
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
        "https://connectbyjbrh.com/docs/phone/names-on-calls/",
        "https://connectbyjbrh.com/docs/phone/phone-followup-drain/",
        "https://connectbyjbrh.com/docs/follow-ups/"
      ]
    },
    {
      "id": "C0016",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/realtime-engine/",
      "markdown": "https://connectbyjbrh.com/docs/phone/realtime-engine/index.md",
      "title": "The realtime voice engine",
      "description": "The speech-to-speech calling path: how a workspace turns it on, what the worker is given for each call, and what it is never allowed to know.",
      "summary": "On the realtime engine Connect holds the call itself: audio goes to a model that listens and speaks at once, rather than to a carrier that transcribes a sentence and reads a reply back. A workspace turns it on by setting `voice.engine = \"realtime\"` and linking the number at the carrier to an inbound trunk. The worker carries no business logic — everything it knows arrives in one brief.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/turn-based-engine/",
        "https://connectbyjbrh.com/docs/phone/voice-worker/",
        "https://connectbyjbrh.com/docs/phone/worker-capacity/",
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/research/provider-independent-telephony/"
      ]
    },
    {
      "id": "C0031",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/regional-speech/",
      "markdown": "https://connectbyjbrh.com/docs/phone/regional-speech/index.md",
      "title": "Regional speaking style",
      "description": "The regional speaking-style layer: the prompt directions it adds, the things it cannot touch, and why a rendered cadence rule was removed rather than kept.",
      "summary": "A regional style layer adds directions about how to speak — rhythm, formality, the politeness markers a place actually uses — on top of the voice already chosen. It is prompt text, so the model approximates it rather than executing it, and one carefully written cadence rule was measured, found to change nothing, and taken out. Which region applies is ranked on evidence — a contact's city or state, or an Indian landline's STD code — and never inferred from a mobile number.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/human-voice-profiles/",
        "https://connectbyjbrh.com/docs/phone/voice-profile/",
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/docs/phone/speaking-guide/",
        "https://connectbyjbrh.com/research/model-limited-findings/"
      ]
    },
    {
      "id": "C0027",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/response-watchdog/",
      "markdown": "https://connectbyjbrh.com/docs/phone/response-watchdog/index.md",
      "title": "The response watchdog",
      "description": "The timer that asks a stalled model to answer: why its default is 5.5 seconds, what disarms it, and how a nudge can cancel the very reply it was waiting for.",
      "summary": "When the caller has stopped speaking and nothing has started coming back, the worker asks for a reply. The threshold `rt_response_watchdog_ms` defaults to **5.5 seconds** — comfortably above any normal first token — and only real speech disarms it. Set it lower and it fires during ordinary generation, cancelling the very reply it was waiting for and making the call slower rather than faster.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/docs/phone/silence/",
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/docs/phone/supervisor/",
        "https://connectbyjbrh.com/research/silent-failure/"
      ]
    },
    {
      "id": "C0035",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/returning-caller/",
      "markdown": "https://connectbyjbrh.com/docs/phone/returning-caller/index.md",
      "title": "A returning caller",
      "description": "The second time somebody rings: what Connect has already, how little of it reaches the conversation, and why continuity is not the same as recital.",
      "summary": "On a second call the number resolves to a person, and their facts, standing instructions and a slice of memory are rendered into the brief before anyone speaks. Far less reaches the model than the workspace holds: 600 characters of contact facts, 700 of memory, four knowledge facts. That cap is a latency decision, and it is also what stops a call opening with a recital of somebody's file.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/call-context/",
        "https://connectbyjbrh.com/docs/phone/caller-identity/",
        "https://connectbyjbrh.com/docs/phone/known-language/",
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/research/relationship-memory/"
      ]
    },
    {
      "id": "C0057",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/session-limits/",
      "markdown": "https://connectbyjbrh.com/docs/phone/session-limits/index.md",
      "title": "Session limits and long calls",
      "description": "The model's session cap, the context window, the provider cap and the product's own thirty-minute ceiling — which one ends a long call, and what a caller notices.",
      "summary": "A long call is no longer cut when the model's session ends. The plugin reconnects on the server's `go_away` and carries the conversation across, with a sliding-window compression keeping the context inside the new session — so the session cap belongs to the session, and the call's real ceiling is `MAX_CALL_SECONDS`, thirty minutes, which is Connect's own limit.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/docs/phone/stuck-calls/",
        "https://connectbyjbrh.com/docs/phone/realtime-engine/",
        "https://connectbyjbrh.com/docs/phone/hangup-attribution/",
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/docs/phone/call-context/"
      ]
    },
    {
      "id": "C0024",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/silence/",
      "markdown": "https://connectbyjbrh.com/docs/phone/silence/index.md",
      "title": "Silence and check-ins",
      "description": "What Connect does when nobody is speaking: how presence is tracked, why nothing is said over a caller, and what a silent stretch leaves on the record.",
      "summary": "Connect keeps its own view of whether the caller is speaking rather than trusting the model's, and it will not say anything into a line while the caller is talking or was heard within the last 2.5 seconds. On the default model no check-in and no goodbye is spoken at all: the silence is recorded, and if the call has genuinely been abandoned the hang-up watcher ends it without a word.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/abandonment/",
        "https://connectbyjbrh.com/docs/phone/response-watchdog/",
        "https://connectbyjbrh.com/docs/phone/turn-detection/",
        "https://connectbyjbrh.com/docs/phone/not-a-conversation/",
        "https://connectbyjbrh.com/research/silent-failure/"
      ]
    },
    {
      "id": "C0046",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/softphone/",
      "markdown": "https://connectbyjbrh.com/docs/phone/softphone/index.md",
      "title": "Calling from the browser",
      "description": "The browser line: a per-person SIP endpoint, why every state the dialler shows comes from a SIP event, and how a browser call actually makes a phone ring.",
      "summary": "A softphone is a person's own phone line inside the browser: a `channel_routes` row with `channel='softphone'`, a per-person SIP endpoint, and a dialler whose every state comes from a SIP event rather than from a click. Dialling does not hand the carrier a number to ring — the carrier posts back to the same answer URL a customer's call arrives on, marked `Direction=outbound`, and the XML decides who rings.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "softphone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/outbound-calls/",
        "https://connectbyjbrh.com/docs/phone/carrier-routing/",
        "https://connectbyjbrh.com/docs/phone/call-record/",
        "https://connectbyjbrh.com/docs/phone/line-configuration/",
        "https://connectbyjbrh.com/docs/phone/call-consent/",
        "https://connectbyjbrh.com/research/provider-independent-telephony/"
      ]
    },
    {
      "id": "C0043",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/speaking-guide/",
      "markdown": "https://connectbyjbrh.com/docs/phone/speaking-guide/index.md",
      "title": "Telling the voice how to speak",
      "description": "The style block and the behaviour block: which settings become session parameters, which become instructions a model may only approximate, and which are neither.",
      "summary": "Two blocks of text are assembled for every call. `style_block` turns the delivery settings — speed, energy, warmth, pauses, fillers, formality — into lines of instruction. `behaviour_block` turns the conduct settings — role, goal, tone, rules, what to ask and never ask, objections, escalation, opening and closing — into more of them. Both are directions the model follows, approximates, or occasionally ignores.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-profile/",
        "https://connectbyjbrh.com/docs/phone/human-voice-profiles/",
        "https://connectbyjbrh.com/docs/phone/voice-lab/",
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/docs/phone/regional-speech/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "C0055",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/stuck-calls/",
      "markdown": "https://connectbyjbrh.com/docs/phone/stuck-calls/index.md",
      "title": "Stuck calls and the sweep",
      "description": "Call rows left active by a worker that died or a browser call with no worker behind it, the sweep that closes them against the provider cap, and what it charges.",
      "summary": "A call row still marked active long after the call ended is a row nobody closed — a worker that died, a browser call that never had one, a leg the carrier answered that never joined the room. `sweep_stale` closes them against the configured cap, runs from the engine tick as well as from the worker heartbeat, and charges what it closes.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/docs/phone/session-limits/",
        "https://connectbyjbrh.com/docs/phone/call-record/",
        "https://connectbyjbrh.com/docs/phone/softphone/",
        "https://connectbyjbrh.com/docs/phone/phone-health/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/"
      ]
    },
    {
      "id": "C0044",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/supervisor/",
      "markdown": "https://connectbyjbrh.com/docs/phone/supervisor/index.md",
      "title": "Steering a live call",
      "description": "The panel a colleague uses to steer a call in progress: why guidance never reaches the caller, and why pause, take over and release are read back out of the log.",
      "summary": "`supervisor.py` lets a colleague steer a call while it is happening. Two rules hold it together: an instruction goes into the model's system prompt and nowhere else, so the caller never hears it read out; and the control state — running, paused, taken over — is derived from the guidance log rather than stored beside it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/live-transfer/",
        "https://connectbyjbrh.com/research/derived-control-state/",
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/docs/phone/voice-worker/",
        "https://connectbyjbrh.com/docs/phone/hangup-attribution/",
        "https://connectbyjbrh.com/docs/phone/transcript/"
      ]
    },
    {
      "id": "C0011",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/transcript/",
      "markdown": "https://connectbyjbrh.com/docs/phone/transcript/index.md",
      "title": "Call transcripts",
      "description": "How a call transcript is assembled turn by turn, what the latency beside a reply actually measures, and the three things a transcript is not.",
      "summary": "A transcript is the sequence of turns on a call — what the caller said and what the voice said — assembled as the conversation happens rather than reconstructed afterwards. The latency shown against a reply is measured on the wire, from the caller's last word to the first audio back, not from the gap between two transcript rows. It is not a recording of the audio.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/call-summary/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/docs/phone/barge-in/",
        "https://connectbyjbrh.com/docs/phone/call-record/",
        "https://connectbyjbrh.com/docs/phone/supervisor/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/"
      ]
    },
    {
      "id": "C0017",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/turn-based-engine/",
      "markdown": "https://connectbyjbrh.com/docs/phone/turn-based-engine/index.md",
      "title": "The carrier turn-based engine",
      "description": "The carrier webhook path — gather, reply, redirect — when it is the right engine for a line, and the three things it cannot do.",
      "summary": "The turn-based engine is the carrier's own loop: it collects a sentence, posts it to Connect, Connect writes a reply, and the carrier reads that reply out. It needs no worker, no trunk and no fleet, which makes it the simplest way to answer a number. What it cannot do is let a caller interrupt — a turn is a whole sentence, by construction.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/realtime-engine/",
        "https://connectbyjbrh.com/docs/phone/connect-voice-tts/",
        "https://connectbyjbrh.com/docs/phone/inbound-calls/",
        "https://connectbyjbrh.com/docs/phone/carrier-verification/",
        "https://connectbyjbrh.com/docs/phone/barge-in/",
        "https://connectbyjbrh.com/research/provider-independent-telephony/"
      ]
    },
    {
      "id": "C0023",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/turn-detection/",
      "markdown": "https://connectbyjbrh.com/docs/phone/turn-detection/index.md",
      "title": "Turn detection and end of speech",
      "description": "Deciding that the caller has finished speaking: the model's own detection, the host semantic path with dynamic endpointing, and how to choose between them.",
      "summary": "Something has to decide the caller has stopped talking, and on a live call that decision is most of the felt speed. Connect can leave it to the realtime model, or run it on the host — Silero voice activity detection plus an audio end-of-turn model in the worker process, with dynamic endpointing. The choice is `rt_turn_detection`, and it is decided on measured turn timings from real calls, not on which sounds better.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/barge-in/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/docs/phone/silence/",
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/"
      ]
    },
    {
      "id": "C0054",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/voice-budget/",
      "markdown": "https://connectbyjbrh.com/docs/phone/voice-budget/index.md",
      "title": "The budget that stops a call",
      "description": "The budget question asked before an outbound call and before answering an inbound one, what a refused caller hears, and how the quota breaker differs from it.",
      "summary": "`budget_refusal` is asked twice: before Connect places an outbound call, and before it answers an inbound one. A refused outbound is simply not placed. A refused inbound is answered and told — the caller hears the line's own closed-line message in the business's name and the call ends, rather than connecting to silence.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/docs/phone/line-off/",
        "https://connectbyjbrh.com/docs/phone/business-hours/",
        "https://connectbyjbrh.com/docs/phone/phone-followup-drain/",
        "https://connectbyjbrh.com/docs/phone/inbound-calls/",
        "https://connectbyjbrh.com/docs/phone/greeting-prewarm/"
      ]
    },
    {
      "id": "C0053",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/voice-cost/",
      "markdown": "https://connectbyjbrh.com/docs/phone/voice-cost/index.md",
      "title": "What a call costs",
      "description": "Why a voice call is metered by modality rather than by a total token count, the reporting field that never existed, and what a call reporting no tokens is charged.",
      "summary": "A live call is billed on audio tokens, which cost about four times the same model's text rate on input and roughly 2.7 times on output. Metering is therefore split by modality rather than totalled: `usage_summary` reads the audio and text counts the SDK actually reports. A call that reports no tokens is charged from its own duration at the per-minute rate, never at zero.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-budget/",
        "https://connectbyjbrh.com/docs/phone/stuck-calls/",
        "https://connectbyjbrh.com/docs/phone/session-limits/",
        "https://connectbyjbrh.com/docs/phone/call-record/",
        "https://connectbyjbrh.com/docs/phone/speaking-guide/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "C0040",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
      "markdown": "https://connectbyjbrh.com/docs/phone/voice-lab-review/index.md",
      "title": "Call quality review",
      "description": "What a finished call is scored on: deterministic findings with the setting each one points at, the model's opinion kept separate, and limits that do not lower the score.",
      "summary": "`voice_quality.review` runs when a call finishes. It produces deterministic findings — slow replies, long gaps, ignored interruptions, false stops, repetition, stock phrases, wrong script, an unheard caller — each naming the setting that would address it, and separately the model's opinion on delivery, labelled as the model's. Findings no control can fix are counted but do not lower the score.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-lab/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/docs/phone/barge-in/",
        "https://connectbyjbrh.com/docs/phone/call-outcome/",
        "https://connectbyjbrh.com/research/model-limited-findings/"
      ]
    },
    {
      "id": "C0039",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/voice-lab/",
      "markdown": "https://connectbyjbrh.com/docs/phone/voice-lab/index.md",
      "title": "The Voice Lab",
      "description": "The screen where a line's voice is tuned: engine settings that take effect exactly, steering text the model interprets, drafts and test calls.",
      "summary": "The Voice Lab sits at Phone → Setup and is open to both audiences. Every control on it declares which of two kinds it is: an **engine** setting that becomes a session parameter and takes effect exactly, or a **steering** setting that becomes a line in the instructions and is interpreted. A draft can be heard on a test call before it is saved.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-profile/",
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
        "https://connectbyjbrh.com/docs/phone/speaking-guide/",
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/docs/phone/realtime-engine/"
      ]
    },
    {
      "id": "C0037",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/voice-profile/",
      "markdown": "https://connectbyjbrh.com/docs/phone/voice-profile/index.md",
      "title": "Voice profiles",
      "description": "Named bundles of voice settings: where one can be attached, the six-step resolution order that decides which wins, and what is recorded on the call.",
      "summary": "A profile is a saved set of voice settings with a name. It can sit on the workspace, on a purpose, on a particular line, or on one contact, and `voice_style.resolve` walks those from broad to narrow with the narrowest winning. Whatever it lands on is snapshotted onto the call, so a review months later judges the settings that actually ran.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-lab/",
        "https://connectbyjbrh.com/docs/phone/human-voice-profiles/",
        "https://connectbyjbrh.com/docs/phone/speaking-guide/",
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
        "https://connectbyjbrh.com/docs/phone/model-limits/"
      ]
    },
    {
      "id": "C0018",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/voice-worker/",
      "markdown": "https://connectbyjbrh.com/docs/phone/voice-worker/index.md",
      "title": "The voice worker",
      "description": "The process that holds a realtime call: how it starts, what it heartbeats, how a deploy drains it, and what a caller gets when none is running.",
      "summary": "The voice worker is the process that holds a realtime call. The SDK runs each call in its own process, every idle process warms greetings, and every live worker heartbeats its load and the calls it is holding. If nothing has checked in for 90 seconds, admission refuses new calls before a row exists — rather than sending a caller to a fleet that is not there.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/worker-capacity/",
        "https://connectbyjbrh.com/docs/phone/realtime-engine/",
        "https://connectbyjbrh.com/docs/phone/greeting-prewarm/",
        "https://connectbyjbrh.com/docs/phone/phone-health/",
        "https://connectbyjbrh.com/docs/phone/stuck-calls/",
        "https://connectbyjbrh.com/research/background-threads/"
      ]
    },
    {
      "id": "C0019",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/phone/worker-capacity/",
      "markdown": "https://connectbyjbrh.com/docs/phone/worker-capacity/index.md",
      "title": "Capacity and admission control",
      "description": "How admission decides a call can be taken: load per core, the 0.85 threshold, why a silent worker reads as free, and what saturation does to a caller.",
      "summary": "Admission is decided on load. Every worker reports its one-minute load per core and the calls it holds, and `ring` refuses `not_ready` when every live worker is above `WORKER_BUSY_LOAD` — **0.85**, the same figure the worker gives LiveKit as its own threshold, so the gate and the dispatcher agree. A worker reporting no load is treated as free, deliberately.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-worker/",
        "https://connectbyjbrh.com/docs/phone/phone-health/",
        "https://connectbyjbrh.com/docs/phone/not-a-conversation/",
        "https://connectbyjbrh.com/docs/phone/session-limits/",
        "https://connectbyjbrh.com/docs/phone/realtime-engine/",
        "https://connectbyjbrh.com/docs/follow-ups/"
      ]
    },
    {
      "id": "C0327",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/product/",
      "markdown": "https://connectbyjbrh.com/docs/product/index.md",
      "title": "Connect by JBRH",
      "description": "What Connect by JBRH is, the five channels it works across, the records it keeps, and the controls that decide what it may do without asking.",
      "summary": "Connect by JBRH is a Digital Business Employee: one system that reads a business's email, answers its phone, handles WhatsApp and SMS, researches prospects, keeps a single relationship record per person, and follows through on what it promised — inside rules and approvals the business sets.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/how-connect-works/",
        "https://connectbyjbrh.com/docs/product/channels/",
        "https://connectbyjbrh.com/docs/product/limits/",
        "https://connectbyjbrh.com/docs/getting-started/",
        "https://connectbyjbrh.com/docs/compare/connect-vs-crm/"
      ]
    },
    {
      "id": "C0338",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/product/accessibility-statement/",
      "markdown": "https://connectbyjbrh.com/docs/product/accessibility-statement/index.md",
      "title": "Accessibility",
      "description": "What has actually been measured in Connect's interface — focus rings read from a focused element, contrast ratios, form-field names — and what is known to be imperfect.",
      "summary": "This page records what was measured in the interface, how it was measured, and on what date. It makes no conformance claim against any accessibility standard, because no formal assessment has been published. What has been done: every keyboard focus ring was proved to render, four colour tokens were measured and corrected, and every form field was checked for a name a screen reader can read.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/accessibility/",
        "https://connectbyjbrh.com/docs/technology/aria/",
        "https://connectbyjbrh.com/research/focus-rings-that-computed-to-none/",
        "https://connectbyjbrh.com/docs/troubleshooting/keyboard-trap/",
        "https://connectbyjbrh.com/docs/getting-started/keyboard/",
        "https://connectbyjbrh.com/docs/product/status/"
      ]
    },
    {
      "id": "C0329",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/product/channels/",
      "markdown": "https://connectbyjbrh.com/docs/product/channels/index.md",
      "title": "Channels",
      "description": "The five ways Connect reaches people — email, phone, WhatsApp, SMS and a browser softphone — with the status, the provider and the honest limit of each.",
      "summary": "Connect works across five channels: email, phone, WhatsApp, SMS and a softphone in the browser. Four are available end to end. SMS is the exception — inbound messages, STOP and suppression all work, while sending depends entirely on the provider a workspace has configured, and the carrier on the live account carries no SMS at all.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp",
        "sms",
        "softphone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
        "https://connectbyjbrh.com/docs/product/what-connect-decides/",
        "https://connectbyjbrh.com/docs/product/data-you-give-connect/"
      ]
    },
    {
      "id": "C0340",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/product/data-you-give-connect/",
      "markdown": "https://connectbyjbrh.com/docs/product/data-you-give-connect/index.md",
      "title": "The data you give Connect",
      "description": "Every category of material a workspace supplies to Connect, the reason each one is needed, and exactly what changes if you decide to withhold it.",
      "summary": "Connect needs an identity to sign you in, and nothing else to start. Everything after that is additive: a mailbox, a phone line, a business profile, Knowledge, rules, and the corrections you make. Each category below says why it is needed and what happens if you leave it out — and in every case leaving it out narrows what Connect does rather than breaking it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/privacy-in-the-product/",
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/getting-started/teach-connect-your-business/",
        "https://connectbyjbrh.com/docs/product/the-record-model/",
        "https://connectbyjbrh.com/docs/account/plan/",
        "https://connectbyjbrh.com/docs/product/what-a-person-decides/"
      ]
    },
    {
      "id": "C0328",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/product/how-connect-works/",
      "markdown": "https://connectbyjbrh.com/docs/product/how-connect-works/index.md",
      "title": "How Connect works",
      "description": "One pass through Connect in plain language: how a message becomes a canonical record, a grounded decision, a permitted action and an audit entry.",
      "summary": "Every piece of work in Connect follows the same path, whichever channel it arrived on: something happens, the workspace is resolved, a canonical record is written, the work is classified and grounded, the rules decide whether it may proceed, an action is taken through a provider, and the result is written back to the relationship and to the audit trail.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/docs/workflows/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/product/the-record-model/"
      ]
    },
    {
      "id": "C0334",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/product/limits/",
      "markdown": "https://connectbyjbrh.com/docs/product/limits/index.md",
      "title": "Current limits",
      "description": "Every current limit in Connect, by channel and capability: what is not available, what depends on a provider, and what is deliberately reserved for a person.",
      "summary": "This page lists what Connect cannot do today. It exists so that nobody discovers a limit during a customer conversation. Limits are grouped by channel, and each says whether it is a design decision, a provider dependency, or work that has not been done.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/status/",
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/docs/phone/model-limits/"
      ]
    },
    {
      "id": "C0333",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/product/owner-and-customer/",
      "markdown": "https://connectbyjbrh.com/docs/product/owner-and-customer/index.md",
      "title": "One product, two audiences",
      "description": "JBRH runs its own business on Connect and sells the same product. One feature set, one implementation, two routers — and a difference that is purely commercial.",
      "summary": "The company that built Connect uses it to run its own business, from the same code a customer gets. There is no operator-only feature and no customer-only feature. What differs is commercial: a customer's use is bounded by their plan's allowances, and the operator has no plan and no allowances. Two platform administration screens are the only deliberate exception.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/docs/account/owner-vs-tenant/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/docs/product/status/",
        "https://connectbyjbrh.com/docs/product/privacy-in-the-product/"
      ]
    },
    {
      "id": "C0339",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/product/privacy-in-the-product/",
      "markdown": "https://connectbyjbrh.com/docs/product/privacy-in-the-product/index.md",
      "title": "Privacy inside the product",
      "description": "What Connect does with a workspace's material in practice: where it sits, what reaches a model, what a person can remove, and what is deliberately kept.",
      "summary": "Everything a workspace supplies belongs to that workspace and is filtered by it three separate times. What reaches an AI model on any one task is a budgeted extract rather than the whole record. Memories, files and records can be corrected or removed by a person, and a small set of things is kept deliberately, because removing them would cause the harm they exist to prevent.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/data-you-give-connect/",
        "https://connectbyjbrh.com/docs/security/data-retention/",
        "https://connectbyjbrh.com/docs/memory/deleting/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/knowledge/prompt-injection/",
        "https://connectbyjbrh.com/docs/how-to/export-your-data/"
      ]
    },
    {
      "id": "C0336",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/product/roadmap-language/",
      "markdown": "https://connectbyjbrh.com/docs/product/roadmap-language/index.md",
      "title": "How this manual talks about the future",
      "description": "The four words this manual uses about a capability, what each one promises, what none of them promise, and the vocabulary the build refuses to print.",
      "summary": "This manual describes a capability with one of four words and nothing else. Available means running now. Foundation means the code exists and what you can use is narrower. Not yet means designed and not built. Reference means background about a technology. None of the four carries a date, an order of work, or a promise that anything unbuilt is going to be built.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/status/",
        "https://connectbyjbrh.com/docs/product/limits/",
        "https://connectbyjbrh.com/research/status-vocabulary/",
        "https://connectbyjbrh.com/docs/product/versions/",
        "https://connectbyjbrh.com/docs/product/accessibility-statement/"
      ]
    },
    {
      "id": "C0335",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/product/status/",
      "markdown": "https://connectbyjbrh.com/docs/product/status/index.md",
      "title": "Capability status",
      "description": "The capability register behind this manual: ninety capabilities, each labelled AVAILABLE, IN DEVELOPMENT or PLANNED, with its evidence and a machine-readable copy.",
      "summary": "Every capability this manual names carries a status and a piece of evidence. Ninety are registered. Eighty-one are available to both audiences, three are platform administration for the operator, four are foundation — real code with a deliberately narrower usable capability, labelled IN DEVELOPMENT — and two are designed and not built, labelled PLANNED. Nothing is released as a beta. The machine-readable copy is at /docs-data/status.json.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-11",
      "related": [
        "https://connectbyjbrh.com/docs/product/limits/",
        "https://connectbyjbrh.com/docs/product/roadmap-language/",
        "https://connectbyjbrh.com/docs/product/versions/",
        "https://connectbyjbrh.com/developers/status-manifest/",
        "https://connectbyjbrh.com/docs/product/accessibility-statement/",
        "https://connectbyjbrh.com/docs/product/owner-and-customer/"
      ]
    },
    {
      "id": "C0330",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/product/the-record-model/",
      "markdown": "https://connectbyjbrh.com/docs/product/the-record-model/index.md",
      "title": "The records Connect keeps",
      "description": "Everything Connect writes down: the workspace root, the thirteen record sheets, the two shapes of mail, and how a person, a company and a conversation relate.",
      "summary": "Connect keeps its own records rather than pointing at somebody else's. A workspace is the root; under it sit people, companies, conversations, calls, prospects, deals, cases, follow-ups, files, knowledge and memory. Every one of them carries the workspace it belongs to, and every one of them is visible as a sheet in the Data grid.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/how-connect-works/",
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/product/privacy-in-the-product/",
        "https://connectbyjbrh.com/docs/product/what-connect-decides/"
      ]
    },
    {
      "id": "C0337",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/product/versions/",
      "markdown": "https://connectbyjbrh.com/docs/product/versions/index.md",
      "title": "Versions and what changed",
      "description": "Three kinds of version live here: the product's own, the date on every page, and the specification versions the machine surfaces are written to.",
      "summary": "Connect's product version is 6.3.2. Every page in this manual carries the date its claims were last checked against the running system, and every machine surface carries the specification version it is written to. All three are published together at /docs-data/versions.json, so a client never has to infer a version from prose.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/status/",
        "https://connectbyjbrh.com/docs/product/roadmap-language/",
        "https://connectbyjbrh.com/docs/protocols/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/docs/technology/versioning/",
        "https://connectbyjbrh.com/developers/changelog-feed/"
      ]
    },
    {
      "id": "C0332",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/product/what-a-person-decides/",
      "markdown": "https://connectbyjbrh.com/docs/product/what-a-person-decides/index.md",
      "title": "What a person always decides",
      "description": "The decisions Connect never takes: price and terms, money and law, suppression, the rules themselves — each with the reason it is reserved for a human.",
      "summary": "Some decisions are reserved for a person no matter how a workspace is configured. They fall into four groups: anything that commits the business commercially, anything touching money or law, anything that would undo a protection such as a do-not-contact entry, and the rules themselves. Each is reserved for a stated reason rather than out of caution.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/what-connect-decides/",
        "https://connectbyjbrh.com/docs/autonomy/approvals/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/assistant/assistant-authority/",
        "https://connectbyjbrh.com/docs/product/limits/"
      ]
    },
    {
      "id": "C0331",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/product/what-connect-decides/",
      "markdown": "https://connectbyjbrh.com/docs/product/what-connect-decides/index.md",
      "title": "What Connect decides on its own",
      "description": "The decisions Connect makes without asking — priority, classification, wording, timing, research depth — and the gates that sit around every one of them.",
      "summary": "Connect decides what to work on first, what an arriving message is about, what a reply should say, when to follow up and on which channel, how much research a prospect is worth, and when to stop and refuse. Around each of those sits a gate written in ordinary code and database rules, which the model never gets a vote in.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/what-a-person-decides/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/explicit-gates/",
        "https://connectbyjbrh.com/docs/product/how-connect-works/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/product/owner-and-customer/"
      ]
    },
    {
      "id": "C0104",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/prospects/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/index.md",
      "title": "Prospecting in Connect",
      "description": "The prospecting section: the stages from a discovery brief to a first reply, the evidence rule underneath them, and where each page sits.",
      "summary": "Prospecting turns a description of who you want to reach into researched organisations, evidence-backed claims about them, and — where a real address exists — one first message. Ten stages run in order and each can stop the next. No address is ever guessed. A claim with nothing behind it never reaches the prospect record, which is why the list is shorter than a scraper's and survives being read six months later.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/discovery-criteria/",
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/workflows/prospect-discovery/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/"
      ]
    },
    {
      "id": "C0107",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/background-discovery/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/background-discovery/index.md",
      "title": "Discovery running in the background",
      "description": "Discovery that runs on a schedule rather than on a button: what it does between visits, what it consumes, and how you see progress.",
      "summary": "Discovery does not need you watching it. A saved search keeps collecting and researching between visits, so the prospect list grows while nobody is on the screen. It draws on the same allowance an interactive run does, stops when that allowance is spent rather than queuing silently, and every pass it makes is written to the activity trail so the growth is explainable afterwards.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/prospects/prospect-freshness/",
        "https://connectbyjbrh.com/docs/prospects/prospect-counts/",
        "https://connectbyjbrh.com/docs/prospects/prospect-costs/",
        "https://connectbyjbrh.com/docs/troubleshooting/prospect-allowance/",
        "https://connectbyjbrh.com/docs/assistant/"
      ]
    },
    {
      "id": "C0108",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/candidate-collection/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/candidate-collection/index.md",
      "title": "Collecting candidates",
      "description": "The stage between a search and a researched prospect: where a candidate comes from, what is stored about it, and what is deliberately left undecided.",
      "summary": "Collection produces candidates, not prospects. A candidate is an organisation that matches the shape you described, with almost nothing asserted about it yet — a name, a public presence, whatever identified it. No score, no fit reason, no address and no judgement. Keeping this stage judgement-free is what stops a cheap first impression from setting the tone for everything read afterwards.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/discovery-criteria/",
        "https://connectbyjbrh.com/docs/prospects/public-source-research/",
        "https://connectbyjbrh.com/docs/prospects/prospect-identity/",
        "https://connectbyjbrh.com/docs/prospects/prospect-upload/",
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/relationships/"
      ]
    },
    {
      "id": "C0123",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/cold-sequence-stop/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/cold-sequence-stop/index.md",
      "title": "Stopping a cold sequence",
      "description": "Every event that ends a cold outreach sequence, why each takes effect at once rather than at the next scheduled step, and how to confirm one stopped.",
      "summary": "A cold sequence stops the moment a stopping event occurs, not at the next scheduled step. Any reply stops it. So does a do-not-contact entry, an unsubscribe, a suppression, a person stopping it by hand, and identity resolution discovering that the organisation is already a relationship. Delay here has no upside and one very visible failure.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/prospect-reply/",
        "https://connectbyjbrh.com/docs/prospects/compliance-check/",
        "https://connectbyjbrh.com/docs/prospects/first-outreach/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/troubleshooting/outreach-blocked/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "C0120",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/compliance-check/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/compliance-check/index.md",
      "title": "The compliance check before outreach",
      "description": "Do-not-contact, suppression, unsubscribe, complaints and prior contact, all checked in one place before any outreach leaves a workspace.",
      "summary": "Every outbound first contact passes one check that asks whether this recipient may be written to at all. Suppression, unsubscribe, complaints and do-not-contact are evaluated together in a single place rather than at each call site, so there is no path that skips them. A do-not-contact entry is not something the Connect Assistant can clear.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/sender-readiness/",
        "https://connectbyjbrh.com/docs/prospects/first-outreach/",
        "https://connectbyjbrh.com/docs/prospects/cold-sequence-stop/",
        "https://connectbyjbrh.com/docs/troubleshooting/outreach-blocked/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0115",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/contact-evidence/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/contact-evidence/index.md",
      "title": "Evidence for a contact address",
      "description": "How a prospect's address earns its place: where it was found, how that origin is stored, and what makes one address usable and another not.",
      "summary": "An address on a prospect record carries its origin the way every other claim does — where it was published, and when it was read. That provenance is what separates a usable address from a plausible string, and it is the thing to check before approving a first message, because an address belonging to a third party is a real address that is still the wrong one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/docs/prospects/contactability/",
        "https://connectbyjbrh.com/docs/prospects/prospect-identity/",
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/workflows/contact-discovery/",
        "https://connectbyjbrh.com/docs/relationships/"
      ]
    },
    {
      "id": "C0113",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/contactability/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/contactability/index.md",
      "title": "Contactability",
      "description": "The gap between a business you can research and one you can write to, why the two counts differ, and what to do with the difference.",
      "summary": "Contactability is a separate fact from fit. A business can be perfectly qualified and still have no address anybody published, in which case Connect keeps it as a researched prospect with a different next action rather than inventing a way to reach it. The contactable count, not the discovered count, is the number that tells you whether outreach has anything to do today.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/docs/prospects/contact-evidence/",
        "https://connectbyjbrh.com/docs/prospects/qualification/",
        "https://connectbyjbrh.com/docs/workflows/keeping-a-prospect-without-email/",
        "https://connectbyjbrh.com/docs/troubleshooting/prospect-no-email/",
        "https://connectbyjbrh.com/docs/follow-ups/"
      ]
    },
    {
      "id": "C0116",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/decision-makers/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/decision-makers/index.md",
      "title": "Finding the right person",
      "description": "How a role at a prospect is inferred from public material, why it is recorded as an inference, and what that means for who a first message names.",
      "summary": "Roles are inferred, never asserted. If public material shows a person described as running operations, the record says that material shows it and keeps the page — it does not state as fact that this person decides. The distinction matters because a message that names the wrong decision-maker with confidence is worse than one that names nobody.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/public-source-research/",
        "https://connectbyjbrh.com/docs/prospects/contact-evidence/",
        "https://connectbyjbrh.com/docs/prospects/personalised-angle/",
        "https://connectbyjbrh.com/docs/prospects/prospect-identity/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/one-person-many-channels/"
      ]
    },
    {
      "id": "C0117",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/deep-research/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/deep-research/index.md",
      "title": "Deep research on a prospect",
      "description": "The second, deeper pass over a prospect: what it adds, what it consumes, and the rule that decides which candidates are worth it.",
      "summary": "A deeper pass reads further into a candidate that a first pass left undecided. It is routed rather than offered to everything: the rule is that a deeper read runs only where it can change a decision. A candidate already clearly in or clearly out gains nothing from more reading, so the money goes to the ones sitting on a line, and to the ones whose only unknown is how to reach them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/public-source-research/",
        "https://connectbyjbrh.com/docs/prospects/prospect-costs/",
        "https://connectbyjbrh.com/docs/prospects/prospect-freshness/",
        "https://connectbyjbrh.com/docs/workflows/deep-research-flow/",
        "https://connectbyjbrh.com/research/research-cost-routing/",
        "https://connectbyjbrh.com/docs/prospects/qualification/"
      ]
    },
    {
      "id": "C0105",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/discovery-criteria/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/discovery-criteria/index.md",
      "title": "Describing who you want to reach",
      "description": "What a discovery brief holds, which parts become hard filters and which only steer research, and how to write one that returns real work.",
      "summary": "A discovery brief describes the business you want to reach: what it does, where it is, roughly how big it is, and what makes one worth your time. Some of that becomes a hard filter that excludes candidates outright; the rest steers research and feeds the fit reason later. Writing a brief well is mostly knowing which sentence is doing which job.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/prospects/location-scope/",
        "https://connectbyjbrh.com/docs/prospects/candidate-collection/",
        "https://connectbyjbrh.com/docs/prospects/fit-reason/",
        "https://connectbyjbrh.com/docs/troubleshooting/no-prospects-found/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "C0110",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/evidence/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/evidence/index.md",
      "title": "Evidence on a prospect",
      "description": "Why every claim on a prospect carries the source it came from, what qualifies as backing, and what happens to a statement that has none.",
      "summary": "Every claim on a prospect record arrives attached to where it came from. A statement with nothing behind it does not reach the record at all — it is not softened, flagged or marked uncertain, it is simply not written. That single rule is what makes a prospect list still worth reading months later, and it is the reason the list is shorter than one built by a scraper.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/public-source-research/",
        "https://connectbyjbrh.com/docs/prospects/qualification/",
        "https://connectbyjbrh.com/docs/prospects/prospect-freshness/",
        "https://connectbyjbrh.com/docs/prospects/contact-evidence/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "C0121",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/first-outreach/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/first-outreach/index.md",
      "title": "First outreach",
      "description": "The first message to a prospect: what goes out, what is held and why, and what is written to the record in both cases.",
      "summary": "First outreach is one message through the same send boundary a person's own mail uses. Whether it goes immediately or waits is decided by the channel's autonomy mode at the narrowest scope that applies. Either way the record changes: a held message is queued with what it answers, and a sent one is only called *sent* once the provider has acknowledged it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/sender-readiness/",
        "https://connectbyjbrh.com/docs/prospects/compliance-check/",
        "https://connectbyjbrh.com/docs/prospects/prospect-reply/",
        "https://connectbyjbrh.com/docs/workflows/prospect-outreach/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/",
        "https://connectbyjbrh.com/docs/follow-ups/"
      ]
    },
    {
      "id": "C0112",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/fit-reason/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/fit-reason/index.md",
      "title": "Why this prospect",
      "description": "The sentence explaining why an organisation is on your list: what it may cite, what it is forbidden to say, and how to fix one that reads wrong.",
      "summary": "Beside every qualified prospect sits a short written reason it is there. It is assembled from claims that already carry their sources, so each part of it can be checked. It is the thing to read before a score, because a number tells you how confident something was and a reason tells you what it was confident about — and only the second can be argued with.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/qualification/",
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/prospects/personalised-angle/",
        "https://connectbyjbrh.com/docs/prospects/prospect-passport/",
        "https://connectbyjbrh.com/research/evidence-for-next-action/",
        "https://connectbyjbrh.com/docs/sales/"
      ]
    },
    {
      "id": "C0106",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/location-scope/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/location-scope/index.md",
      "title": "Location and scope",
      "description": "How a place in a discovery search is interpreted, what widening it actually costs, and why a tighter area usually returns more usable prospects.",
      "summary": "A place narrows which organisations are collected before any research money is spent, so it is the highest-leverage line in a search. Widening it does not return proportionally more good prospects: it returns more candidates competing for the same research budget, each getting a thinner pass. A city usually beats a country on both count and quality of what you can actually write to.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/discovery-criteria/",
        "https://connectbyjbrh.com/docs/prospects/candidate-collection/",
        "https://connectbyjbrh.com/docs/prospects/prospect-costs/",
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/research/research-cost-routing/",
        "https://connectbyjbrh.com/docs/troubleshooting/no-prospects-found/"
      ]
    },
    {
      "id": "C0114",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/no-guessed-email/index.md",
      "title": "Connect does not guess email addresses",
      "description": "Connect never constructs a prospect's email contact from a name and a domain. What that rule costs, what it buys, and what happens to a prospect without one.",
      "summary": "No pattern-generated contact is ever produced, tested or sent to. There is no `first.last@domain` construction, no permutation list handed to a verifier, and no setting that turns one on. An address is found in a public source with that source recorded, or the prospect has none and gets a different next action. The rule costs volume on purpose.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/contactability/",
        "https://connectbyjbrh.com/docs/prospects/contact-evidence/",
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/troubleshooting/prospect-no-email/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "C0118",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/personalised-angle/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/personalised-angle/index.md",
      "title": "The angle for first contact",
      "description": "The opening line of a first message: how it is grounded in sourced claims, what it is refused permission to say, and what makes one read as automated.",
      "summary": "The angle is the reason this message is arriving at this business rather than at a thousand others. It is built from claims already on the record, each carrying the source it came from, so nothing in the opening is a flourish nobody can check. Anything that would need an invented fact, a price or a promise is refused and left for a person.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/fit-reason/",
        "https://connectbyjbrh.com/docs/prospects/first-outreach/",
        "https://connectbyjbrh.com/docs/prospects/sender-readiness/",
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "C0130",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/prospect-costs/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/prospect-costs/index.md",
      "title": "What prospecting costs",
      "description": "Where prospecting spends money, how the cost router decides a deeper pass is worth running, and which screen shows what a run consumed.",
      "summary": "Prospecting spends on model calls: reading sources, extracting claims, scoring against your brief, and writing an opening. `prospect_cost_router` decides how much of that a given prospect is worth, and its test is not importance but consequence — would a deeper pass change what happens next. The spend appears in the same usage record as every other AI call.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/prospects/deep-research/",
        "https://connectbyjbrh.com/docs/prospects/prospect-freshness/",
        "https://connectbyjbrh.com/research/research-cost-routing/",
        "https://connectbyjbrh.com/docs/prospects/location-scope/",
        "https://connectbyjbrh.com/docs/troubleshooting/no-prospects-found/"
      ]
    },
    {
      "id": "C0129",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/prospect-counts/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/prospect-counts/index.md",
      "title": "The numbers above the list",
      "description": "What each headline number above the prospect list counts, and the paging defect that once made every one of them stop at five hundred.",
      "summary": "Six numbers sit above the prospect list: organisations discovered, contacts, contactable, qualified, already contacted, and ready to send. Each answers a different question and they are not meant to add up. All six were once derived from the newest five hundred rows, which made them agree with each other and disagree with the database.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/prospects/contactability/",
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/",
        "https://connectbyjbrh.com/docs/prospects/prospect-costs/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "C0127",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/prospect-freshness/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/prospect-freshness/index.md",
      "title": "Keeping prospect research fresh",
      "description": "Prospect research ages at different speeds. What is re-checked, what is left alone, and the control that stops re-research becoming a standing bill.",
      "summary": "Freshness is the record of when each claim about a prospect was last proved, and `prospect_freshness` uses it to decide what is worth checking again. Not everything ages: a company's founding year does not, its opening hours do. Re-research is routed through the same cost control as first research, so a deeper pass runs only where a stale claim could change a decision.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/prospects/deep-research/",
        "https://connectbyjbrh.com/docs/prospects/prospect-costs/",
        "https://connectbyjbrh.com/docs/prospects/prospect-passport/",
        "https://connectbyjbrh.com/research/research-cost-routing/"
      ]
    },
    {
      "id": "C0128",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/prospect-identity/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/prospect-identity/index.md",
      "title": "Resolving a prospect to an existing relationship",
      "description": "The check that recognises a discovered organisation as somebody you already deal with, what it matches on, and what happens when it fires.",
      "summary": "Before a discovered organisation becomes a prospect, `prospect_identity_resolution` asks whether the workspace already knows it. A match means the record is attached to the existing Person or Company instead of starting a cold life of its own. This is the check that stops a customer receiving an introduction to a company that has been invoicing them for a year.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/relationships/identities/",
        "https://connectbyjbrh.com/docs/troubleshooting/prospect-already-customer/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/",
        "https://connectbyjbrh.com/docs/prospects/prospect-to-opportunity/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "C0131",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/prospect-owner-tenant/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/prospect-owner-tenant/index.md",
      "title": "Prospecting for the Owner and for a customer",
      "description": "Prospecting is one implementation serving two audiences. What is identical, what the plan bounds, and why a tenant sometimes sees a 403 instead.",
      "summary": "The Owner and a customer prospect with the same code. There is no Owner-only prospecting feature and no customer-only one. The difference is commercial: a customer's use is bounded by their plan's allowances and recorded against them, and the Owner has no plan and no gates. Anything else that differs is a routing fault, not a product decision.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/troubleshooting/prospect-allowance/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/prospects/prospect-costs/"
      ]
    },
    {
      "id": "C0126",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/prospect-passport/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/prospect-passport/index.md",
      "title": "The prospect record",
      "description": "Every part of a prospect record, which parts a person supplied, which came from research with a source attached, and which are recalculated.",
      "summary": "A prospect record holds three kinds of thing that look alike on screen and behave completely differently: what somebody supplied, what research proved with a source attached, and what Connect recalculates from those two. Knowing which is which tells you what an edit will survive, what a re-research pass will overwrite, and which claim you may safely repeat to a stranger.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/prospects/fit-reason/",
        "https://connectbyjbrh.com/docs/prospects/contact-evidence/",
        "https://connectbyjbrh.com/docs/prospects/prospect-freshness/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "C0122",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/prospect-reply/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/prospect-reply/index.md",
      "title": "A prospect replies",
      "description": "What happens when a prospect answers: how the reply is classified, what it changes about the record, and which answers end the cold path immediately.",
      "summary": "A reply ends the cold stage whatever it says. The answer is classified, the sender is resolved to a Person rather than left as a string, and the record stops being a research object and becomes a conversation. Interest can open an opportunity; a refusal stops everything at the reply itself rather than at the next scheduled action.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/cold-sequence-stop/",
        "https://connectbyjbrh.com/docs/prospects/first-outreach/",
        "https://connectbyjbrh.com/docs/prospects/prospect-to-opportunity/",
        "https://connectbyjbrh.com/docs/workflows/reply-classification/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/docs/relationships/"
      ]
    },
    {
      "id": "C0124",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/prospect-to-opportunity/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/prospect-to-opportunity/index.md",
      "title": "From prospect to opportunity",
      "description": "When a researched prospect becomes a deal on the pipeline: what is created, what is linked rather than copied, and what deliberately stays behind.",
      "summary": "A prospect becomes an opportunity when a person decides there is a deal worth working — not when a reply arrives. The conversion creates a Person, a Company where one is warranted, and an Opportunity on the pipeline. The research, the evidence and the messages are not copied across; they stay on their own records and the new ones point at them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/prospects/prospect-reply/",
        "https://connectbyjbrh.com/docs/prospects/prospect-identity/",
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/docs/workflows/prospect-to-client/",
        "https://connectbyjbrh.com/docs/relationships/"
      ]
    },
    {
      "id": "C0125",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/prospect-upload/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/prospect-upload/index.md",
      "title": "Uploading your own list",
      "description": "Bringing a list you already own into Connect: the file, what is checked on every row, what happens to a row that fails, and what is never added.",
      "summary": "An uploaded list enters through `prospect_upload`, which reads a spreadsheet or delimited file, turns each row into a prospect record, and puts every one of them through the same identity, evidence and compliance rules a discovered prospect goes through. A row you supply is not privileged: an address on it is still recorded with its provenance, and no missing address is filled in.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/docs/prospects/contact-evidence/",
        "https://connectbyjbrh.com/docs/workflows/list-import/",
        "https://connectbyjbrh.com/docs/prospects/prospect-identity/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "C0109",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/public-source-research/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/public-source-research/index.md",
      "title": "Researching a candidate",
      "description": "What Connect reads about a candidate, what it extracts, and why text fetched from a stranger's website is treated as data rather than instruction.",
      "summary": "Research reads what an organisation publishes about itself and turns it into claims that carry their source. Only public material is read. Anything extracted arrives with the place it came from attached, and the text itself is treated as data — never as an instruction to follow — because a page written by a stranger is exactly where an instruction would be hidden.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/prospects/deep-research/",
        "https://connectbyjbrh.com/docs/prospects/decision-makers/",
        "https://connectbyjbrh.com/docs/prospects/candidate-collection/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "C0111",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/qualification/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/qualification/index.md",
      "title": "Qualifying a prospect",
      "description": "How researched claims become a fit judgement and a score, what the score is allowed to decide on its own, and how a person overrides it.",
      "summary": "Qualification turns what was read about an organisation into a judgement about whether it belongs on your list. It weighs signals drawn from sourced claims, produces a score and a written reason together, and never decides to contact anybody — that decision belongs to readiness, the compliance check and the channel's autonomy rule. A person can disagree, and the disagreement sticks.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/prospects/fit-reason/",
        "https://connectbyjbrh.com/docs/prospects/contactability/",
        "https://connectbyjbrh.com/docs/prospects/discovery-criteria/",
        "https://connectbyjbrh.com/docs/workflows/prospect-qualification-flow/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0119",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/prospects/sender-readiness/",
      "markdown": "https://connectbyjbrh.com/docs/prospects/sender-readiness/index.md",
      "title": "Sender readiness",
      "description": "The checks that stand between a written first message and a send: which mailbox, whether it is healthy, what allowance is left, and which signature applies.",
      "summary": "Readiness answers a narrow question: is there a mailbox that can actually carry this message right now. It checks which mailbox owns the outreach, whether that mailbox is healthy rather than merely connected, what the daily allowance has left, and which signature belongs to it. Failing readiness holds the message; it does not discard it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/compliance-check/",
        "https://connectbyjbrh.com/docs/prospects/first-outreach/",
        "https://connectbyjbrh.com/docs/prospects/personalised-angle/",
        "https://connectbyjbrh.com/docs/workflows/sender-readiness-check/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "T0121",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/index.md",
      "title": "Protocol reference",
      "description": "The wire protocols and description formats Connect speaks, the exact version of each, and which ones Connect only explains rather than runs.",
      "summary": "Connect speaks four protocols on the wire — MCP revision 2026-07-28, A2A 1.0.0, JSON-RPC 2.0 underneath both, and ordinary HTTP — and publishes three description formats: OpenAPI 3.1.0, Arazzo 1.1.0 and AsyncAPI 3.1.0. The rest of this section is background on standards Connect obeys as a publisher or does not implement at all, and each page says which it is.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/mcp/",
        "https://connectbyjbrh.com/docs/protocols/a2a/",
        "https://connectbyjbrh.com/docs/protocols/json-rpc/",
        "https://connectbyjbrh.com/developers/",
        "https://connectbyjbrh.com/docs/technology/"
      ]
    },
    {
      "id": "T0129",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/a2a-discovery/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/a2a-discovery/index.md",
      "title": "A2A agent discovery",
      "description": "The three ways one agent finds another under A2A — a well-known URI, a curated registry, or direct configuration — and which one Connect supports.",
      "summary": "A2A describes three discovery strategies: fetch a card from a well-known URI on a known domain, look the agent up in a curated registry, or be configured with its address directly. They differ in who vouches for the agent. Connect supports the first, serving its card at `/.well-known/agent-card.json`.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/agent-card/",
        "https://connectbyjbrh.com/docs/protocols/a2a/",
        "https://connectbyjbrh.com/docs/protocols/well-known-uris/",
        "https://connectbyjbrh.com/developers/a2a-integration/",
        "https://connectbyjbrh.com/developers/bot-verification/"
      ]
    },
    {
      "id": "T0127",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/a2a/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/a2a/index.md",
      "title": "A2A — the Agent2Agent protocol",
      "description": "The Agent2Agent protocol 1.0.0: how one agent finds another, asks it something in words, and why it sits beside MCP rather than replacing it.",
      "summary": "A2A is a protocol for one autonomous agent to discover another and ask it something in natural language, over JSON-RPC. Version 1.0.0 publishes a card at `/.well-known/agent-card.json` describing the agent's skills. Connect implements it at `POST /a2a` with five public documentation skills and no authenticated extended card.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/agent-card/",
        "https://connectbyjbrh.com/docs/protocols/a2a-discovery/",
        "https://connectbyjbrh.com/docs/protocols/mcp/",
        "https://connectbyjbrh.com/developers/a2a-integration/",
        "https://connectbyjbrh.com/docs/protocols/json-rpc/"
      ]
    },
    {
      "id": "T0128",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/agent-card/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/agent-card/index.md",
      "title": "The A2A Agent Card",
      "description": "The A2A Agent Card: where it lives, the fields that matter, how Connect generates its own, and what must never appear in a public card.",
      "summary": "An Agent Card is the JSON document an A2A agent publishes at `/.well-known/agent-card.json` so other agents can find out what it does before speaking to it. It names the agent, its protocol version, the endpoint URL, its declared capabilities and its skills. Connect's is generated from the same registry as the documentation.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/a2a/",
        "https://connectbyjbrh.com/docs/protocols/a2a-discovery/",
        "https://connectbyjbrh.com/docs/protocols/well-known-uris/",
        "https://connectbyjbrh.com/developers/agent-card/",
        "https://connectbyjbrh.com/developers/a2a-integration/"
      ]
    },
    {
      "id": "T0132",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/arazzo/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/arazzo/index.md",
      "title": "Arazzo",
      "description": "Arazzo 1.1.0 describes a multi-step sequence across API calls machine-readably — the order, the criteria and the outputs that carry between steps.",
      "summary": "Arazzo describes what a sequence of API calls achieves together: ordered steps, the criterion each must satisfy, and the outputs that feed the next one. It sits above OpenAPI, which describes calls individually. Connect publishes three workflows at `/developers/workflows.arazzo.yaml`, to **1.1.0**.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/openapi/",
        "https://connectbyjbrh.com/docs/protocols/asyncapi/",
        "https://connectbyjbrh.com/developers/arazzo-workflows/",
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/docs/workflows/"
      ]
    },
    {
      "id": "T0133",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/asyncapi/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/asyncapi/index.md",
      "title": "AsyncAPI",
      "description": "AsyncAPI 3.1.0 describes event and webhook interfaces — channels, operations and message envelopes — and Connect publishes one for its outbound webhooks.",
      "summary": "AsyncAPI describes an interface where messages arrive rather than being requested: channels, the operations that send or receive on them, and the message envelope. Connect publishes one at `/developers/asyncapi.yaml` to **3.1.0**, covering outbound webhooks — one channel, one envelope, signed.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/openapi/",
        "https://connectbyjbrh.com/developers/asyncapi-events/",
        "https://connectbyjbrh.com/developers/webhooks-outbound/",
        "https://connectbyjbrh.com/developers/webhook-signatures/",
        "https://connectbyjbrh.com/developers/webhooks-vs-polling/"
      ]
    },
    {
      "id": "T0140",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/ical-scheduling/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/ical-scheduling/index.md",
      "title": "Scheduling formats",
      "description": "Where date and time interchange appears in Connect: RFC 3339 instants on the wire, due times on follow-ups, and why iCalendar does not appear at all.",
      "summary": "Scheduling data reaches Connect as instants, not as calendar documents. Timestamps on the wire are RFC 3339 — the internet profile of ISO 8601 — in UTC. A follow-up carries a due instant and nothing else; business hours and timezone are applied when it is acted on. Connect emits no iCalendar.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/developers/time-and-timezones/",
        "https://connectbyjbrh.com/docs/protocols/asyncapi/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/developers/data-model-public/"
      ]
    },
    {
      "id": "T0130",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/json-rpc/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/json-rpc/index.md",
      "title": "JSON-RPC 2.0",
      "description": "JSON-RPC 2.0, the envelope MCP and A2A both sit on: request, response, notification, the reserved error codes and how Connect maps them to HTTP.",
      "summary": "JSON-RPC 2.0 is a small convention for calling a method by name with JSON arguments and getting a JSON result back. It defines four message shapes and a set of reserved error codes, and nothing else. Both of Connect's agent endpoints — `/mcp` and `/a2a` — speak it.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/mcp/",
        "https://connectbyjbrh.com/docs/protocols/a2a/",
        "https://connectbyjbrh.com/developers/mcp-errors/",
        "https://connectbyjbrh.com/developers/api-errors/",
        "https://connectbyjbrh.com/docs/protocols/streamable-http/"
      ]
    },
    {
      "id": "T0136",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/llms-txt/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/llms-txt/index.md",
      "title": "llms.txt",
      "description": "llms.txt is a community proposal, not a standard, and Google has said no Search system reads it. What it is for, and why this site publishes one anyway.",
      "summary": "llms.txt is a proposed convention: a Markdown file at the root of a site listing its most useful pages, so a language model given the site has a map instead of a crawl. It is a **community proposal, not a standard**, and Google has said no Search system reads it. This site publishes one as a supplemental map.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/rfc-9309/",
        "https://connectbyjbrh.com/developers/llms-txt-here/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/markdown-mirrors/",
        "https://connectbyjbrh.com/research/measuring-ai-visibility/",
        "https://connectbyjbrh.com/docs/protocols/well-known-uris/"
      ]
    },
    {
      "id": "T0125",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/mcp-resources/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/mcp-resources/index.md",
      "title": "MCP resources",
      "description": "MCP resources and prompts: what each is for, when a resource is the better answer than a tool, and the four resources Connect publishes.",
      "summary": "A resource is a document a client can read by URI; a prompt is a reusable instruction template a person can invoke by name. Neither is a function call. Connect publishes four resources — its llms.txt, documentation manifest, capability status and A2A agent card — and two prompts.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/mcp/",
        "https://connectbyjbrh.com/docs/protocols/mcp-tools/",
        "https://connectbyjbrh.com/docs/protocols/llms-txt/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/status-manifest/"
      ]
    },
    {
      "id": "T0126",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/mcp-security/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/mcp-security/index.md",
      "title": "MCP security",
      "description": "Origin validation, authentication, scoping and blast radius for an MCP server — and the one tool nobody should build, whatever the request sounds like.",
      "summary": "An MCP server's security comes down to four questions: who may reach it, who the caller is, what the caller's tools can touch, and what a malicious tool description or result can talk the model into. The specification requires origin validation and authentication for anything non-public; the rest is the server author's design.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/mcp/",
        "https://connectbyjbrh.com/docs/protocols/mcp-tools/",
        "https://connectbyjbrh.com/docs/protocols/oauth-for-agents/",
        "https://connectbyjbrh.com/developers/agent-safety/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/"
      ]
    },
    {
      "id": "T0124",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/mcp-tools/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/mcp-tools/index.md",
      "title": "MCP tools",
      "description": "How an MCP tool is defined — name, title, description, input schema and annotations — and why a client must treat every one of those fields as untrusted.",
      "summary": "An MCP tool is a named function a model may call: a JSON Schema for its arguments, a description the model reads to decide whether to call it, and optional annotations hinting at its behaviour. Connect publishes ten, all read-only, all over the generated documentation corpus.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/mcp/",
        "https://connectbyjbrh.com/docs/protocols/mcp-resources/",
        "https://connectbyjbrh.com/docs/protocols/mcp-security/",
        "https://connectbyjbrh.com/developers/mcp-public-tools/",
        "https://connectbyjbrh.com/developers/mcp-errors/"
      ]
    },
    {
      "id": "T0123",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/mcp-transports/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/mcp-transports/index.md",
      "title": "MCP transports",
      "description": "The two MCP transports — stdio for a local process and Streamable HTTP for a remote server — and what revision 2026-07-28 took out of the HTTP one.",
      "summary": "MCP defines two transports. **stdio** runs the server as a child process and speaks newline-delimited JSON over its standard input and output. **Streamable HTTP** runs the server somewhere else and speaks JSON-RPC over a single POST endpoint. Connect is remote, so it offers Streamable HTTP only, at `/mcp`.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/mcp/",
        "https://connectbyjbrh.com/docs/protocols/streamable-http/",
        "https://connectbyjbrh.com/docs/protocols/mcp-security/",
        "https://connectbyjbrh.com/developers/mcp-client-generic/",
        "https://connectbyjbrh.com/docs/protocols/json-rpc/"
      ]
    },
    {
      "id": "T0122",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/mcp/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/mcp/index.md",
      "title": "Model Context Protocol",
      "description": "What the Model Context Protocol is, what revision 2026-07-28 changed, and exactly which tools Connect exposes over it at POST /mcp.",
      "summary": "The Model Context Protocol is a JSON-RPC contract that lets a model client call tools, read resources and fetch prompts from a server it did not have to be built against. Connect implements revision 2026-07-28 at `POST /mcp` over Streamable HTTP, with ten public documentation tools that need no credential and touch no workspace data.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/mcp-transports/",
        "https://connectbyjbrh.com/docs/protocols/mcp-tools/",
        "https://connectbyjbrh.com/docs/protocols/mcp-security/",
        "https://connectbyjbrh.com/docs/protocols/streamable-http/",
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/docs/protocols/a2a/"
      ]
    },
    {
      "id": "T0134",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/oauth-for-agents/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/oauth-for-agents/index.md",
      "title": "OAuth for agents",
      "description": "Delegated access when the client is a program rather than a person: what OAuth gives you, what it does not, and how Connect handles machine callers instead.",
      "summary": "OAuth lets a person grant a program limited access to their account without handing over a password, and the grant can be scoped and revoked. Applied to an autonomous agent it raises questions OAuth alone does not answer. Connect is an OAuth client to Google and Microsoft; it is not an authorisation server for third-party agents.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/mcp-security/",
        "https://connectbyjbrh.com/developers/api-authentication/",
        "https://connectbyjbrh.com/developers/integration-keys/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/authority-separation/"
      ]
    },
    {
      "id": "T0131",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/openapi/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/openapi/index.md",
      "title": "OpenAPI",
      "description": "OpenAPI as a description format, why Connect publishes 3.1.0 rather than the newer revision, and the difference between a public contract and an internal route map.",
      "summary": "OpenAPI describes an HTTP API in a machine-readable document: paths, methods, parameters, schemas, responses and security. Connect publishes one at `/developers/openapi.yaml`, written to **3.1.0**, covering the public documentation API only. The application's own generated document stays closed.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/arazzo/",
        "https://connectbyjbrh.com/docs/protocols/asyncapi/",
        "https://connectbyjbrh.com/developers/openapi-description/",
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/developers/api-versioning/"
      ]
    },
    {
      "id": "T0138",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/rfc-9309/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/rfc-9309/index.md",
      "title": "RFC 9309 — the Robots Exclusion Protocol",
      "description": "What RFC 9309 actually standardises about robots.txt — matching rules, status-code handling, size limits — and the parts people quote that are not in it.",
      "summary": "RFC 9309 standardised the Robots Exclusion Protocol that had been a de facto convention since 1994. It defines `user-agent`, `allow` and `disallow` groups, how a crawler picks the matching rule, and what to do when the file cannot be fetched. It is a crawl preference, never access control.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/llms-txt/",
        "https://connectbyjbrh.com/developers/crawler-policy/",
        "https://connectbyjbrh.com/developers/bot-verification/",
        "https://connectbyjbrh.com/docs/protocols/well-known-uris/",
        "https://connectbyjbrh.com/research/measuring-ai-visibility/"
      ]
    },
    {
      "id": "T0139",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/schema-org/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/schema-org/index.md",
      "title": "Schema.org",
      "description": "The Schema.org vocabulary in JSON-LD: the types this documentation actually emits, the ones deliberately refused, and the rule that structured data must match the page.",
      "summary": "Schema.org is a shared vocabulary for describing what a page is about, normally embedded as JSON-LD. Every page in this manual carries a graph with `TechArticle`, `BreadcrumbList` and, where the page has questions, `FAQPage` — and the build refuses `Product`, `Offer`, `Review` and their relatives.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/llms-txt/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/research/writing-for-people-and-machines/",
        "https://connectbyjbrh.com/docs/protocols/rfc-9309/",
        "https://connectbyjbrh.com/research/measuring-ai-visibility/"
      ]
    },
    {
      "id": "T0135",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/streamable-http/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/streamable-http/index.md",
      "title": "Streamable HTTP",
      "description": "The Streamable HTTP transport in detail: one POST endpoint, the three MCP headers, when a response streams, and how a call is cancelled without a session.",
      "summary": "Streamable HTTP is MCP's remote transport: a single endpoint that accepts POST, carries one JSON-RPC message per request, and may answer either with a JSON body or with an event stream on that same response. Since revision 2026-07-28 there is no session and no separate GET stream.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/mcp-transports/",
        "https://connectbyjbrh.com/docs/protocols/mcp/",
        "https://connectbyjbrh.com/docs/protocols/json-rpc/",
        "https://connectbyjbrh.com/developers/mcp-client-generic/",
        "https://connectbyjbrh.com/developers/errors-and-retries/"
      ]
    },
    {
      "id": "T0137",
      "kind": "protocol",
      "url": "https://connectbyjbrh.com/docs/protocols/well-known-uris/",
      "markdown": "https://connectbyjbrh.com/docs/protocols/well-known-uris/index.md",
      "title": "Well-known URIs",
      "description": "RFC 8615 and the /.well-known/ prefix: why fixed paths need a registry, what lives there on this site, and what does not belong there.",
      "summary": "RFC 8615 reserves the path prefix `/.well-known/` so that a protocol can define a fixed location on any site without colliding with the site's own URLs. Names are recorded in an IANA registry. On this site the prefix serves the A2A agent card, its legacy alias, and a description of the MCP endpoint.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/agent-card/",
        "https://connectbyjbrh.com/docs/protocols/a2a-discovery/",
        "https://connectbyjbrh.com/docs/protocols/rfc-9309/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/docs/protocols/mcp/"
      ]
    },
    {
      "id": "C0132",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/relationships/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/index.md",
      "title": "Relationships in Connect",
      "description": "The section map: Person, Identity and Company, the console that answers one relationship for both audiences, and where every other page here sits.",
      "summary": "Connect keeps one canonical human — a **Person** — and hangs everything else off it: the identities they answer on, the company they belong to, their lifecycle stage, their deals, cases and follow-ups, and one timeline that shows the lot. `relationship_console` answers a question about one relationship for the Owner and for a customer out of the same body of code; only the words on the screen differ.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/people/",
        "https://connectbyjbrh.com/docs/relationships/identities/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/docs/support/cases/"
      ]
    },
    {
      "id": "C0134",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/companies/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/companies/index.md",
      "title": "Companies",
      "description": "The company record, how several people attach to one organisation, what belongs to the company rather than to a human, and when not to create one.",
      "summary": "A Company is the organisation a person belongs to, and several people attach to one. It exists so that facts about the organisation — the account, the terms agreed with it, the deals in its name — are not copied onto each individual and then quietly disagree. `companies.py` owns the record; the people, deals and cases that mention it stay owned by their own services.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/relationships/people/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/relationships/duplicates/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/prospects/"
      ]
    },
    {
      "id": "C0145",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/contact-brief/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/contact-brief/index.md",
      "title": "The contact brief",
      "description": "The short block about a person that a channel is given before it answers: what is in it, the character budgets, and why every line has to earn its place.",
      "summary": "Before Connect answers, it is handed a short block about the person: their name and how they prefer to be addressed, their company and city, their stage, their language, a few facts, the tail of the notes on file, and up to three standing instructions. It is budgeted at around 600 characters, because on a live call every extra character is time the caller spends waiting.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/person-memory/",
        "https://connectbyjbrh.com/docs/relationships/relationship-story/",
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-person-matched/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "C0136",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/cross-channel-identity/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/cross-channel-identity/index.md",
      "title": "One person across phone, email and WhatsApp",
      "description": "How the same human is recognised when they arrive on a second channel, what counts as evidence, and why a likeness is a proposal rather than a match.",
      "summary": "Recognition across channels happens in one of two ways, and they are not equally certain. If the arriving address is already an identity on a person, `by_handle` resolves it exactly and the conversation continues. If it is not, Connect creates a person for it and may later *propose* that two records are the same human — a proposal a person accepts, never an automatic join.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/identities/",
        "https://connectbyjbrh.com/docs/relationships/duplicates/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/workflows/cross-channel-continuity/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-person-matched/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "C0137",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/customer-360/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/customer-360/index.md",
      "title": "Customer 360",
      "description": "One person's whole history in a single view: what is assembled into it, which service each part comes from, and what it deliberately leaves out.",
      "summary": "Customer 360 is one person's history across every channel, assembled on demand from the services that own each part rather than stored as a document. It is what `relationship_console.detail` answers for a screen and what the Assistant's `customer_360` tool answers for a question — the same assembly, two consumers, so the two cannot drift apart.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/relationships/person-memory/",
        "https://connectbyjbrh.com/docs/relationships/duplicates/",
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/workflows/customer-360-assembly/"
      ]
    },
    {
      "id": "C0139",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/duplicates/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/duplicates/index.md",
      "title": "Duplicate detection",
      "description": "How two records come to describe one human, what a duplicate proposal is and is not, and why nothing is ever joined without a person saying so.",
      "summary": "`duplicates` proposes pairs of records that look like the same human and stops there. It is a suggestion queue, not a background job that tidies your data: `merge_people` runs only when a person accepts, because folding two histories into one is a decision with consequences no confidence score should be trusted to make on its own.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/relationships/merge-safety/",
        "https://connectbyjbrh.com/docs/relationships/cross-channel-identity/",
        "https://connectbyjbrh.com/docs/troubleshooting/duplicate-not-detected/",
        "https://connectbyjbrh.com/docs/workflows/duplicate-merge/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "C0135",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/identities/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/identities/index.md",
      "title": "Identities",
      "description": "One address on one channel is its own row: how identities attach to a person, how they are keyed, and what happens when one is attached to the wrong human.",
      "summary": "An Identity is one address on one channel — an email address, a phone number, a WhatsApp handle — held as its own row and keyed by `value_key(kind, value)`. It resolves to exactly one Person, and a person may hold as many as they like. Identities are what make an arriving message find the right human instead of creating a new one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/relationships/people/",
        "https://connectbyjbrh.com/docs/relationships/cross-channel-identity/",
        "https://connectbyjbrh.com/docs/relationships/merge-safety/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-person-matched/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "C0142",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/index.md",
      "title": "Lifecycle stages",
      "description": "The six stages a relationship moves through, what may move it, why becoming a client needs a person, and where the history of every move is kept.",
      "summary": "A relationship sits at one of six points — prospect, qualified, opportunity, client, onboarding, active — plus *not proceeding*, which is the absence of a step rather than a further one. `journey.advance` moves a relationship forward, records who moved it and why, and refuses to make somebody a client on its own because that is a commercial commitment.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/stage-normalisation/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/relationships/people/",
        "https://connectbyjbrh.com/docs/workflows/lifecycle-progression/",
        "https://connectbyjbrh.com/docs/sales/stage-rules/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0141",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/merge-safety/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/merge-safety/index.md",
      "title": "What a merge preserves",
      "description": "The itemised guarantee: identities, stages, follow-ups, deals, demos, cases and onboarding all survive a merge, and what happens when both sides hold one.",
      "summary": "A merge preserves seven kinds of record from each side: identities, lifecycle stages, follow-ups, deals, demos, cases and onboarding. That list is the guarantee — nothing material is dropped to make the surviving record tidier, and where each side holds something, the two are carried rather than one being chosen for you.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/relationships/duplicates/",
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/",
        "https://connectbyjbrh.com/docs/relationships/person-memory/",
        "https://connectbyjbrh.com/docs/support/onboarding/",
        "https://connectbyjbrh.com/docs/follow-ups/duplicates/",
        "https://connectbyjbrh.com/docs/sales/opportunities/"
      ]
    },
    {
      "id": "C0140",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/merging/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/merging/index.md",
      "title": "Merging two records",
      "description": "Merging two records is a human decision: who makes it, what happens at the moment it runs, what changes for every channel, and what cannot be undone.",
      "summary": "`merge_people` folds two records into one and it runs only when a person asks for it. Everything material from both sides survives — identities, stages, follow-ups, deals, demos, cases and onboarding — and afterwards every channel answers one relationship instead of two. There is no clean undo, which is the reason the decision is never automated.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/duplicates/",
        "https://connectbyjbrh.com/docs/relationships/merge-safety/",
        "https://connectbyjbrh.com/docs/relationships/identities/",
        "https://connectbyjbrh.com/docs/workflows/duplicate-merge/",
        "https://connectbyjbrh.com/docs/workflows/identity-merge-decision/",
        "https://connectbyjbrh.com/docs/assistant/"
      ]
    },
    {
      "id": "C0133",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/people/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/people/index.md",
      "title": "People",
      "description": "The person record: what you type, what Connect derives, what attaches from other services, and why blocking somebody is not a field on it.",
      "summary": "A Person is the canonical human, and the record itself is deliberately thin — a name, the company it attaches to, and its lifecycle stage. Nearly everything else on a person's screen is derived: identities come from `people.add_identity`, the history is assembled by `timeline.py`, the written summary is generated, and the deals, cases, follow-ups and onboarding belong to the services that own them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/relationships/identities/",
        "https://connectbyjbrh.com/docs/relationships/companies/",
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/",
        "https://connectbyjbrh.com/docs/relationships/person-memory/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/workflows/first-contact-to-person/"
      ]
    },
    {
      "id": "C0146",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/person-memory/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/person-memory/index.md",
      "title": "What Connect remembers about a person",
      "description": "The contact tier of memory: what Connect knows about one human, how a fact gets there, how it is read into an answer, and how anyone removes it.",
      "summary": "What Connect knows about one human lives at the narrowest of four memory tiers — workspace, channel, endpoint, contact — and the narrowest that applies wins. A fact gets there because somebody told Connect, or because a conversation produced one; it is read into every answer for that person; and anyone with access can read the tier and forget any line in it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/relationships/contact-brief/",
        "https://connectbyjbrh.com/docs/relationships/relationship-story/",
        "https://connectbyjbrh.com/docs/relationships/merge-safety/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/relationships/timeline/"
      ]
    },
    {
      "id": "C0148",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/relationship-owner-tenant/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/relationship-owner-tenant/index.md",
      "title": "Relationships for the Owner and for a customer",
      "description": "The Owner calls them relationships and a customer calls them people: the same records, the same code, and the rewrite that makes one path serve both.",
      "summary": "There is one implementation. `relationship_console` answers a question about a relationship, and two thin routers put it in front of two audiences: the operator API for the Owner, `/api/customer/ui/…` for a customer after `tenantAdapt` rewrites the path. The customer surface renames it — a customer's `people` are the Owner's `relationships` — and nothing else differs.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/docs/support/website-enquiries/"
      ]
    },
    {
      "id": "C0147",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/relationship-search/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/relationship-search/index.md",
      "title": "Finding a person or company",
      "description": "Finding a person or company: what is matched, why counting and paging happen in SQL, and how a per cent sign typed in the box is treated as a character.",
      "summary": "`listing` answers a bounded, searched, paged set of records from the database rather than from a slice held in memory. The count is one aggregate, the filter and the page are SQL, and a `%` or `_` typed into the box is escaped and matched as a character. Results are bounded on purpose — a page you can read beats a list nobody scrolls.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/relationships/duplicates/",
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/"
      ]
    },
    {
      "id": "C0144",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/relationship-story/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/relationship-story/index.md",
      "title": "The relationship summary",
      "description": "The written relationship summary: what it is assembled from, why it is not a stored document, and the name guard that rewrites it on the way out.",
      "summary": "`relationship_console.story` answers one person across every channel and every stage change, newest first: their record, the assembled history, the journey summary, and whatever sales holds for them. It is composed when you ask rather than stored, and the text inside it passes a name guard that removes a form of address standing where a name should be.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/relationships/contact-brief/",
        "https://connectbyjbrh.com/docs/relationships/person-memory/",
        "https://connectbyjbrh.com/docs/sales/opportunities/",
        "https://connectbyjbrh.com/docs/relationships/merging/"
      ]
    },
    {
      "id": "C0143",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/stage-normalisation/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/stage-normalisation/index.md",
      "title": "Normalising a stage",
      "description": "Why one column holds three vocabularies, how an unfamiliar stage word is read, and the message that went unanswered when a lookup raised instead.",
      "summary": "`journey.normalise` turns whatever a stage column says into one of the six, or into `closed`. A word it does not recognise is returned unchanged rather than guessed at, and then ranks as *before everything* — the safe answer, because a stage Connect does not know must never block a real transition. Writes are strict; reads are total.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/",
        "https://connectbyjbrh.com/docs/relationships/people/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/workflows/lifecycle-progression/",
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/research/silent-failure/"
      ]
    },
    {
      "id": "C0138",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/relationships/timeline/",
      "markdown": "https://connectbyjbrh.com/docs/relationships/timeline/index.md",
      "title": "The customer timeline",
      "description": "What appears on a person's timeline, where each entry comes from, the ordering rule, and the query cost that once made this screen expensive.",
      "summary": "The timeline is one person's history in the order it happened, assembled by `timeline.py` from the canonical records — conversations, calls, follow-ups, cases, demos and stage moves. It is a reading of those records rather than a log of its own, so an entry is as accurate as the record behind it and disappears if that record is removed.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/relationships/person-memory/",
        "https://connectbyjbrh.com/docs/troubleshooting/missing-timeline-entry/",
        "https://connectbyjbrh.com/docs/workflows/timeline-assembly/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/research/n-plus-one-that-grows/"
      ]
    },
    {
      "id": "C0149",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/sales/",
      "markdown": "https://connectbyjbrh.com/docs/sales/index.md",
      "title": "Sales in Connect",
      "description": "Opportunities, the pipeline and demos — and the line between a question Connect can answer from Knowledge and a commercial decision it must escalate.",
      "summary": "Connect keeps a pipeline of opportunities against real people and companies, moves them under stage rules, schedules the follow-ups a deal needs and records what closed and why. What it does not do is invent commercial terms: a price, an SLA or a warranty that Knowledge does not support is refused and put in front of a person.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/opportunities/",
        "https://connectbyjbrh.com/docs/sales/pipeline/",
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/workflows/create-opportunity/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/follow-ups/"
      ]
    },
    {
      "id": "C0155",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sales/commercial-escalation/",
      "markdown": "https://connectbyjbrh.com/docs/sales/commercial-escalation/index.md",
      "title": "Escalating a commercial decision",
      "description": "What a refused commercial question looks like in Needs You, what the person deciding actually sees, and what happens to the customer afterwards.",
      "summary": "The question, the deal and the customer's own words arrive together in Needs You, ranked against everything else waiting. A person answers it once. Their answer becomes the reply, is recorded against the deal, and — if it should hold in future — becomes Knowledge, which is the only step that stops the same question escalating again.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/workflows/commercial-decision/",
        "https://connectbyjbrh.com/docs/workflows/commercial-question/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/sales/stage-rules/"
      ]
    },
    {
      "id": "C0157",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sales/deal-relationships/",
      "markdown": "https://connectbyjbrh.com/docs/sales/deal-relationships/index.md",
      "title": "How a deal connects to people and companies",
      "description": "The links between an opportunity, its person and its organisation — what each one is for, and exactly what a merge does to them.",
      "summary": "An opportunity hangs off the relationship it was opened from: a Person, and through them the Company they are attached to. Those links are what give a deal its context and what make it survive a merge — deals are preserved from both sides when two records become one, along with identities, stages, follow-ups, demos, cases and onboarding.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/opportunities/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/relationships/merge-safety/",
        "https://connectbyjbrh.com/docs/relationships/companies/",
        "https://connectbyjbrh.com/docs/sales/won-and-lost/",
        "https://connectbyjbrh.com/docs/troubleshooting/company-not-linked/"
      ]
    },
    {
      "id": "C0153",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sales/next-best-action/",
      "markdown": "https://connectbyjbrh.com/docs/sales/next-best-action/index.md",
      "title": "The next best action on a deal",
      "description": "How Connect picks the next thing to do on a deal, the records that evidence it, and what to change when the suggestion is wrong.",
      "summary": "A next best action is a suggestion derived from records you can inspect: the stage, what is already promised, when the person was last spoken to, and what they asked for. It is not a prediction and it is not an act — anything it proposes still passes through the autonomy rules of whichever channel would carry it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/docs/sales/stage-rules/",
        "https://connectbyjbrh.com/docs/sales/sales-follow-ups/",
        "https://connectbyjbrh.com/research/evidence-for-next-action/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0150",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sales/opportunities/",
      "markdown": "https://connectbyjbrh.com/docs/sales/opportunities/index.md",
      "title": "Opportunities: the deal record",
      "description": "What an opportunity holds — value in minor units, stage, the people it belongs to, the review flag — and what each field is actually used for.",
      "summary": "An opportunity is one commercial deal, attached to the person and company it belongs to, carrying a value in minor units with its currency, a stage, and a flag saying whether it needs a person's attention. It is opened, valued, updated, moved and closed through `sales.py`, and every one of those verbs leaves an audit entry.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/docs/sales/pipeline/",
        "https://connectbyjbrh.com/docs/sales/stage-rules/",
        "https://connectbyjbrh.com/docs/sales/deal-relationships/",
        "https://connectbyjbrh.com/docs/workflows/create-opportunity/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "C0151",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sales/pipeline/",
      "markdown": "https://connectbyjbrh.com/docs/sales/pipeline/index.md",
      "title": "The pipeline board",
      "description": "What the board shows, what dragging a card actually calls, and why a total on a board must be counted in the database rather than in the page.",
      "summary": "`#/pipeline` is a column per stage and a card per opportunity, reading the same records as the deals sheet and the relationship view. Moving a card is not a display change: it calls `move`, the stage rules are consulted, and the move either happens and is audited, or is declined with a reason.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/docs/sales/opportunities/",
        "https://connectbyjbrh.com/docs/sales/stage-rules/",
        "https://connectbyjbrh.com/docs/workflows/move-opportunity/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/",
        "https://connectbyjbrh.com/docs/sales/sales-owner-tenant/"
      ]
    },
    {
      "id": "C0156",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sales/quotes-and-documents/",
      "markdown": "https://connectbyjbrh.com/docs/sales/quotes-and-documents/index.md",
      "title": "Quotes and sales documents",
      "description": "A quote in Connect is a file, not a special object: what can be assembled, which terms it may contain, and where its versions and provenance live.",
      "summary": "Connect can create and modify documents as new versions, with provenance and an audit entry on each, through one file service both audiences share. What it cannot do is originate the commercial terms inside them: a quote assembles figures that already exist in Knowledge or that a person has decided. There is no separate quote record — a quote is a file attached to the work.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/sales/opportunities/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/research/files-through-one-service/",
        "https://connectbyjbrh.com/docs/sales/commercial-escalation/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "C0154",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sales/safe-sales/",
      "markdown": "https://connectbyjbrh.com/docs/sales/safe-sales/index.md",
      "title": "Price, SLA and warranty: what Connect may say",
      "description": "Connect does not invent commercial terms. What counts as grounded, what is refused and escalated instead, and how a breach is caught on a live call.",
      "summary": "A price, an SLA or a warranty that Knowledge does not support is refused and escalated to a person, not improvised. That refusal is the correct outcome rather than a missing feature: an agent that guesses a figure has committed your business to it. What Connect may say is what your own sources already say, quoted rather than inferred.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/commercial-escalation/",
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/workflows/commercial-question/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/",
        "https://connectbyjbrh.com/docs/troubleshooting/connect-refused-to-quote/"
      ]
    },
    {
      "id": "C0158",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sales/sales-follow-ups/",
      "markdown": "https://connectbyjbrh.com/docs/sales/sales-follow-ups/index.md",
      "title": "Follow-ups on a deal",
      "description": "What raises a chase on an opportunity, how the channel is chosen, and the duplicate rule that stops one customer being pursued twice for the same thing.",
      "summary": "A deal creates dated commitments, and each carries a reason — a commitment without one is useless to whoever inherits it. The channel is part of the record, `task` means a person does it and no drain ever sends it, and two commitments with the same timing for the same person are treated as one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/follow-ups/channel-choice/",
        "https://connectbyjbrh.com/docs/follow-ups/duplicates/",
        "https://connectbyjbrh.com/docs/sales/won-and-lost/",
        "https://connectbyjbrh.com/docs/sales/next-best-action/",
        "https://connectbyjbrh.com/docs/troubleshooting/too-many-follow-ups/"
      ]
    },
    {
      "id": "C0160",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sales/sales-owner-tenant/",
      "markdown": "https://connectbyjbrh.com/docs/sales/sales-owner-tenant/index.md",
      "title": "Sales for the Owner and for a customer",
      "description": "The pipeline is one implementation serving both audiences. What a plan bounds, and why two commercial screens are correctly operator-only.",
      "summary": "There is no operator edition of the pipeline. The same `sales.py` serves the Owner's workspace and every customer workspace, over the same stage rules and the same refusal to invent terms. A plan bounds how much a workspace may do, never which screens exist. Two commercial surfaces are operator-only because they are about running the platform.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/docs/sales/pipeline/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/account/"
      ]
    },
    {
      "id": "C0152",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sales/stage-rules/",
      "markdown": "https://connectbyjbrh.com/docs/sales/stage-rules/index.md",
      "title": "Stage rules and refusals",
      "description": "Why a deal will not move: the four shapes a stage restriction takes, what a refusal tells you, and why declining is a correct answer.",
      "summary": "`move` consults the stage rules before it writes anything, and it can decline. A refusal names what the target stage needs and the deal does not have — usually a value, a person, a completed step, or a commercial term nobody has agreed. Nothing is broken when this happens; the rule has just described the next piece of work.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/pipeline/",
        "https://connectbyjbrh.com/docs/sales/opportunities/",
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/sales/commercial-escalation/",
        "https://connectbyjbrh.com/docs/workflows/move-opportunity/",
        "https://connectbyjbrh.com/docs/troubleshooting/stage-move-refused/"
      ]
    },
    {
      "id": "C0159",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sales/won-and-lost/",
      "markdown": "https://connectbyjbrh.com/docs/sales/won-and-lost/index.md",
      "title": "Closing a deal: won and lost",
      "description": "What each closing outcome records, what it starts or stops downstream, and what to do with the commitments the deal made before it closed.",
      "summary": "Closing writes a terminal outcome on the opportunity with the reason behind it. Won hands the relationship forward to onboarding and post-sale work; lost keeps the record and the reason rather than deleting anything. Neither outcome tidies the commitments the deal made — the follow-up queue is a separate record and has to be walked.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/pipeline/",
        "https://connectbyjbrh.com/docs/sales/sales-follow-ups/",
        "https://connectbyjbrh.com/docs/workflows/won-deal-handover/",
        "https://connectbyjbrh.com/docs/support/onboarding/",
        "https://connectbyjbrh.com/docs/support/post-sale/",
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/"
      ]
    },
    {
      "id": "C0314",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/security/",
      "markdown": "https://connectbyjbrh.com/docs/security/index.md",
      "title": "Security and isolation",
      "description": "How one workspace is kept from another, what is recorded and reviewable, and what this section deliberately does not publish.",
      "summary": "Connect runs one application over many workspaces, so the boundary between them is the thing that matters most. It is enforced three separate times — at the edge, in the object layer, and inside the database — because any one of them can be undone by a single careless line, and three independent mechanisms do not fail to the same mistake.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/security/multi-tenancy/",
        "https://connectbyjbrh.com/docs/security/rls/",
        "https://connectbyjbrh.com/docs/security/customer-facade/",
        "https://connectbyjbrh.com/docs/security/credential-sealing/",
        "https://connectbyjbrh.com/docs/product/privacy-in-the-product/"
      ]
    },
    {
      "id": "C0324",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/security/audit-access/",
      "markdown": "https://connectbyjbrh.com/docs/security/audit-access/index.md",
      "title": "Who can read the audit trail",
      "description": "Who can read the record of what Connect decided and did: the two doors onto one trail, what each shows, and what the trail deliberately does not hold.",
      "summary": "There is one audit trail and two doors onto it — the operator's own screens and the customer facade — and both read the same service. Each door answers inside the workspace of the session that opened it, because an audit entry is a scoped record like any other. Anyone who can sign in to a workspace can read that workspace's decisions; nobody reads another workspace's through either door.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/autonomy/audit-retention/",
        "https://connectbyjbrh.com/docs/security/data-retention/",
        "https://connectbyjbrh.com/docs/security/authorization/",
        "https://connectbyjbrh.com/docs/workflows/incident-response/"
      ]
    },
    {
      "id": "C0319",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/security/authorization/",
      "markdown": "https://connectbyjbrh.com/docs/security/authorization/index.md",
      "title": "Authorisation",
      "description": "Five different questions get called permission. The order they are asked in, which one produced your refusal, and how each one is worded.",
      "summary": "Five separate questions stand between a click and an action: who you are, whether your session may call this at all, which workspace answers, whether your role permits it, and whether the workspace is entitled to spend on it. A sixth — whether Connect may act without asking — is autonomy rather than permission. Each refuses in its own words, which is how you tell them apart.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/security/customer-facade/",
        "https://connectbyjbrh.com/docs/security/rls/",
        "https://connectbyjbrh.com/docs/autonomy/permissions/",
        "https://connectbyjbrh.com/docs/autonomy/explicit-gates/",
        "https://connectbyjbrh.com/docs/troubleshooting/permission-denied/"
      ]
    },
    {
      "id": "C0320",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/security/credential-sealing/",
      "markdown": "https://connectbyjbrh.com/docs/security/credential-sealing/index.md",
      "title": "How provider credentials are stored",
      "description": "Provider credentials are sealed as they are saved and never shown again. What a screen displays instead, and why the database password lives in no file.",
      "summary": "Anything secret is sealed at the moment it is saved, whichever screen it came in by, and it is never returned to a screen afterwards. What you see is a mask. Sending that mask back means *keep what is stored*, so a form cannot overwrite a working credential with the asterisks it was shown. Losing one means entering it again, not recovering it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/security/mailbox-ownership/",
        "https://connectbyjbrh.com/docs/security/authorization/",
        "https://connectbyjbrh.com/docs/account/security-settings/",
        "https://connectbyjbrh.com/docs/workflows/credential-rotation/",
        "https://connectbyjbrh.com/research/stale-credentials/"
      ]
    },
    {
      "id": "C0318",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/security/customer-facade/",
      "markdown": "https://connectbyjbrh.com/docs/security/customer-facade/index.md",
      "title": "The customer facade",
      "description": "A customer session is served through a closed surface: what is not explicitly permitted is refused, and the refusal says so in plain words.",
      "summary": "A customer session reaches the application through a surface that is closed by default. In the browser, an operator path is rewritten to its customer equivalent, and anything unrecognised is turned into a blocked one on purpose. On the server, an allowlist decides what a customer session may call at all — and anything not on it is refused, whatever the browser did.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/security/authorization/",
        "https://connectbyjbrh.com/docs/account/owner-vs-tenant/",
        "https://connectbyjbrh.com/docs/troubleshooting/403-on-a-screen/",
        "https://connectbyjbrh.com/research/closed-by-default-facade/"
      ]
    },
    {
      "id": "C0326",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/security/data-retention/",
      "markdown": "https://connectbyjbrh.com/docs/security/data-retention/index.md",
      "title": "What is kept and for how long",
      "description": "How long each class of record survives in Connect, what deleting something actually does, and the two classes that are deliberately kept longest.",
      "summary": "Retention is decided per class of record rather than by one clock over the whole workspace. Working records live as long as the workspace does unless somebody removes them; the accountability trail and compliance entries are kept deliberately longer, because both exist to answer questions after the fact. Where a specific period applies, it is stated on that record's own page.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/audit-retention/",
        "https://connectbyjbrh.com/docs/security/audit-access/",
        "https://connectbyjbrh.com/docs/workflows/workspace-deletion/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/email/suppression-list/"
      ]
    },
    {
      "id": "C0322",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/security/mailbox-ownership/",
      "markdown": "https://connectbyjbrh.com/docs/security/mailbox-ownership/index.md",
      "title": "Proving a mailbox belongs to a workspace",
      "description": "The scoped lookup that replaced a bare fetch on four mailbox routes, what it prevents, and the single webhook still allowed to resolve differently.",
      "summary": "Every route that takes a mailbox identifier from a browser resolves it through one workspace-scoped lookup rather than reading the row directly. Before that change four of them — the connection form, sync, and the start and disconnect of a Google connection — would answer for any workspace's mailbox. One provider webhook is a deliberate exception, because it has to find its mailbox before any workspace is known.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/number-ownership/",
        "https://connectbyjbrh.com/docs/security/webhook-verification/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/troubleshooting/data-not-visible/",
        "https://connectbyjbrh.com/docs/email/mailboxes/"
      ]
    },
    {
      "id": "C0316",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/security/multi-tenancy/",
      "markdown": "https://connectbyjbrh.com/docs/security/multi-tenancy/index.md",
      "title": "Multi-tenancy in Connect",
      "description": "One application serves every business. What is genuinely common, what belongs to exactly one workspace, and where the data model draws that line.",
      "summary": "Everything is shared except the data. One codebase, one engine, one set of screens and one deployment serve every business; business records belong to exactly one workspace and are filtered on every read. A small, named set of records sits outside all workspaces by design — identity, sessions, billing, platform audit — because they are about running the service rather than about any one customer.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/security/rls/",
        "https://connectbyjbrh.com/docs/account/owner-vs-tenant/",
        "https://connectbyjbrh.com/docs/product/the-record-model/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/"
      ]
    },
    {
      "id": "C0321",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/security/number-ownership/",
      "markdown": "https://connectbyjbrh.com/docs/security/number-ownership/index.md",
      "title": "Proving a phone number belongs to a workspace",
      "description": "How Connect proves a phone line really belongs to the workspace being served, and the class of defect that check exists to prevent.",
      "summary": "A phone number is not evidence of anything on its own. Before Connect treats a line as a workspace's own, the number is resolved to a record inside that workspace, and a request that cannot produce one is refused rather than served from the nearest match. On an inbound call the workspace comes from the line that was dialled; the caller's number is only ever data about the call.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/mailbox-ownership/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/security/webhook-verification/",
        "https://connectbyjbrh.com/docs/phone/business-number/",
        "https://connectbyjbrh.com/docs/troubleshooting/data-not-visible/"
      ]
    },
    {
      "id": "C0325",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/security/public-vs-private/",
      "markdown": "https://connectbyjbrh.com/docs/security/public-vs-private/index.md",
      "title": "Public and authenticated surfaces",
      "description": "Which Connect surfaces answer without a session, which require one, and which are deliberately closed — with the rule that decides where a new surface belongs.",
      "summary": "A surface is public only when its answer is the same for everybody: the site, this documentation, the machine-readable descriptions, the agent card and the health endpoint. Everything whose answer depends on a workspace needs a session or an integration key. A third group is closed on purpose — the application's own generated API description among them — and stays closed.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/developers/mcp-authentication/",
        "https://connectbyjbrh.com/developers/crawler-policy/",
        "https://connectbyjbrh.com/docs/security/webhook-verification/",
        "https://connectbyjbrh.com/docs/account/google-sign-in/"
      ]
    },
    {
      "id": "C0317",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/security/rls/",
      "markdown": "https://connectbyjbrh.com/docs/security/rls/index.md",
      "title": "Row-level security",
      "description": "The database applies its own workspace filter beneath the application. What that catches which application code structurally cannot, and what it refuses to write.",
      "summary": "Row-level security is PostgreSQL filtering rows by workspace on its own account, underneath everything the application does. The active workspace is published to the database on each request, so a query that never went through the object layer is confined anyway. It is the only layer that protects paths nobody remembered to protect, which is exactly why it is there.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/security/multi-tenancy/",
        "https://connectbyjbrh.com/docs/technology/row-level-security/",
        "https://connectbyjbrh.com/docs/security/authorization/",
        "https://connectbyjbrh.com/research/workspace-stamp/"
      ]
    },
    {
      "id": "C0323",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/security/webhook-verification/",
      "markdown": "https://connectbyjbrh.com/docs/security/webhook-verification/index.md",
      "title": "Verifying an inbound webhook",
      "description": "What an inbound provider callback has to prove before Connect acts on it: origin, freshness, single use and a known route, plus one named exception.",
      "summary": "An inbound webhook arrives with no session, so it has to prove itself four ways before anything happens: that it came from the provider it claims, that it is recent, that this exact delivery has not already been handled, and that it maps to something Connect serves. A delivery that fails any of the four is refused whole. Nothing partial is written, and the provider is free to retry.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/mailbox-ownership/",
        "https://connectbyjbrh.com/docs/troubleshooting/webhook-rejected/",
        "https://connectbyjbrh.com/developers/webhook-signatures/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
        "https://connectbyjbrh.com/docs/security/public-vs-private/"
      ]
    },
    {
      "id": "C0315",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/security/workspace-isolation/",
      "markdown": "https://connectbyjbrh.com/docs/security/workspace-isolation/index.md",
      "title": "Workspace isolation",
      "description": "The boundary between two businesses is enforced three separate times. What each layer catches, and why one careful layer was not judged enough.",
      "summary": "A request is filtered three times before it can see a record: at the edge, where a customer session is served a closed surface; in the object layer, where every read is scoped and every write is stamped automatically; and in the database, which applies its own filter underneath both. The reason for three is blunt — each one can be undone by a single line of code, and it is a different line each time.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/security/multi-tenancy/",
        "https://connectbyjbrh.com/docs/security/rls/",
        "https://connectbyjbrh.com/docs/security/customer-facade/",
        "https://connectbyjbrh.com/docs/workflows/isolation-verification/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/"
      ]
    },
    {
      "id": "C0195",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/sms/",
      "markdown": "https://connectbyjbrh.com/docs/sms/index.md",
      "title": "SMS in Connect",
      "description": "SMS in Connect is a foundation: inbound, dedupe, STOP and suppression work; outbound depends entirely on the provider, and the live carrier carries no SMS.",
      "summary": "SMS is a **foundation** channel, not an available one. Receiving works: inbound messages are deduplicated, attached to a person, and **STOP** and suppression are honoured. Sending depends entirely on the configured provider, and the carrier on the live account carries no SMS at all — the Phone screen says so rather than presenting a thread that cannot send.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/inbound-sms/",
        "https://connectbyjbrh.com/docs/sms/stop/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
        "https://connectbyjbrh.com/docs/sms/dlt/",
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/status-vocabulary/"
      ]
    },
    {
      "id": "C0201",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sms/dlt/",
      "markdown": "https://connectbyjbrh.com/docs/sms/dlt/index.md",
      "title": "DLT registration in India",
      "description": "What DLT registration means for a business sending commercial SMS in India, the three registrations involved, and why it is a process with the operators, not a setting.",
      "summary": "In India, commercial SMS may only be sent by a registered sender using a registered header and a registered template. Those three registrations are made with the telecom operators, not inside Connect. Connect holds the registration data you have been granted so that messages can be composed against it; it cannot grant, accelerate or stand in for the registration itself, and it cannot send SMS on the live carrier in any case.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/dlt-registration/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
        "https://connectbyjbrh.com/docs/troubleshooting/sms-not-sending/",
        "https://connectbyjbrh.com/docs/sms/stop/",
        "https://connectbyjbrh.com/docs/workflows/channel-configuration/"
      ]
    },
    {
      "id": "C0196",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sms/inbound-sms/",
      "markdown": "https://connectbyjbrh.com/docs/sms/inbound-sms/index.md",
      "title": "Receiving SMS",
      "description": "How a text message reaches Connect: the provider webhook, the workspace it resolves to, the record it becomes, and what receiving alone does not give you.",
      "summary": "An inbound SMS arrives as a webhook from whichever provider carries the number, resolves to exactly one workspace, is deduplicated, attached to a person and written as an ordinary message the agent loop reads. That half of the channel works. The other half does not: sending depends entirely on the configured provider, and the carrier on the live account carries no SMS at all, which is why SMS is a **foundation** channel.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/sms/sms-dedupe/",
        "https://connectbyjbrh.com/docs/sms/sms-relationship/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
        "https://connectbyjbrh.com/docs/workflows/sms-inbound/",
        "https://connectbyjbrh.com/docs/whatsapp/inbound-webhook/"
      ]
    },
    {
      "id": "C0197",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sms/sms-dedupe/",
      "markdown": "https://connectbyjbrh.com/docs/sms/sms-dedupe/index.md",
      "title": "Duplicate SMS",
      "description": "Why the same text message can arrive at Connect more than once, what key stops a second copy becoming a second conversation, and the one case it cannot cover.",
      "summary": "Providers retry. A webhook that times out, or that Connect acknowledged too slowly, is sent again, sometimes several times. Connect keys each inbound SMS on the provider's own message identifier, so the second delivery updates the row the first created instead of adding another. The one thing that defeats it is a provider that issues a different identifier for what is genuinely the same message.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/inbound-sms/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/troubleshooting/sms-duplicate-reply/",
        "https://connectbyjbrh.com/docs/workflows/sms-inbound/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/"
      ]
    },
    {
      "id": "C0202",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
      "markdown": "https://connectbyjbrh.com/docs/sms/sms-outbound-status/index.md",
      "title": "Sending SMS: what is available today",
      "description": "The honest state of outbound SMS: what the provider decides, why the carrier on the live account carries none, and what the Phone screen shows instead of a thread.",
      "summary": "Connect does not send SMS on the live carrier, because that carrier carries no SMS traffic. Outbound text depends entirely on the configured provider, and in India additionally on DLT registration. Rather than presenting a thread you could type into and a message that would never leave, the Phone screen reports the channel's readiness and says which condition is unmet.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/sms/dlt/",
        "https://connectbyjbrh.com/docs/troubleshooting/sms-not-sending/",
        "https://connectbyjbrh.com/docs/sms/inbound-sms/",
        "https://connectbyjbrh.com/docs/sms/sms-owner-tenant/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/"
      ]
    },
    {
      "id": "C0203",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sms/sms-owner-tenant/",
      "markdown": "https://connectbyjbrh.com/docs/sms/sms-owner-tenant/index.md",
      "title": "SMS for the Owner and for a customer",
      "description": "Whether SMS behaves differently on the Owner account and in a customer workspace: the same code path, the same provider limit, and the one real difference.",
      "summary": "It behaves the same, because it is the same code. Both audiences reach SMS through one implementation with two doors: the Owner over the operator routes, a customer over the tenant facade that rewrites the path. Inbound handling, deduplication, attachment and **STOP** work for both; outbound works for neither on the live carrier. The only genuine difference is commercial — a customer's use is bounded by their plan.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
        "https://connectbyjbrh.com/docs/whatsapp/whatsapp-owner-tenant/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/workflows/channel-configuration/"
      ]
    },
    {
      "id": "C0198",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sms/sms-relationship/",
      "markdown": "https://connectbyjbrh.com/docs/sms/sms-relationship/index.md",
      "title": "Attaching an SMS to a person",
      "description": "How Connect turns the number that sent a text message into a Person, what it does when the number is unknown, and the near-misses that land a message on the wrong record.",
      "summary": "The sending number is looked up as an identity. A match attaches the message to that Person's history, so a text sits on the same timeline as their email and their calls. No match creates a new contact rather than guessing at the nearest one. Because outbound SMS is not available on the live carrier, this attachment is most of what the channel is for today: it is how a text becomes part of a relationship rather than a stray message.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/inbound-sms/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/workflows/sms-inbound/",
        "https://connectbyjbrh.com/docs/workflows/dnc-across-channels/",
        "https://connectbyjbrh.com/research/one-person-many-channels/"
      ]
    },
    {
      "id": "C0200",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sms/sms-suppression/",
      "markdown": "https://connectbyjbrh.com/docs/sms/sms-suppression/index.md",
      "title": "SMS suppression",
      "description": "How a suppression entry is created on SMS, what it stops, how it differs from a do-not-contact directive, and who is allowed to clear one.",
      "summary": "A suppression is a standing refusal to contact one person, checked at the send boundary before anything is prepared. On SMS it is created by an opt-out word, by a person adding one by hand, or by a wider do-not-contact directive. It stops outbound work rather than inbound: messages still arrive, are still filed and still answerable by a human, and on the live carrier no SMS could have gone out anyway.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/stop/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/workflows/dnc-across-channels/",
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/troubleshooting/sms-not-sending/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0199",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/sms/stop/",
      "markdown": "https://connectbyjbrh.com/docs/sms/stop/index.md",
      "title": "STOP and opt-out",
      "description": "The opt-out words Connect honours in a text message, what is written when one arrives, how far the refusal reaches, and how quickly it takes effect.",
      "summary": "A text message that reads as an opt-out is treated as a directive before it is treated as correspondence. Connect writes a suppression against that person, records the decision in the audit trail, and refuses outbound contact from that moment — not at the end of a batch and not after a review. This half of SMS works today, even though sending on the live carrier does not.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/sms-suppression/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/workflows/sms-stop/",
        "https://connectbyjbrh.com/docs/workflows/dnc-across-channels/",
        "https://connectbyjbrh.com/docs/sms/inbound-sms/",
        "https://connectbyjbrh.com/docs/whatsapp/opt-out/"
      ]
    },
    {
      "id": "C0175",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/support/",
      "markdown": "https://connectbyjbrh.com/docs/support/index.md",
      "title": "Support in Connect",
      "description": "The section map: what a support case is, how onboarding works, why the relationship carries on after the sale, and where website enquiries actually live.",
      "summary": "Support in Connect is not a second system. A case, an onboarding plan and a closed deal hang off the same person record that held the prospect research and the first reply, so the history that answers a question is already attached to the person asking it. This section covers cases, escalation, onboarding, the post-sale relationship, and the enquiries that arrive on JBRH's own website rather than in a workspace.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/cases/",
        "https://connectbyjbrh.com/docs/support/onboarding/",
        "https://connectbyjbrh.com/docs/support/post-sale/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/workflows/support-case/",
        "https://connectbyjbrh.com/docs/sales/won-and-lost/"
      ]
    },
    {
      "id": "C0177",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/support/case-context/",
      "markdown": "https://connectbyjbrh.com/docs/support/case-context/index.md",
      "title": "What a case carries",
      "description": "The history an open case is answered from: what is assembled, the budget it is assembled to, and the things deliberately left out of it.",
      "summary": "A case does not store the history it is answered from — it reads it, at the moment somebody works it. The person, their identities, the company, the lifecycle stage, the timeline, open follow-ups, past deals and earlier cases are assembled to a fixed grounding budget alongside Knowledge and memory. Reading rather than copying is why a case opened in March is answered from what is true in June.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/cases/",
        "https://connectbyjbrh.com/docs/support/resolving/",
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/research/relationship-memory/"
      ]
    },
    {
      "id": "C0179",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/support/case-escalation/",
      "markdown": "https://connectbyjbrh.com/docs/support/case-escalation/index.md",
      "title": "Escalating a case",
      "description": "What makes a case stop and wait for a person, what the person is actually being asked to decide, and what the customer sees while it waits.",
      "summary": "Escalation is Connect declining to decide, not a case being handed upwards. The case stays open and where it was; a specific question goes to Needs You with the customer's words, the answer Connect would have given, and the rule that stopped it. A person answers that question. Refusing to improvise is the intended behaviour, not a shortfall in what Connect can do.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/cases/",
        "https://connectbyjbrh.com/docs/support/resolving/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/sales/commercial-escalation/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/docs/workflows/support-case/"
      ]
    },
    {
      "id": "C0176",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/support/cases/",
      "markdown": "https://connectbyjbrh.com/docs/support/cases/index.md",
      "title": "Support cases",
      "description": "What a support case is in Connect, what opens one, the three verbs it moves through, and how it stays attached to the person it belongs to.",
      "summary": "A support case is a post-sale issue record attached to a Person, not to a thread. It is opened deliberately — by somebody working the relationship, or by the Assistant when asked — then acted on, then resolved. Its value is that it inherits the whole relationship: the deal that preceded it, the identities the customer writes from, and the timeline that shows what has already been said to them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/",
        "https://connectbyjbrh.com/docs/support/case-context/",
        "https://connectbyjbrh.com/docs/support/resolving/",
        "https://connectbyjbrh.com/docs/support/case-escalation/",
        "https://connectbyjbrh.com/docs/workflows/support-case/",
        "https://connectbyjbrh.com/docs/relationships/people/"
      ]
    },
    {
      "id": "C0180",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/support/onboarding/",
      "markdown": "https://connectbyjbrh.com/docs/support/onboarding/index.md",
      "title": "Onboarding a new customer",
      "description": "The onboarding record after a deal is won: what it tracks, what Connect does between the steps, and why the plan is the workspace's rather than a template.",
      "summary": "Onboarding is a record on the same person and company that carried the deal, listing the steps this business puts a new customer through and what has happened against each. Connect does the work between the steps — chasing what is owed, answering from Knowledge, recording what happened, stopping where a person must decide. The steps themselves are the workspace's; no template is imposed.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/",
        "https://connectbyjbrh.com/docs/support/post-sale/",
        "https://connectbyjbrh.com/docs/workflows/onboarding-workflow/",
        "https://connectbyjbrh.com/docs/workflows/won-deal-handover/",
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "C0181",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/support/post-sale/",
      "markdown": "https://connectbyjbrh.com/docs/support/post-sale/index.md",
      "title": "The relationship after the sale",
      "description": "What carries over when a prospect becomes a client: the record, the memory and the commitments that continue, and the four rules that change.",
      "summary": "Almost everything continues. The same Person carries the research, the conversations, the deal and now the cases; the identities, the timeline, the memory and the open commitments all survive the sale untouched. What changes is the lifecycle stage, the deal's place on the pipeline, what Connect is being asked to do next, and how this person is treated by prospecting.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/",
        "https://connectbyjbrh.com/docs/support/onboarding/",
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/sales/won-and-lost/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/"
      ]
    },
    {
      "id": "C0178",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/support/resolving/",
      "markdown": "https://connectbyjbrh.com/docs/support/resolving/index.md",
      "title": "Resolving a case",
      "description": "What closing a case actually records, what it changes on the relationship, and the four things it deliberately leaves exactly as they were.",
      "summary": "Resolving a case writes an outcome, names who decided it and closes the record — and changes almost nothing else. The lifecycle stage stays where it was, open follow-ups stay open, conversations stay where they happened, and the case itself stays attached to the person for good. Closing is a statement about one issue, not a tidy-up of the relationship around it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/cases/",
        "https://connectbyjbrh.com/docs/support/case-context/",
        "https://connectbyjbrh.com/docs/support/case-escalation/",
        "https://connectbyjbrh.com/docs/workflows/support-case/",
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "C0182",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/support/website-enquiries/",
      "markdown": "https://connectbyjbrh.com/docs/support/website-enquiries/index.md",
      "title": "Website enquiries",
      "description": "Enquiries from the public JBRH website are held outside every workspace, on purpose. What that means, who works them, and why customers cannot see them.",
      "summary": "An enquiry submitted on JBRH's own website is a message to JBRH, not to any customer's workspace. It is held in a control-plane table that sits outside every workspace, and the operator works it. A customer looking for one of these in their own Connect and not finding it is watching tenant isolation behave correctly, not hitting a fault.",
      "status": "available_owner",
      "audiences": [
        "owner",
        "customer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/",
        "https://connectbyjbrh.com/docs/troubleshooting/enquiry-not-visible/",
        "https://connectbyjbrh.com/docs/workflows/website-enquiry/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/research/workspace-stamp/"
      ]
    },
    {
      "id": "T0001",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/",
      "markdown": "https://connectbyjbrh.com/docs/technology/index.md",
      "title": "Technology reference",
      "description": "How to read the technology reference: the ten questions every page answers, the five status words, and the rule that Connect's own use is always stated.",
      "summary": "This section explains the technologies a business meets around Connect — protocols, formats, mail and telephony standards, database mechanisms and model behaviour. Every page states plainly whether Connect uses the thing, and pages exist for technologies Connect deliberately does not use, because knowing what a system avoids is as useful as knowing what it runs.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/protocols/",
        "https://connectbyjbrh.com/docs/glossary/",
        "https://connectbyjbrh.com/docs/product/status/",
        "https://connectbyjbrh.com/docs/technology/ai-agent/",
        "https://connectbyjbrh.com/docs/technology/http/",
        "https://connectbyjbrh.com/developers/"
      ]
    },
    {
      "id": "T0050",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/accessibility/",
      "markdown": "https://connectbyjbrh.com/docs/technology/accessibility/index.md",
      "title": "Web accessibility",
      "description": "Accessible pages start with semantic HTML: name, role and state, keyboard order and focus — and the same structure that helps browser agents.",
      "summary": "Web accessibility is the practice of building pages that work for people who do not interact with them the way the designer imagined — with a screen reader, a keyboard alone, magnification, voice control, or a browser set to reduce motion. Nearly all of it is achieved by using the correct HTML element and not overriding what it already does.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/aria/",
        "https://connectbyjbrh.com/docs/technology/core-web-vitals/",
        "https://connectbyjbrh.com/docs/technology/csp/",
        "https://connectbyjbrh.com/research/focus-rings-that-computed-to-none/",
        "https://connectbyjbrh.com/research/invisible-ui-defects/"
      ]
    },
    {
      "id": "T0017",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/agent-observability/",
      "markdown": "https://connectbyjbrh.com/docs/technology/agent-observability/index.md",
      "title": "Agent observability",
      "description": "Recording an agent's work so a decision taken weeks ago can be explained: what to capture, what is useless afterwards, and where Connect keeps it.",
      "summary": "Observability for an agent is the ability to answer, later and without guessing, why it did that. It needs more than application logs, because the interesting question is rarely 'did the code run' — it is which rule applied, what the agent was working from, what it decided, and what the outside world said in reply.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/audit-log/",
        "https://connectbyjbrh.com/docs/technology/observability/",
        "https://connectbyjbrh.com/docs/technology/query-cost/",
        "https://connectbyjbrh.com/research/derived-control-state/",
        "https://connectbyjbrh.com/docs/technology/evidence/"
      ]
    },
    {
      "id": "T0018",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/agent-security/",
      "markdown": "https://connectbyjbrh.com/docs/technology/agent-security/index.md",
      "title": "Agent security",
      "description": "The threat model for software that holds real mail credentials and takes real actions on a business's behalf, and the boundaries that keep a mistake small.",
      "summary": "An agent with a mailbox and a phone line is not a chatbot with extra features — it is an application holding credentials to systems your business depends on, acting on content written by strangers. The threat model has four parts: who may sign in, what the credentials can reach, what the agent may do once persuaded, and whether anyone can tell afterwards.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/technology/prompt-injection/",
        "https://connectbyjbrh.com/docs/technology/secret-management/",
        "https://connectbyjbrh.com/docs/technology/authorization-models/"
      ]
    },
    {
      "id": "T0004",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/agentic-workflow/",
      "markdown": "https://connectbyjbrh.com/docs/technology/agentic-workflow/index.md",
      "title": "Agentic workflow",
      "description": "Multi-step work with tools and checkpoints: how an agentic workflow differs from a script, and where the human checkpoints have to sit to be worth having.",
      "summary": "An agentic workflow is multi-step work where the sequence is decided as it goes rather than written in advance. A script knows its next step; an agentic workflow knows its goal and picks the step. That flexibility is the whole benefit and the whole risk, which is why the interesting design question is where the checkpoints go.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/ai-agent/",
        "https://connectbyjbrh.com/docs/technology/orchestration/",
        "https://connectbyjbrh.com/docs/workflows/",
        "https://connectbyjbrh.com/docs/autonomy/approvals/",
        "https://connectbyjbrh.com/docs/protocols/arazzo/"
      ]
    },
    {
      "id": "T0003",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/ai-agent/",
      "markdown": "https://connectbyjbrh.com/docs/technology/ai-agent/index.md",
      "title": "AI agent",
      "description": "The AI agent concept: the perceive-decide-act loop, the three things that make one useful in a business, and the two that make one dangerous.",
      "summary": "An AI agent is a loop: it observes something, decides what to do, calls a tool that changes the world, observes the result, and goes round again until it is finished or stopped. The model supplies the decision. Everything that makes the loop safe — what it may call, when it must stop, what it is allowed to believe — is ordinary software around it.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/agentic-workflow/",
        "https://connectbyjbrh.com/docs/technology/tool-calling/",
        "https://connectbyjbrh.com/docs/compare/agent-vs-assistant/",
        "https://connectbyjbrh.com/docs/product/how-connect-works/",
        "https://connectbyjbrh.com/docs/technology/prompt-injection/"
      ]
    },
    {
      "id": "T0051",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/aria/",
      "markdown": "https://connectbyjbrh.com/docs/technology/aria/index.md",
      "title": "WAI-ARIA",
      "description": "WAI-ARIA roles, states and properties: the five rules, the patterns that genuinely need it, and the ways it makes a page worse.",
      "summary": "WAI-ARIA is a set of HTML attributes that change what assistive technology reports about an element — its role, its state, its relationships. It changes nothing else: no behaviour, no keyboard handling, no styling. That single fact explains most ARIA bugs, because an element given `role=\"button\"` still does not respond to the keyboard.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/accessibility/",
        "https://connectbyjbrh.com/docs/technology/csp/",
        "https://connectbyjbrh.com/docs/technology/virtualised-rendering/",
        "https://connectbyjbrh.com/research/invisible-ui-defects/",
        "https://connectbyjbrh.com/docs/technology/core-web-vitals/"
      ]
    },
    {
      "id": "T0024",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/asr/",
      "markdown": "https://connectbyjbrh.com/docs/technology/asr/index.md",
      "title": "Speech recognition",
      "description": "Automatic speech recognition: what it does on a turn-based path, what a transcript actually is once the model speaks directly, and why it lands late.",
      "summary": "Speech recognition turns audio into text. On a turn-based voice path that text is the input a model reasons over, so recognition quality is answer quality. On Connect's realtime path there is no recogniser in front of the model: the transcript is produced beside the audio rather than ahead of it, which makes it a record of the call rather than the thing the call was decided from.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/speech-to-speech/",
        "https://connectbyjbrh.com/docs/technology/call-transcript/",
        "https://connectbyjbrh.com/docs/technology/turn-detection/",
        "https://connectbyjbrh.com/docs/technology/vad/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/callback-promises/"
      ]
    },
    {
      "id": "T0103",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/audit-log/",
      "markdown": "https://connectbyjbrh.com/docs/technology/audit-log/index.md",
      "title": "Audit logs",
      "description": "The four things an entry needs before a log counts as an audit trail, why refusals belong in it, and what turns the same file into a liability.",
      "summary": "An audit trail answers who did what, when, under which rule, and what happened next — for actions that were refused as well as actions that were taken. A log that records only successes, or that the actor can edit, or that copies the content of the message it describes, is a different artefact wearing the same name.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/security/audit-access/",
        "https://connectbyjbrh.com/docs/autonomy/audit-retention/",
        "https://connectbyjbrh.com/docs/technology/provenance/",
        "https://connectbyjbrh.com/docs/glossary/audit/"
      ]
    },
    {
      "id": "T0102",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/authorization-models/",
      "markdown": "https://connectbyjbrh.com/docs/technology/authorization-models/index.md",
      "title": "Authorisation models",
      "description": "Allowlists, roles, scopes and row policies compared by the failure each one produces, and how Connect layers three of them over one request.",
      "summary": "An authorisation model decides who may do what. The four common shapes — allowlist, role, scope and row policy — differ less in what they permit than in what they do when they refuse: a closed door, a missing button, a narrower rule winning, or a row that simply is not there. Connect layers three of them, deliberately, over every request.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/authorization/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/technology/row-level-security/",
        "https://connectbyjbrh.com/docs/autonomy/scopes/",
        "https://connectbyjbrh.com/docs/glossary/customer-safe/"
      ]
    },
    {
      "id": "T0110",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/backup-restore/",
      "markdown": "https://connectbyjbrh.com/docs/technology/backup-restore/index.md",
      "title": "Backups and restore",
      "description": "What a backup has to contain before a restore actually works, the parts that live outside the database, and the rehearsal that turns a hope into a fact.",
      "summary": "A backup is only worth what a restore proves. The data is usually the easy part; what defeats a restore is everything that lives outside the database — the security policies applied by an operational script, the credential held in a managed secret, the provider connections that were never in the dump. A restore nobody has rehearsed is an assumption.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/how-to/export-your-data/",
        "https://connectbyjbrh.com/docs/technology/postgresql/",
        "https://connectbyjbrh.com/docs/technology/row-level-security/",
        "https://connectbyjbrh.com/docs/security/data-retention/",
        "https://connectbyjbrh.com/docs/files-data/data-import-export/"
      ]
    },
    {
      "id": "T0079",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/barge-in/",
      "markdown": "https://connectbyjbrh.com/docs/technology/barge-in/index.md",
      "title": "Barge-in",
      "description": "Interrupting a talking voice agent: the two ways it fails, how an ignored interruption is measured, and why resuming afterwards is usually wrong.",
      "summary": "Barge-in is a caller speaking over the agent and the agent stopping. It works on Connect's realtime calls, and it fails in exactly two directions: not stopping, which callers experience as being talked over, and stopping for something that was not an interruption. An interruption still running past two seconds is recorded as ignored.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/turn-detection/",
        "https://connectbyjbrh.com/docs/technology/vad/",
        "https://connectbyjbrh.com/docs/technology/voice-latency/",
        "https://connectbyjbrh.com/research/barge-in-without-cutting-the-greeting/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "T0062",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/bimi/",
      "markdown": "https://connectbyjbrh.com/docs/technology/bimi/index.md",
      "title": "BIMI",
      "description": "What BIMI actually requires before a logo appears anywhere: DMARC at enforcement, a constrained SVG, and for some clients a mark certificate.",
      "summary": "BIMI is a DNS record pointing at a logo, which some mailbox providers show beside a message. It does nothing on its own: it is gated behind DMARC at enforcement, a tightly constrained SVG profile, and — at the providers most people want it for — a certificate proving the mark is yours. Connect neither publishes nor reads one.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/dmarc/",
        "https://connectbyjbrh.com/docs/technology/dkim/",
        "https://connectbyjbrh.com/docs/technology/deliverability/",
        "https://connectbyjbrh.com/docs/technology/dns/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "T0063",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/bounce/",
      "markdown": "https://connectbyjbrh.com/docs/technology/bounce/index.md",
      "title": "Bounces",
      "description": "Hard, soft and the classes in between: what a bounce actually is, why some rejections never bounce at all, and the response each one deserves.",
      "summary": "A bounce is a receiving server telling you it will not deliver a message. Permanent rejections are 5xx and mean stop; temporary ones are 4xx and mean try later. The dangerous category is neither: a message accepted with a 250 and then filed in spam, or discarded, produces no bounce and looks like success from the sender's side.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/smtp/",
        "https://connectbyjbrh.com/docs/technology/suppression/",
        "https://connectbyjbrh.com/docs/technology/deliverability/",
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/"
      ]
    },
    {
      "id": "T0088",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/call-quality/",
      "markdown": "https://connectbyjbrh.com/docs/technology/call-quality/index.md",
      "title": "Call quality measurement",
      "description": "Two different things are called call quality. What a conversation review can measure on the wire, what a network metric measures, and what neither can judge.",
      "summary": "Network call quality is about the audio path — delay, jitter, loss, and the listening scores derived from them. Conversational call quality is about the exchange: how long the caller waited, whether an interruption was honoured, whether the voice repeated itself. Connect measures the second, on the wire, at the end of every realtime call, and names the setting behind each finding.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/docs/technology/voice-latency/",
        "https://connectbyjbrh.com/docs/technology/barge-in/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/docs/technology/call-transcript/",
        "https://connectbyjbrh.com/docs/phone/model-limits/"
      ]
    },
    {
      "id": "T0086",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/call-routing/",
      "markdown": "https://connectbyjbrh.com/docs/technology/call-routing/index.md",
      "title": "Call routing",
      "description": "How a ringing number becomes a workspace, a line and a handler, and why direction, opening hours and worker capacity are part of that decision.",
      "summary": "Call routing is the chain from a dialled number to the code that answers it: number to workspace, workspace to line, line to handler. Connect keeps that chain on `channel_routes`, the same table every channel's endpoints live on, and every step of it can refuse — a switched-off line, closed hours, a spent budget, or a worker that has not checked in.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/carrier-routing/",
        "https://connectbyjbrh.com/docs/phone/line-configuration/",
        "https://connectbyjbrh.com/docs/phone/business-hours/",
        "https://connectbyjbrh.com/docs/technology/did/",
        "https://connectbyjbrh.com/docs/phone/softphone/",
        "https://connectbyjbrh.com/docs/security/number-ownership/",
        "https://connectbyjbrh.com/docs/technology/webhook-signature/"
      ]
    },
    {
      "id": "T0083",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/call-transcript/",
      "markdown": "https://connectbyjbrh.com/docs/technology/call-transcript/index.md",
      "title": "Call transcripts",
      "description": "What a call transcript contains on a speech-to-speech call, what it is reliable evidence for, and why timing read from transcript rows is wrong.",
      "summary": "A call transcript is the text of what was said, turn by turn, written while the call happens. It is what the summary, the lead, the follow-up and the quality review are built from, and Connect keeps one for every call on both engines. It is not a recording, and it is not a clock: a transcript row is timestamped when the sentence finished, not when the sound started.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/transcript/",
        "https://connectbyjbrh.com/docs/phone/call-summary/",
        "https://connectbyjbrh.com/docs/technology/asr/",
        "https://connectbyjbrh.com/docs/technology/call-quality/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/docs/phone/not-a-conversation/"
      ]
    },
    {
      "id": "T0042",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/canonical-url/",
      "markdown": "https://connectbyjbrh.com/docs/technology/canonical-url/index.md",
      "title": "Canonical URLs",
      "description": "What a rel=canonical element actually decides, the duplicate URLs it consolidates, and the signals that quietly overrule it.",
      "summary": "A canonical URL is the one address you want indexed for a piece of content, declared with a `link rel=\"canonical\"` element in the page head. Where several URLs return the same or near-identical content, the canonical says which of them to keep. It is a strong hint rather than a command, and it is ignored when the rest of the page's signals disagree with it.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/sitemap/",
        "https://connectbyjbrh.com/docs/technology/robots-txt/",
        "https://connectbyjbrh.com/docs/technology/hreflang/",
        "https://connectbyjbrh.com/developers/markdown-mirrors/",
        "https://connectbyjbrh.com/research/writing-for-people-and-machines/"
      ]
    },
    {
      "id": "T0071",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/carrier/",
      "markdown": "https://connectbyjbrh.com/docs/technology/carrier/index.md",
      "title": "Telephony carriers",
      "description": "What a telephony carrier actually supplies, which capability differences change your architecture, and why you should ask rather than assume.",
      "summary": "A carrier sells you three things: numbers, a path to and from the public network, and a way for your software to hear about calls. Everything beyond that — recording, transfer, messaging, browser registration, trunking — differs by provider and by account, which is why a well-built system asks what a provider can do instead of assuming it from the provider's name.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/pstn/",
        "https://connectbyjbrh.com/docs/technology/did/",
        "https://connectbyjbrh.com/docs/technology/sip-trunk/",
        "https://connectbyjbrh.com/docs/technology/webhook-signature/",
        "https://connectbyjbrh.com/research/provider-independent-telephony/"
      ]
    },
    {
      "id": "T0041",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/circuit-breaker/",
      "markdown": "https://connectbyjbrh.com/docs/technology/circuit-breaker/index.md",
      "title": "Circuit breakers",
      "description": "Open, closed and half-open: how a failure counter stops a dying provider taking your own workers with it, and what Connect runs in place of one.",
      "summary": "A circuit breaker is a piece of state in front of a remote dependency. It counts recent failures, and once there are enough it stops calling the dependency at all for a while, answering immediately instead. The point is not to save the provider. It is to stop your own workers queueing behind calls that were going to fail.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/retry/",
        "https://connectbyjbrh.com/docs/technology/rate-limit/",
        "https://connectbyjbrh.com/docs/technology/idempotency/",
        "https://connectbyjbrh.com/docs/technology/observability/",
        "https://connectbyjbrh.com/research/silent-failure/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "T0082",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/context-compression/",
      "markdown": "https://connectbyjbrh.com/docs/technology/context-compression/index.md",
      "title": "Context compression on a live call",
      "description": "Why a live model is re-billed for its whole context every turn, what a compression trigger and target do, and why the trigger has to be sized.",
      "summary": "Context compression replaces the older part of a conversation with a shorter summary so the window stops growing. On a live voice call it is a cost control before it is a capacity one, because the whole context is charged again on every turn. Connect sizes the trigger explicitly on the realtime path; left at its default it is the model's entire window, which is the same as off.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/session-resumption/",
        "https://connectbyjbrh.com/docs/technology/context-window/",
        "https://connectbyjbrh.com/docs/technology/llm-cost/",
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/docs/phone/session-limits/",
        "https://connectbyjbrh.com/docs/technology/voice-latency/"
      ]
    },
    {
      "id": "T0007",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/context-window/",
      "markdown": "https://connectbyjbrh.com/docs/technology/context-window/index.md",
      "title": "Context window",
      "description": "The span of text a model can attend to in one call: what has to be re-sent every turn, what it costs, and why a larger window is not a longer memory.",
      "summary": "A context window is the maximum amount of text a model can consider in a single call, counted in tokens. Everything the model is meant to know for that call has to be inside it — instructions, history, retrieved material, the current message — and it is re-sent every turn, because the model retains nothing between calls. Window size is a capacity limit, not a memory.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/model-context/",
        "https://connectbyjbrh.com/docs/technology/context-compression/",
        "https://connectbyjbrh.com/docs/technology/llm-cost/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "T0052",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/core-web-vitals/",
      "markdown": "https://connectbyjbrh.com/docs/technology/core-web-vitals/index.md",
      "title": "Page experience and Core Web Vitals",
      "description": "LCP, INP and CLS explained by what causes them, plus what a text-heavy documentation site should fix first and what it can ignore.",
      "summary": "Core Web Vitals are three field metrics: **LCP**, how long until the largest piece of content appears; **INP**, how long the page takes to respond to interactions; and **CLS**, how much the layout moves under the reader. They are measured from real visits at the 75th percentile, so a fast test on your own machine says almost nothing about them.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/http-caching/",
        "https://connectbyjbrh.com/docs/technology/csp/",
        "https://connectbyjbrh.com/docs/technology/accessibility/",
        "https://connectbyjbrh.com/docs/technology/https/",
        "https://connectbyjbrh.com/docs/technology/virtualised-rendering/"
      ]
    },
    {
      "id": "T0114",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/cors/",
      "markdown": "https://connectbyjbrh.com/docs/technology/cors/index.md",
      "title": "CORS",
      "description": "What the same-origin policy stops, what a preflight is really asking, and why an Allow-Origin header protects a browser rather than a server.",
      "summary": "CORS is the mechanism by which a server tells a **browser** that it may relax the same-origin policy for a particular caller. That is the whole of it. It is not authentication, not authorisation and not a defence against anything that is not a browser — a script with a command-line HTTP client never consults it and never has to.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/https/",
        "https://connectbyjbrh.com/docs/technology/sessions-cookies/",
        "https://connectbyjbrh.com/docs/technology/csp/",
        "https://connectbyjbrh.com/docs/protocols/mcp-security/",
        "https://connectbyjbrh.com/docs/security/customer-facade/"
      ]
    },
    {
      "id": "T0101",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/credential-rotation/",
      "markdown": "https://connectbyjbrh.com/docs/technology/credential-rotation/index.md",
      "title": "Credential rotation",
      "description": "Why a password is read from a managed secret at boot rather than kept in a file, what a stale copy breaks, and how OAuth tokens rotate themselves.",
      "summary": "Credential rotation is replacing a secret on a schedule while the systems that use it keep running. The hard part is never the new secret; it is every copy of the old one. Connect keeps no copy of its database password — the managed secret is read at boot — and rebuilds each mailbox's token bundle on every refresh rather than holding a snapshot of it.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/secret-management/",
        "https://connectbyjbrh.com/docs/security/credential-sealing/",
        "https://connectbyjbrh.com/docs/technology/oauth/",
        "https://connectbyjbrh.com/docs/technology/encryption-at-rest/",
        "https://connectbyjbrh.com/docs/account/google-sign-in/"
      ]
    },
    {
      "id": "T0049",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/csp/",
      "markdown": "https://connectbyjbrh.com/docs/technology/csp/index.md",
      "title": "Content Security Policy",
      "description": "Content Security Policy as a source allowlist: what it blocks, why inline script is the usual casualty, and why these docs carry no JavaScript.",
      "summary": "A Content Security Policy is a response header listing the origins a page is allowed to load each kind of resource from. The browser enforces it. Its main value is that a script injected into your HTML — through a comment field, a template bug or a compromised dependency — does not run, because its origin is not on the list.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/https/",
        "https://connectbyjbrh.com/docs/technology/http-caching/",
        "https://connectbyjbrh.com/docs/technology/agent-security/",
        "https://connectbyjbrh.com/docs/technology/cors/",
        "https://connectbyjbrh.com/docs/technology/json-ld/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "T0119",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/csv-injection/",
      "markdown": "https://connectbyjbrh.com/docs/technology/csv-injection/index.md",
      "title": "CSV formula injection",
      "description": "A CSV cell that begins with an equals sign becomes a formula when a spreadsheet opens it. The attack, the neutralisation, and why an export looks escaped.",
      "summary": "CSV has no types, so a spreadsheet decides what a cell means when it opens the file. A value beginning with `=`, `+`, `-` or `@` is read as a formula and evaluated — including a value that arrived from a stranger through a web form. Neutralising it on export is why an exported cell can look escaped: the escaping is the fix.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/csv-export-formula/",
        "https://connectbyjbrh.com/docs/files-data/data-import-export/",
        "https://connectbyjbrh.com/docs/how-to/export-your-data/",
        "https://connectbyjbrh.com/docs/technology/office-open-xml/",
        "https://connectbyjbrh.com/docs/files-data/data-grid/"
      ]
    },
    {
      "id": "T0107",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/data-residency/",
      "markdown": "https://connectbyjbrh.com/docs/technology/data-residency/index.md",
      "title": "Data residency",
      "description": "What residency, sovereignty and localisation each mean, which parts of a system they actually constrain, and the questions worth asking a supplier.",
      "summary": "Data residency is the question of which country your data physically sits in. It is narrower than it sounds: it constrains storage locations, not who may compel access, and in a communications product the interesting locations are usually your own providers' rather than the application's. The useful move is to ask specific questions rather than to look for a badge.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/data-retention/",
        "https://connectbyjbrh.com/docs/product/privacy-in-the-product/",
        "https://connectbyjbrh.com/docs/technology/pii/",
        "https://connectbyjbrh.com/docs/technology/encryption-at-rest/",
        "https://connectbyjbrh.com/docs/product/data-you-give-connect/"
      ]
    },
    {
      "id": "T0067",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/deliverability/",
      "markdown": "https://connectbyjbrh.com/docs/technology/deliverability/index.md",
      "title": "Email deliverability",
      "description": "The factors that decide whether mail reaches an inbox, ranked honestly: who you send to first, authentication second, content much later.",
      "summary": "Deliverability is whether a message reaches the inbox rather than the spam folder or nowhere. The ranking that matters is unpopular: who you send to and how they react outweighs everything else, authentication is necessary but buys nothing on its own, and the subject line most people worry about first is near the bottom.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/dmarc/",
        "https://connectbyjbrh.com/docs/technology/spf/",
        "https://connectbyjbrh.com/docs/technology/suppression/",
        "https://connectbyjbrh.com/docs/technology/transactional-vs-marketing/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/"
      ]
    },
    {
      "id": "T0070",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/did/",
      "markdown": "https://connectbyjbrh.com/docs/technology/did/index.md",
      "title": "DID — a direct inward dialling number",
      "description": "A business phone number as a technical object: what direct inward dialling means, what renting a number gives you, and where routing is decided.",
      "summary": "A DID is a telephone number a carrier allocates to you and points at something you control. The name comes from direct inward dialling — the arrangement that let outside callers reach an extension directly instead of through a switchboard. You rent it rather than own it, and where it rings is configured at the carrier, not in your code.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/pstn/",
        "https://connectbyjbrh.com/docs/technology/carrier/",
        "https://connectbyjbrh.com/docs/technology/sip-trunk/",
        "https://connectbyjbrh.com/docs/technology/call-routing/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "T0002",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/digital-employee/",
      "markdown": "https://connectbyjbrh.com/docs/technology/digital-employee/index.md",
      "title": "Digital employee",
      "description": "What a digital employee is as a category: a permanent role with responsibilities, memory and oversight, rather than a task-shaped agent you launch and forget.",
      "summary": "A digital employee is software given a standing role in a business rather than a task. It holds responsibilities across channels, keeps a durable record of the people it deals with, works to rules its employer sets, and answers for what it did. The distinguishing feature is not intelligence but continuity: it is the same worker tomorrow, with yesterday's context.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/compare/digital-employee-vs-ai-agent/",
        "https://connectbyjbrh.com/docs/glossary/digital-employee/",
        "https://connectbyjbrh.com/docs/technology/ai-agent/",
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/docs/autonomy/modes/"
      ]
    },
    {
      "id": "T0060",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/dkim/",
      "markdown": "https://connectbyjbrh.com/docs/technology/dkim/index.md",
      "title": "DKIM",
      "description": "DKIM signatures: what is signed, how a receiver verifies, why signatures break in transit, and how keys are rotated with a selector.",
      "summary": "DKIM attaches a cryptographic signature to a message. The sending domain publishes a public key in DNS under a **selector**; the sender signs chosen headers and the body with the private key; the receiver fetches the key and verifies. Unlike SPF the signature travels with the message, so it survives forwarding — until something rewrites what was signed.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/spf/",
        "https://connectbyjbrh.com/docs/technology/dmarc/",
        "https://connectbyjbrh.com/docs/technology/smtp/",
        "https://connectbyjbrh.com/docs/technology/suppression/",
        "https://connectbyjbrh.com/docs/technology/credential-rotation/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "T0093",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/dlt/",
      "markdown": "https://connectbyjbrh.com/docs/technology/dlt/index.md",
      "title": "DLT — Distributed Ledger Technology registration in India",
      "description": "India's distributed-ledger registration for commercial messaging: what the regulator requires, who registers what, and why an unregistered message is rejected upstream.",
      "summary": "Commercial messaging in India runs on a shared registry the telecom operators maintain between them. A business registers itself, then its sender header, then every message template it wants to send, and anything that does not match a registration is rejected by the operator. Connect holds the registration data; the registration itself is a process with the operators and cannot be completed in Connect.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/dlt/",
        "https://connectbyjbrh.com/docs/technology/sms/",
        "https://connectbyjbrh.com/docs/technology/sender-id/",
        "https://connectbyjbrh.com/docs/technology/stop-keyword/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
        "https://connectbyjbrh.com/docs/technology/transactional-vs-marketing/"
      ]
    },
    {
      "id": "T0061",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/dmarc/",
      "markdown": "https://connectbyjbrh.com/docs/technology/dmarc/index.md",
      "title": "DMARC",
      "description": "How DMARC works: alignment against the From header, the three policies, the two report types, and the deployment order that does not lose mail.",
      "summary": "DMARC is a DNS record that tells a receiving mail server what to do with a message claiming to be from your domain when neither SPF nor DKIM lines up with the address a human sees. It adds one idea to those two — alignment — plus a policy and a reporting address. Connect publishes no DMARC record for anyone; it sends through the mailbox a workspace already owns.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/spf/",
        "https://connectbyjbrh.com/docs/technology/dkim/",
        "https://connectbyjbrh.com/docs/technology/deliverability/",
        "https://connectbyjbrh.com/docs/technology/bimi/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "T0115",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/dns/",
      "markdown": "https://connectbyjbrh.com/docs/technology/dns/index.md",
      "title": "DNS",
      "description": "The record types a business communications setup actually depends on, and why TTL is an operational commitment rather than a number in a form.",
      "summary": "DNS turns names into answers — addresses, mail destinations and text records that other systems read as policy. For a business running mail and telephony the records that matter are `MX`, several `TXT` records, and a handful of `CNAME` delegations. The number that catches people out is the TTL, because it decides how long a mistake lasts.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/spf/",
        "https://connectbyjbrh.com/docs/technology/dkim/",
        "https://connectbyjbrh.com/docs/technology/dmarc/",
        "https://connectbyjbrh.com/docs/technology/deliverability/",
        "https://connectbyjbrh.com/docs/technology/smtp/"
      ]
    },
    {
      "id": "T0075",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/dtmf/",
      "markdown": "https://connectbyjbrh.com/docs/technology/dtmf/index.md",
      "title": "DTMF",
      "description": "Keypad tones: how a digit is encoded, the three ways it travels, and why a voice agent should mostly listen instead of asking for keypresses.",
      "summary": "DTMF is the pair of tones a telephone keypad sends — one from a low group, one from a high group, chosen so no human voice produces both at once. It travels three different ways, and a mismatch between the two ends is the usual reason a menu cannot hear your digits. Connect sends DTMF as a live supervisor control; it collects numbers by listening.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/rtp/",
        "https://connectbyjbrh.com/docs/technology/sip/",
        "https://connectbyjbrh.com/docs/technology/asr/",
        "https://connectbyjbrh.com/docs/technology/call-routing/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "T0099",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/encryption-at-rest/",
      "markdown": "https://connectbyjbrh.com/docs/technology/encryption-at-rest/index.md",
      "title": "Encryption at rest",
      "description": "Which threats storage encryption actually removes, the three layers it can be applied at, and why an authenticated query reads plaintext no matter what.",
      "summary": "Encryption at rest protects stored bytes from someone who obtains the storage: a stolen disk, a copied snapshot, a decommissioned drive. It does nothing about a request that arrives with valid credentials, because the application must be able to read the data to work. Connect encrypts stored credentials at the application level as well, so they are never returned to a screen.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/secret-management/",
        "https://connectbyjbrh.com/docs/security/credential-sealing/",
        "https://connectbyjbrh.com/docs/technology/row-level-security/",
        "https://connectbyjbrh.com/docs/technology/credential-rotation/",
        "https://connectbyjbrh.com/docs/technology/pii/",
        "https://connectbyjbrh.com/docs/technology/backup-restore/",
        "https://connectbyjbrh.com/docs/security/public-vs-private/"
      ]
    },
    {
      "id": "T0013",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/evidence/",
      "markdown": "https://connectbyjbrh.com/docs/technology/evidence/index.md",
      "title": "Evidence in an agent system",
      "description": "What counts as evidence when software claims something happened, how it is attached to the record, and the price of a claim with nothing behind it.",
      "summary": "Evidence is the artefact that would convince a sceptic the claim is true: a provider's own acknowledgement, the source a statement came from, the rule a decision was made under. An agent system full of unevidenced claims is not slightly less trustworthy than one with evidence — it is a different kind of system, because none of its assertions can be checked after the fact.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/",
        "https://connectbyjbrh.com/docs/technology/provenance/",
        "https://connectbyjbrh.com/docs/technology/audit-log/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/",
        "https://connectbyjbrh.com/docs/technology/grounding/"
      ]
    },
    {
      "id": "T0064",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/feedback-loop/",
      "markdown": "https://connectbyjbrh.com/docs/technology/feedback-loop/index.md",
      "title": "Complaint feedback loops",
      "description": "What a mailbox provider sends back when someone presses the spam button, why the recipient is often redacted, and the only correct response.",
      "summary": "A feedback loop is an arrangement with a mailbox provider under which complaints — someone pressing 'report spam' — are forwarded back to the sender, usually as a structured abuse report. The correct response is a permanent, immediate opt-out with no exceptions and no appeal, because the person chose the harsher of the two available buttons.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/suppression/",
        "https://connectbyjbrh.com/docs/technology/unsubscribe/",
        "https://connectbyjbrh.com/docs/technology/deliverability/",
        "https://connectbyjbrh.com/docs/technology/bounce/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "T0055",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/gmail-api/",
      "markdown": "https://connectbyjbrh.com/docs/technology/gmail-api/index.md",
      "title": "Gmail API",
      "description": "Gmail's HTTP mail API: history IDs for incremental sync, labels instead of folders, and why write-back must never block a reply.",
      "summary": "The Gmail API is an HTTP interface to a Google mailbox, used instead of IMAP and SMTP. Two things differ from the classic protocols and both change how a client is written: synchronisation is driven by a **history ID** rather than a folder cursor, and a message has **labels** rather than living in one folder.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/imap/",
        "https://connectbyjbrh.com/docs/technology/microsoft-graph/",
        "https://connectbyjbrh.com/docs/technology/oauth/",
        "https://connectbyjbrh.com/docs/technology/smtp/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "T0008",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/grounding/",
      "markdown": "https://connectbyjbrh.com/docs/technology/grounding/index.md",
      "title": "Grounding",
      "description": "Tying an answer to a source a person can check, and the practical difference between a grounded statement and a merely plausible one.",
      "summary": "Grounding means an answer is produced from supplied material and can be traced back to it. The test is not whether the answer sounds right — an ungrounded model is fluent by design — but whether you can point at the sentence it came from. Without that, a business answer and a confident guess are indistinguishable until a customer acts on the wrong one.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/technology/rag/",
        "https://connectbyjbrh.com/docs/technology/hallucination/",
        "https://connectbyjbrh.com/docs/technology/evidence/",
        "https://connectbyjbrh.com/research/grounding-without-a-vector-database/"
      ]
    },
    {
      "id": "T0014",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/hallucination/",
      "markdown": "https://connectbyjbrh.com/docs/technology/hallucination/index.md",
      "title": "Unsupported claims",
      "description": "Why a confidently wrong answer costs a business more than a slow one, and the controls that reduce unsupported claims rather than apologising for them.",
      "summary": "An unsupported claim is an answer a model produced with nothing behind it. It is not a bug that can be patched out, because generating fluent text is the same operation whether or not the content is grounded. What a business system can do is reduce the opportunity, make the remainder detectable, and keep the expensive categories behind a person.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/grounding/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/docs/technology/evidence/",
        "https://connectbyjbrh.com/docs/technology/rag/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "T0047",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/hreflang/",
      "markdown": "https://connectbyjbrh.com/docs/technology/hreflang/index.md",
      "title": "hreflang",
      "description": "Language and region annotations that survive contact with reality: the reciprocity rule, x-default, and when hreflang is the wrong tool.",
      "summary": "`hreflang` annotations tell a search engine that several URLs are the same content in different languages or for different regions, so that a reader in one place is offered the version meant for them. The annotations form a set, and a set only works if every member names every other member — including itself.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/canonical-url/",
        "https://connectbyjbrh.com/docs/technology/sitemap/",
        "https://connectbyjbrh.com/docs/technology/unicode-and-scripts/",
        "https://connectbyjbrh.com/docs/technology/multilingual-voice/",
        "https://connectbyjbrh.com/docs/technology/robots-txt/"
      ]
    },
    {
      "id": "T0058",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/html-email/",
      "markdown": "https://connectbyjbrh.com/docs/technology/html-email/index.md",
      "title": "HTML email",
      "description": "What actually renders in a mail client, what is stripped, and why a mail reader must sanitise incoming HTML rather than trust it.",
      "summary": "HTML email is HTML rendered by dozens of clients that each remove what they dislike. There is no shared engine and no versioning: the same message is one layout in a desktop client, another on a phone, and plain text in a third. Writing it is an exercise in using the small subset everything agrees on.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/mime/",
        "https://connectbyjbrh.com/docs/technology/prompt-injection/",
        "https://connectbyjbrh.com/docs/technology/deliverability/",
        "https://connectbyjbrh.com/docs/technology/csp/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "T0048",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/http-caching/",
      "markdown": "https://connectbyjbrh.com/docs/technology/http-caching/index.md",
      "title": "HTTP caching and revalidation",
      "description": "Freshness, validators and revalidation: how ETag and Last-Modified work, and the header that stops a browser serving a module from the last deploy.",
      "summary": "HTTP caching has two halves. **Freshness** decides whether a stored response may be used without asking; `Cache-Control` sets it. **Validation** decides what happens when it may not; `ETag` and `Last-Modified` let a client ask \"has this changed?\" and receive a 27-byte `304 Not Modified` instead of the whole body.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/http/",
        "https://connectbyjbrh.com/docs/technology/indexnow/",
        "https://connectbyjbrh.com/docs/technology/core-web-vitals/",
        "https://connectbyjbrh.com/docs/technology/csp/",
        "https://connectbyjbrh.com/research/documentation-as-a-build/"
      ]
    },
    {
      "id": "T0025",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/http/",
      "markdown": "https://connectbyjbrh.com/docs/technology/http/index.md",
      "title": "HTTP",
      "description": "The request-and-response model everything here runs on, the status codes that carry real meaning in Connect, and the three that routinely mislead.",
      "summary": "HTTP is a request-and-response protocol: a client sends a method, a path and headers, the server answers with a status code and usually a body, and the server keeps no memory of the exchange afterwards. Every Connect surface — the app, the public API, the MCP endpoint, inbound provider webhooks — is HTTP. Reading its status codes correctly is most of the work of debugging an integration.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/rest/",
        "https://connectbyjbrh.com/docs/technology/https/",
        "https://connectbyjbrh.com/docs/technology/rate-limit/",
        "https://connectbyjbrh.com/docs/technology/sse/",
        "https://connectbyjbrh.com/developers/api-errors/",
        "https://connectbyjbrh.com/research/closed-by-default-facade/"
      ]
    },
    {
      "id": "T0026",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/https/",
      "markdown": "https://connectbyjbrh.com/docs/technology/https/index.md",
      "title": "HTTPS and TLS",
      "description": "What TLS protects on the wire, the four things it does not protect at all, and how a terminating proxy changes what the application can see.",
      "summary": "HTTPS is HTTP inside a TLS tunnel. It gives you three things: nobody between client and server can read the exchange, nobody can alter it undetected, and the client can verify the server is who the certificate says. It gives you nothing about what either end does with the data afterwards, and it stops protecting anything the moment a proxy terminates the tunnel.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/http/",
        "https://connectbyjbrh.com/docs/technology/oauth/",
        "https://connectbyjbrh.com/docs/technology/webhook-signature/",
        "https://connectbyjbrh.com/docs/technology/encryption-at-rest/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/technology/csp/"
      ]
    },
    {
      "id": "T0016",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/human-in-the-loop/",
      "markdown": "https://connectbyjbrh.com/docs/technology/human-in-the-loop/index.md",
      "title": "Human in the loop",
      "description": "Putting a person at the point where a decision is expensive to reverse, and the review-speed problem that decides whether the pattern survives contact with a working week.",
      "summary": "Human in the loop means a person's decision is required before a specific action completes. The design question is never whether to have one — it is where, because a checkpoint on everything is abandoned within a fortnight and a checkpoint on nothing is discovered after something has gone out. Put it where the action is expensive to undo.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/approval-without-blocking/",
        "https://connectbyjbrh.com/research/authority-separation/",
        "https://connectbyjbrh.com/docs/technology/agent-observability/",
        "https://connectbyjbrh.com/docs/technology/hallucination/"
      ]
    },
    {
      "id": "T0038",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/idempotency/",
      "markdown": "https://connectbyjbrh.com/docs/technology/idempotency/index.md",
      "title": "Idempotency",
      "description": "Why the same request arriving twice must not do the thing twice, the three mechanisms that achieve it, and the actions where it is the only defence.",
      "summary": "An operation is idempotent when doing it again changes nothing further. It is a property of the effect, not of the request: a retry is safe because the second attempt lands on a system that has already recorded the first. There are three ways to get there — design the operation so repetition is meaningless, carry a key that identifies the attempt, or let a uniqueness constraint decide.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/retry/",
        "https://connectbyjbrh.com/docs/technology/webhook/",
        "https://connectbyjbrh.com/developers/api-idempotency/",
        "https://connectbyjbrh.com/docs/technology/reversible-actions/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/"
      ]
    },
    {
      "id": "T0054",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/imap/",
      "markdown": "https://connectbyjbrh.com/docs/technology/imap/index.md",
      "title": "IMAP",
      "description": "Reading a mailbox over IMAP: folders, UIDVALIDITY, flags and the cursor a client must keep — and the way a cursor loses mail.",
      "summary": "IMAP is the protocol for reading a mailbox that stays on the server. The client browses folders, fetches whole messages or single parts, and sets flags such as `\\Seen`. Unlike POP3 it does not download and delete, which means the client has to keep an accurate idea of where it had got to — and that cursor is where mail is lost.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/smtp/",
        "https://connectbyjbrh.com/docs/technology/gmail-api/",
        "https://connectbyjbrh.com/docs/technology/mime/",
        "https://connectbyjbrh.com/research/cursor-loss/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "T0046",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/indexnow/",
      "markdown": "https://connectbyjbrh.com/docs/technology/indexnow/index.md",
      "title": "IndexNow",
      "description": "IndexNow in full: the key file, the shape of a submission, the 10,000-URL bulk limit, and what is worth telling a search engine about.",
      "summary": "IndexNow is a small push protocol. Instead of waiting for a crawler to notice that a page changed, you POST the changed URLs to a participating search engine, having first proved you control the host by serving a key file from it. Version 1.0 is the current revision; participating engines share submissions with each other.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/sitemap/",
        "https://connectbyjbrh.com/docs/technology/robots-txt/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/docs/technology/http-caching/",
        "https://connectbyjbrh.com/research/measuring-ai-visibility/"
      ]
    },
    {
      "id": "T0043",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/json-ld/",
      "markdown": "https://connectbyjbrh.com/docs/technology/json-ld/index.md",
      "title": "JSON-LD and structured data",
      "description": "Structured data as JSON-LD: what it changes, the rule that markup must match visible text, and the types not worth adding.",
      "summary": "JSON-LD is a block of JSON inside a `<script type=\"application/ld+json\">` element that describes what a page is about in a vocabulary machines already know, usually schema.org. It does not change how the page looks and it does not rank a page. It makes claims about the page legible without parsing prose, and every claim must be one the visible page also makes.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/canonical-url/",
        "https://connectbyjbrh.com/docs/technology/json/",
        "https://connectbyjbrh.com/docs/technology/json-schema/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/research/writing-for-people-and-machines/"
      ]
    },
    {
      "id": "T0029",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/json-schema/",
      "markdown": "https://connectbyjbrh.com/docs/technology/json-schema/index.md",
      "title": "JSON Schema",
      "description": "Describing the shape of a payload so a machine can check it: what a schema pins down, what it cannot say, and why valid is not the same as allowed.",
      "summary": "JSON Schema is a JSON document that describes what another JSON document is allowed to look like — which fields exist, of what type, within what bounds, and which are required. It is how a tool tells a model what arguments to produce and how an API description states its payloads. It checks structure only: a perfectly valid argument can still be wrong, forbidden, or about a record that does not exist.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/json/",
        "https://connectbyjbrh.com/docs/technology/tool-calling/",
        "https://connectbyjbrh.com/developers/mcp-public-tools/",
        "https://connectbyjbrh.com/developers/openapi-description/",
        "https://connectbyjbrh.com/docs/technology/agent-security/",
        "https://connectbyjbrh.com/research/agent-tools-call-services/"
      ]
    },
    {
      "id": "T0028",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/json/",
      "markdown": "https://connectbyjbrh.com/docs/technology/json/index.md",
      "title": "JSON",
      "description": "The data format every Connect surface speaks, and the two traps — number precision and re-serialisation — that break systems holding JSON in more than one place.",
      "summary": "JSON has six types: object, array, string, number, boolean and null. That smallness is why it is everywhere and where its two production traps come from. There is one number type and it is not an integer, so identifiers belong in strings; and re-serialising a document does not reproduce its bytes, so anything you verify must be verified against what actually arrived.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/json-schema/",
        "https://connectbyjbrh.com/docs/technology/uuid-identifiers/",
        "https://connectbyjbrh.com/docs/technology/webhook-signature/",
        "https://connectbyjbrh.com/docs/technology/http/",
        "https://connectbyjbrh.com/developers/time-and-timezones/",
        "https://connectbyjbrh.com/docs/technology/prompt-injection/"
      ]
    },
    {
      "id": "T0010",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/knowledge-base/",
      "markdown": "https://connectbyjbrh.com/docs/technology/knowledge-base/index.md",
      "title": "Knowledge base",
      "description": "What a knowledge base is when an agent has to answer from it, and the properties that make one usable rather than merely large.",
      "summary": "For an agent, a knowledge base is the set of material a workspace declares authoritative — the things an answer is allowed to be built from. That is a narrower idea than a document library. A page nobody has approved is not knowledge, and a folder of eighty overlapping drafts makes an agent less accurate rather than more.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/technology/rag/",
        "https://connectbyjbrh.com/docs/technology/structured-memory/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/research/writing-for-people-and-machines/"
      ]
    },
    {
      "id": "T0020",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/llm-cost/",
      "markdown": "https://connectbyjbrh.com/docs/technology/llm-cost/index.md",
      "title": "What a model call costs",
      "description": "What a model call is actually billed for: tokens by direction and modality, context carried on every turn, and the spending that never appears on a per-request line.",
      "summary": "A model call is billed by tokens, counted separately for what goes in and what comes out, and priced differently by modality. Output is dearer than input, audio is dearer than text, and the input you pay for is the whole context — so the largest line in most bills is instructions and history being re-sent, not anything a user typed.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/context-window/",
        "https://connectbyjbrh.com/docs/technology/model-selection/",
        "https://connectbyjbrh.com/research/research-cost-routing/",
        "https://connectbyjbrh.com/docs/technology/query-cost/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "T0090",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/message-status/",
      "markdown": "https://connectbyjbrh.com/docs/technology/message-status/index.md",
      "title": "Message delivery status",
      "description": "Sent, delivered, read, failed: what each state is actually evidence of, why the ladder differs per channel, and why a late status must not overwrite a decision.",
      "summary": "Delivery status is a ladder — accepted, sent, delivered, read, failed — and each rung is evidence of something narrower than its name suggests. Sent means a provider took it. Delivered means something acknowledged it. Read is optional and often disabled. Connect records the provider's own acknowledgement as the evidence and treats anything short of it as uncertain rather than successful.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/message-status/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/technology/bounce/",
        "https://connectbyjbrh.com/docs/technology/idempotency/",
        "https://connectbyjbrh.com/docs/technology/webhook-signature/",
        "https://connectbyjbrh.com/docs/phone/call-record/"
      ]
    },
    {
      "id": "T0056",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/microsoft-graph/",
      "markdown": "https://connectbyjbrh.com/docs/technology/microsoft-graph/index.md",
      "title": "Microsoft Graph mail",
      "description": "Microsoft Graph as a mail transport: the folder model, delta queries, change notifications, and what differs from Gmail in practice.",
      "summary": "Microsoft Graph is the HTTP API for Microsoft 365, and mail is one part of it. A mailbox is reached through `/me/messages` or `/users/{id}/mailFolders/...`, incremental change comes from **delta queries**, and push comes from **change notification subscriptions** that expire and must be renewed.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/gmail-api/",
        "https://connectbyjbrh.com/docs/technology/imap/",
        "https://connectbyjbrh.com/docs/technology/oauth/",
        "https://connectbyjbrh.com/docs/technology/webhook/",
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/"
      ]
    },
    {
      "id": "T0109",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/migrations/",
      "markdown": "https://connectbyjbrh.com/docs/technology/migrations/index.md",
      "title": "Schema migrations",
      "description": "Migrations that run at every boot, why every guard has to be idempotent, and the expression index a reflection API cannot find for you.",
      "summary": "A schema migration changes the shape of a database that already holds data. Connect runs its migrations at every boot rather than as a separate deploy step, which removes a whole class of ordering mistakes and imposes one hard rule in exchange: every step must be safe to run again, on a database where it has already been run.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/postgresql/",
        "https://connectbyjbrh.com/docs/technology/row-level-security/",
        "https://connectbyjbrh.com/docs/technology/relational-data/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/technology/versioning/"
      ]
    },
    {
      "id": "T0057",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/mime/",
      "markdown": "https://connectbyjbrh.com/docs/technology/mime/index.md",
      "title": "MIME",
      "description": "Why an email is a tree: multipart structures, transfer encodings, header encoding, and the parts a reader never sees.",
      "summary": "MIME is the set of conventions that let an email carry more than seven-bit American English. A message becomes a **tree**: a root with a content type, children that are alternatives or attachments, and each leaf declaring its own character set and transfer encoding. Almost every mail-parsing bug is a tree walked wrongly.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/html-email/",
        "https://connectbyjbrh.com/docs/technology/smtp/",
        "https://connectbyjbrh.com/docs/technology/imap/",
        "https://connectbyjbrh.com/docs/technology/unicode-and-scripts/",
        "https://connectbyjbrh.com/docs/technology/pdf-text/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "T0019",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/model-context/",
      "markdown": "https://connectbyjbrh.com/docs/technology/model-context/index.md",
      "title": "System prompts and instructions",
      "description": "The instruction block a model is given before it sees a message: what belongs in it, what does not, and why its size is a latency decision on a live call.",
      "summary": "A system prompt is the standing instruction a model receives before the conversation: who it is acting as, what it may and may not do, and how to write. It is re-sent on every single call, so its length is not a style choice — on the voice path it is the largest thing standing between a caller finishing their sentence and hearing a reply.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/context-window/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/docs/technology/voice-latency/",
        "https://connectbyjbrh.com/docs/technology/model-selection/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "T0021",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/model-selection/",
      "markdown": "https://connectbyjbrh.com/docs/technology/model-selection/index.md",
      "title": "Choosing a model",
      "description": "The axes that decide which model does a piece of business work, how a default gets set, and what actually changes when you move one.",
      "summary": "Choose for the shape of the work, not for a benchmark: the latency budget, whether the input is audio or text, how much instruction the model has to hold, and what a wrong answer costs. Connect sets a default per job — one path for drafting and reasoning, a separate speech-to-speech model on the realtime voice path — and a workspace changes behaviour by changing the instructions and budgets around the model, not by picking one from a list.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/llm-cost/",
        "https://connectbyjbrh.com/docs/technology/context-window/",
        "https://connectbyjbrh.com/docs/technology/speech-to-speech/",
        "https://connectbyjbrh.com/docs/technology/voice-latency/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/research/model-limited-findings/"
      ]
    },
    {
      "id": "T0098",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/multi-tenancy/",
      "markdown": "https://connectbyjbrh.com/docs/technology/multi-tenancy/index.md",
      "title": "Multi-tenancy patterns",
      "description": "Shared schema, separate schema or separate database: what each isolation pattern actually costs, and why the pattern is never the security control.",
      "summary": "There are three ways to hold many customers in one product — everyone in the same tables, one schema each, or one database each — and the choice trades isolation against operational cost. None of them is a security control on its own; enforcement is. Connect uses shared tables with a workspace key, and enforces the boundary three separate times.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/multi-tenancy/",
        "https://connectbyjbrh.com/docs/technology/row-level-security/",
        "https://connectbyjbrh.com/docs/technology/postgresql/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/security/customer-facade/",
        "https://connectbyjbrh.com/docs/technology/data-residency/",
        "https://connectbyjbrh.com/docs/technology/backup-restore/"
      ]
    },
    {
      "id": "T0085",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/multilingual-voice/",
      "markdown": "https://connectbyjbrh.com/docs/technology/multilingual-voice/index.md",
      "title": "Multilingual voice",
      "description": "How a call's language is chosen and changed: language tags, the gap between language and script, code-mixing, and what counts as evidence of a switch.",
      "summary": "Multilingual voice is three decisions rather than one: which language a call opens in, whether the caller has actually changed language, and which script a reply should be written in. Connect decides all three on evidence — the line's language opens the call, a remembered one is spoken from the first reply until a whole sentence overrides it, and a reply is steered only when its script is one the caller has not used.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/unicode-and-scripts/",
        "https://connectbyjbrh.com/docs/phone/multilingual-calls/",
        "https://connectbyjbrh.com/docs/phone/language-detection/",
        "https://connectbyjbrh.com/docs/technology/tts/",
        "https://connectbyjbrh.com/docs/technology/voice-profile/",
        "https://connectbyjbrh.com/docs/phone/regional-speech/"
      ]
    },
    {
      "id": "T0030",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/oauth/",
      "markdown": "https://connectbyjbrh.com/docs/technology/oauth/index.md",
      "title": "OAuth 2.0",
      "description": "Delegated access without handing over a password: the code flow, what a scope really grants, and why the refresh token is the credential that matters.",
      "summary": "OAuth 2.0 lets you give an application limited access to your account at another service without giving it your password. You are redirected to that service, you approve a named list of permissions, and the application receives tokens instead of credentials. Connect uses it for Google sign-in — the only sign-in it has — and for mailbox access to Gmail and Microsoft Graph.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/openid-connect/",
        "https://connectbyjbrh.com/docs/technology/gmail-api/",
        "https://connectbyjbrh.com/docs/technology/microsoft-graph/",
        "https://connectbyjbrh.com/docs/technology/sessions-cookies/",
        "https://connectbyjbrh.com/docs/technology/secret-management/",
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/"
      ]
    },
    {
      "id": "T0111",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/observability/",
      "markdown": "https://connectbyjbrh.com/docs/technology/observability/index.md",
      "title": "Observability",
      "description": "Metrics, logs and traces are built around requests; this system's unit of work is a conversation. What changes, and where the signals actually surface.",
      "summary": "Observability is being able to answer questions about a running system without shipping new code to ask them. The standard three signals — metrics, logs, traces — are organised around requests, and a request is the wrong unit here: the thing that succeeds or fails is a conversation, a decision or a call, and it spans many requests and several days.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/agent-observability/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/technology/query-cost/",
        "https://connectbyjbrh.com/docs/technology/audit-log/",
        "https://connectbyjbrh.com/docs/product/status/"
      ]
    },
    {
      "id": "T0118",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/office-open-xml/",
      "markdown": "https://connectbyjbrh.com/docs/technology/office-open-xml/index.md",
      "title": "Office Open XML",
      "description": "DOCX, XLSX and PPTX are ZIP archives of XML parts. What each one holds, what a reader can get from it, and the two archive attacks that get refused.",
      "summary": "A `.docx`, `.xlsx` or `.pptx` file is a ZIP archive containing XML parts and a map of how they relate. That makes them readable without the application that wrote them, and it makes them archives — which is why a parser has to refuse both external entity declarations and archives that expand out of all proportion to their size.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/supported-formats/",
        "https://connectbyjbrh.com/docs/files-data/safe-parsing/",
        "https://connectbyjbrh.com/docs/files-data/table-extraction/",
        "https://connectbyjbrh.com/docs/technology/pdf-text/",
        "https://connectbyjbrh.com/docs/technology/csv-injection/"
      ]
    },
    {
      "id": "T0031",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/openid-connect/",
      "markdown": "https://connectbyjbrh.com/docs/technology/openid-connect/index.md",
      "title": "OpenID Connect",
      "description": "The identity layer built on OAuth 2.0: what an ID token asserts, which claim is the stable one, and where identity stops and permission begins.",
      "summary": "OAuth answers *may this application do this*. OpenID Connect adds the missing question — *who is this person* — by returning a signed ID token alongside the access token. Connect signs people in with Google, which is an OpenID Connect provider, and there is no other way in. Identity is where a session starts; it is not where any permission is decided.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/oauth/",
        "https://connectbyjbrh.com/docs/technology/sessions-cookies/",
        "https://connectbyjbrh.com/docs/technology/authorization-models/",
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/"
      ]
    },
    {
      "id": "T0006",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/orchestration/",
      "markdown": "https://connectbyjbrh.com/docs/technology/orchestration/index.md",
      "title": "Agent orchestration",
      "description": "Sequencing agent work, retrying what failed, and the single-thinker rule that stops two loops from answering the same message twice.",
      "summary": "Orchestration is the part of an agent system that decides what runs, in what order, how often, and what happens when a step fails. It is ordinary engineering rather than model work, and it is where most agent systems that misbehave in production are actually broken — usually because two schedulers were allowed to reason about the same record at the same time.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/agentic-workflow/",
        "https://connectbyjbrh.com/research/single-thinker/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/technology/idempotency/",
        "https://connectbyjbrh.com/docs/technology/retry/"
      ]
    },
    {
      "id": "T0117",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/pdf-text/",
      "markdown": "https://connectbyjbrh.com/docs/technology/pdf-text/index.md",
      "title": "PDF text extraction",
      "description": "PDF stores positioned glyphs rather than a document, so extraction is reconstruction — and a scanned page has no text in it at all to reconstruct.",
      "summary": "A PDF describes where marks go on a page, not what the document says. Extracting text means reconstructing reading order from geometry, which works well for a single column and badly for tables and multi-column layouts. A scanned page contains no text at all — only an image — so extraction returns nothing rather than failing.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/text-extraction/",
        "https://connectbyjbrh.com/docs/files-data/supported-formats/",
        "https://connectbyjbrh.com/docs/files-data/safe-parsing/",
        "https://connectbyjbrh.com/docs/technology/office-open-xml/",
        "https://connectbyjbrh.com/docs/files-data/answer-from-file/"
      ]
    },
    {
      "id": "T0108",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/pii/",
      "markdown": "https://connectbyjbrh.com/docs/technology/pii/index.md",
      "title": "Personal data",
      "description": "What counts as personal data, the eight places it collects in a communications system, and the handling rules that keep the collection from spreading.",
      "summary": "Personal data is anything that identifies a living person, directly or in combination with something else — which in a communications system means almost everything, since a message is personal data about its sender before anyone reads a word of it. The useful discipline is knowing every place it accumulates, because copies are what turn a manageable set into an unmanageable one.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/data-retention/",
        "https://connectbyjbrh.com/docs/memory/viewing/",
        "https://connectbyjbrh.com/docs/product/privacy-in-the-product/",
        "https://connectbyjbrh.com/docs/technology/data-residency/",
        "https://connectbyjbrh.com/docs/how-to/export-your-data/"
      ]
    },
    {
      "id": "T0095",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/postgresql/",
      "markdown": "https://connectbyjbrh.com/docs/technology/postgresql/index.md",
      "title": "PostgreSQL",
      "description": "What a relational database buys a multi-tenant application, which PostgreSQL features this system actually depends on, and the costs that come with them.",
      "summary": "PostgreSQL is the database underneath Connect, and the choice is load-bearing rather than incidental: workspace isolation is enforced in the database itself with row-level security, uniqueness constraints do the work that careful application code would otherwise have to do, and every record in the product is a row that can be constrained, indexed and audited.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/row-level-security/",
        "https://connectbyjbrh.com/docs/technology/relational-data/",
        "https://connectbyjbrh.com/docs/technology/multi-tenancy/",
        "https://connectbyjbrh.com/docs/technology/migrations/",
        "https://connectbyjbrh.com/docs/technology/query-cost/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/"
      ]
    },
    {
      "id": "T0015",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/prompt-injection/",
      "markdown": "https://connectbyjbrh.com/docs/technology/prompt-injection/index.md",
      "title": "Prompt injection",
      "description": "Instructions smuggled into content an agent reads, what the attack looks like when it arrives as ordinary business mail, and the boundary that contains it.",
      "summary": "Prompt injection is text inside content an agent reads that is written to be obeyed as an instruction. A model has no reliable way to tell the operator's instructions from a sentence in the email it is summarising, so the defence cannot be a better prompt: it has to be that the model's output is a proposal and every real action passes a check the model cannot influence.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/",
        "https://connectbyjbrh.com/docs/technology/agent-security/",
        "https://connectbyjbrh.com/docs/technology/tool-calling/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "T0104",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/provenance/",
      "markdown": "https://connectbyjbrh.com/docs/technology/provenance/index.md",
      "title": "Provenance",
      "description": "Recording where a statement came from, why the origin has to survive an edit, and how Connect attaches evidence to facts, memories and files.",
      "summary": "Provenance is the record of where a piece of information came from, kept alongside the information itself. It matters most at the moment somebody edits the statement: without provenance the edit produces a claim with no origin, indistinguishable from something the system invented, and nobody downstream can tell which they are reading.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/provenance/",
        "https://connectbyjbrh.com/docs/technology/evidence/",
        "https://connectbyjbrh.com/docs/knowledge/facts/",
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/technology/audit-log/"
      ]
    },
    {
      "id": "T0069",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/pstn/",
      "markdown": "https://connectbyjbrh.com/docs/technology/pstn/index.md",
      "title": "PSTN",
      "description": "The public telephone network as a software dependency: what you cannot do without a carrier, and the constraints a phone call imposes on an agent.",
      "summary": "The PSTN is the regulated, interconnected telephone network that ordinary numbers live on. Software cannot join it — you buy access from a licensed carrier, per country, under that country's rules. What it gives you is reach to anyone with a phone. What it charges is per minute, narrowband audio, and a signalling channel with almost nothing in it.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/did/",
        "https://connectbyjbrh.com/docs/technology/carrier/",
        "https://connectbyjbrh.com/docs/technology/sip/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/provider-independent-telephony/"
      ]
    },
    {
      "id": "T0112",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/query-cost/",
      "markdown": "https://connectbyjbrh.com/docs/technology/query-cost/index.md",
      "title": "Query cost",
      "description": "Counting statements instead of timing a machine, the N+1 that grows with the business, and four measured before-and-after numbers from this system.",
      "summary": "Query cost is best counted in **statements** rather than measured in seconds, because a threshold in seconds measures the machine you happened to run on. A statement count is the same on an empty test database as in production, which is what makes it able to catch the fault that only hurts once a workspace has grown.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/postgresql/",
        "https://connectbyjbrh.com/docs/technology/relational-data/",
        "https://connectbyjbrh.com/docs/technology/virtualised-rendering/",
        "https://connectbyjbrh.com/docs/technology/observability/",
        "https://connectbyjbrh.com/docs/files-data/data-grid/"
      ]
    },
    {
      "id": "T0009",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/rag/",
      "markdown": "https://connectbyjbrh.com/docs/technology/rag/index.md",
      "title": "Retrieval-augmented generation",
      "description": "The retrieve-then-generate pattern, the failure modes nobody advertises, and a plain account of what Connect implements and what it deliberately does not.",
      "summary": "Retrieval-augmented generation means finding relevant material first and generating an answer from it, instead of asking a model to answer from what it learned in training. The pattern is a retrieval problem wearing a generation costume: almost every RAG system that disappoints does so because the retrieval step returned the wrong passage, not because the model wrote it badly.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/grounding/",
        "https://connectbyjbrh.com/docs/technology/knowledge-base/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/technology/context-window/",
        "https://connectbyjbrh.com/research/grounding-without-a-vector-database/"
      ]
    },
    {
      "id": "T0040",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/rate-limit/",
      "markdown": "https://connectbyjbrh.com/docs/technology/rate-limit/index.md",
      "title": "Rate limiting",
      "description": "Caps that protect a provider, a workspace and you: the algorithms behind them, and why a 429 is a message to your queue rather than to one request.",
      "summary": "A rate limit caps how much work a caller may cause in a period. You meet them in two directions — providers limit what Connect may send them, and Connect limits what a workspace may consume. A 429 is not a request-level problem to sleep off: it says the rate is wrong, so the fix is fewer requests in flight, not the same requests slightly later.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/retry/",
        "https://connectbyjbrh.com/docs/technology/circuit-breaker/",
        "https://connectbyjbrh.com/developers/api-rate-limits/",
        "https://connectbyjbrh.com/developers/api-errors/",
        "https://connectbyjbrh.com/docs/technology/query-cost/",
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "T0076",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/realtime-voice/",
      "markdown": "https://connectbyjbrh.com/docs/technology/realtime-voice/index.md",
      "title": "Realtime voice agents",
      "description": "How a speech-to-speech voice agent is actually assembled, what each part is responsible for, and the failure surface a live call exposes.",
      "summary": "A realtime voice agent holds a call directly: a speech-to-speech model listens and speaks at once, with no transcription-then-generation-then-speech pipeline in the middle. Connect runs one in production. The architecture that matters is not the model — it is what surrounds it, because everything that fails on a live call fails outside the model.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/speech-to-speech/",
        "https://connectbyjbrh.com/docs/technology/voice-latency/",
        "https://connectbyjbrh.com/docs/technology/turn-detection/",
        "https://connectbyjbrh.com/docs/technology/sip-trunk/",
        "https://connectbyjbrh.com/research/silent-failure/"
      ]
    },
    {
      "id": "T0096",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/relational-data/",
      "markdown": "https://connectbyjbrh.com/docs/technology/relational-data/index.md",
      "title": "Relational data modelling",
      "description": "Normalisation in plain terms, what a foreign key is really buying, and the three places this system keeps a second copy of something on purpose.",
      "summary": "Relational modelling is the discipline of keeping one fact in one place and letting keys join the rest together. The interesting part of any real schema is where it breaks that rule deliberately. Connect keeps mail twice — once as the provider stored it, once in canonical form — and snapshots settings onto records so a later change cannot rewrite what happened.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/postgresql/",
        "https://connectbyjbrh.com/docs/technology/row-level-security/",
        "https://connectbyjbrh.com/docs/technology/uuid-identifiers/",
        "https://connectbyjbrh.com/docs/technology/migrations/",
        "https://connectbyjbrh.com/docs/technology/multi-tenancy/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/technology/audit-log/"
      ]
    },
    {
      "id": "T0012",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/relationship-memory/",
      "markdown": "https://connectbyjbrh.com/docs/technology/relationship-memory/index.md",
      "title": "Relationship memory",
      "description": "Memory keyed to a person rather than to a conversation, why that key changes the answers, and what it takes to hold one identity across channels.",
      "summary": "Relationship memory attaches what is known to a person, not to a thread. The practical consequence is that a customer who emailed in March, rang in June and messaged on WhatsApp in September is one continuous relationship rather than three strangers — and the agent answering the September message can see what was promised in March.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/relationship-memory/",
        "https://connectbyjbrh.com/research/one-person-many-channels/",
        "https://connectbyjbrh.com/docs/technology/structured-memory/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "T0027",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/rest/",
      "markdown": "https://connectbyjbrh.com/docs/technology/rest/index.md",
      "title": "REST",
      "description": "The architectural style behind most web APIs, what its constraints actually buy, and the four places Connect departs from it on purpose.",
      "summary": "REST is a set of constraints, not a specification: address things as resources, use the uniform meaning of HTTP methods, keep the server stateless between requests, and send representations rather than internal objects. Connect's public API follows it closely enough that a generic client works. Several internal surfaces deliberately do not, and knowing which is which saves you from writing a client against the wrong shape.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/http/",
        "https://connectbyjbrh.com/docs/technology/json/",
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/developers/openapi-description/",
        "https://connectbyjbrh.com/developers/arazzo-workflows/",
        "https://connectbyjbrh.com/docs/technology/query-cost/",
        "https://connectbyjbrh.com/research/n-plus-one-that-grows/"
      ]
    },
    {
      "id": "T0039",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/retry/",
      "markdown": "https://connectbyjbrh.com/docs/technology/retry/index.md",
      "title": "Retries and backoff",
      "description": "Which failures deserve another attempt, which are already a final answer, and why backoff without jitter turns one outage into a second one.",
      "summary": "Retry only what is safe to repeat, and only when the failure suggests the request was never answered. Most 4xx responses are answers — a second identical request gets an identical refusal and adds load for nothing. Timeouts, connection failures and 5xx are worth another attempt, spaced by growing delays with randomness in them, under a deadline rather than a count.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/idempotency/",
        "https://connectbyjbrh.com/docs/technology/rate-limit/",
        "https://connectbyjbrh.com/docs/technology/circuit-breaker/",
        "https://connectbyjbrh.com/docs/technology/webhook/",
        "https://connectbyjbrh.com/developers/errors-and-retries/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "T0105",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/reversible-actions/",
      "markdown": "https://connectbyjbrh.com/docs/technology/reversible-actions/index.md",
      "title": "Reversible and irreversible actions",
      "description": "The three-way taxonomy an agent needs before it offers undo: what can be withdrawn, what can only be corrected, and what a person must approve first.",
      "summary": "Actions divide by whether anyone outside the system has already seen them. An internal change can be undone; an action a stranger has observed can only be followed by another action; a delivered message or a completed call is neither. An agent that cannot tell these apart either offers undo it cannot honour or asks permission for everything.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/approvals/",
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/how-to/recover-a-deleted-record/",
        "https://connectbyjbrh.com/docs/relationships/duplicates/"
      ]
    },
    {
      "id": "T0044",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/robots-txt/",
      "markdown": "https://connectbyjbrh.com/docs/technology/robots-txt/index.md",
      "title": "robots.txt",
      "description": "RFC 9309 in practice: what a robots file controls, the thing people wrongly believe it does, and how Connect serves its own.",
      "summary": "`/robots.txt` is a plain-text file at the root of a host that tells automated clients which paths they may fetch. Since 2022 it has been a standard, RFC 9309, rather than a convention. It controls **fetching**. It does not control indexing, it does not hide anything, and it is obeyed only by clients that choose to obey it.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/sitemap/",
        "https://connectbyjbrh.com/docs/technology/canonical-url/",
        "https://connectbyjbrh.com/developers/crawler-policy/",
        "https://connectbyjbrh.com/developers/bot-verification/",
        "https://connectbyjbrh.com/docs/technology/indexnow/"
      ]
    },
    {
      "id": "T0097",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/row-level-security/",
      "markdown": "https://connectbyjbrh.com/docs/technology/row-level-security/index.md",
      "title": "Row-level security",
      "description": "How a database enforces who may see which rows: the mechanism, why FORCE matters, the difference between USING and WITH CHECK, and what it cannot protect.",
      "summary": "Row-level security moves the *which rows may this connection touch* rule out of the application and into the table. The database then applies it to every query, including the one somebody wrote without a filter. Connect runs it forced on every workspace-scoped table, as the last of three independent isolation layers.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/rls/",
        "https://connectbyjbrh.com/docs/technology/postgresql/",
        "https://connectbyjbrh.com/docs/technology/multi-tenancy/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/technology/authorization-models/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/technology/encryption-at-rest/"
      ]
    },
    {
      "id": "T0073",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/rtp/",
      "markdown": "https://connectbyjbrh.com/docs/technology/rtp/index.md",
      "title": "RTP and media transport",
      "description": "How call audio really travels: small UDP packets, a jitter buffer that costs latency, and loss that is concealed rather than repaired.",
      "summary": "RTP carries the audio a caller hears, in small UDP packets — typically twenty milliseconds of sound each, fifty a second. Nothing is retransmitted, because a packet that arrives late has missed the moment it belonged to. Loss is concealed by inventing plausible audio, which is kinder to human ears than to a speech model.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/sip/",
        "https://connectbyjbrh.com/docs/technology/webrtc/",
        "https://connectbyjbrh.com/docs/technology/voice-latency/",
        "https://connectbyjbrh.com/docs/technology/call-quality/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/"
      ]
    },
    {
      "id": "T0100",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/secret-management/",
      "markdown": "https://connectbyjbrh.com/docs/technology/secret-management/index.md",
      "title": "Secret management",
      "description": "Where a credential should live, how rotation is supposed to work, and why a convenience copy of a rotated password becomes a fuse that blows at the next restart.",
      "summary": "A secret belongs in one place that owns it, is read at start-up or on demand, and is never written into source, a screen, or a log. Copies are the whole problem: a copy of a value that is being rotated elsewhere keeps working until the next restart, and then fails in a way that looks like a broken deploy rather than a stale credential.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/credential-rotation/",
        "https://connectbyjbrh.com/docs/security/credential-sealing/",
        "https://connectbyjbrh.com/docs/technology/encryption-at-rest/",
        "https://connectbyjbrh.com/docs/technology/oauth/",
        "https://connectbyjbrh.com/docs/security/public-vs-private/",
        "https://connectbyjbrh.com/docs/technology/postgresql/",
        "https://connectbyjbrh.com/research/stale-credentials/"
      ]
    },
    {
      "id": "T0094",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/sender-id/",
      "markdown": "https://connectbyjbrh.com/docs/technology/sender-id/index.md",
      "title": "Sender IDs",
      "description": "The four kinds of sender identity a recipient can see, why an alphanumeric name cannot be replied to, and what changing one costs you.",
      "summary": "A sender ID is whatever the recipient sees in the *from* position: a short name, a full telephone number, a short code, or a toll-free number. The choice decides whether anyone can reply, where your reputation accumulates, and whether you need to register in advance. Connect presents the business's own line on outbound calls rather than the individual's.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/dlt/",
        "https://connectbyjbrh.com/docs/technology/sms/",
        "https://connectbyjbrh.com/docs/technology/stop-keyword/",
        "https://connectbyjbrh.com/docs/security/number-ownership/",
        "https://connectbyjbrh.com/docs/phone/softphone/",
        "https://connectbyjbrh.com/docs/technology/did/",
        "https://connectbyjbrh.com/docs/technology/deliverability/"
      ]
    },
    {
      "id": "T0081",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/session-resumption/",
      "markdown": "https://connectbyjbrh.com/docs/technology/session-resumption/index.md",
      "title": "Session resumption",
      "description": "What a realtime model session is, why a server ends one mid-call, and how a resumption handle carries the conversation across the reconnect.",
      "summary": "A session is the model's side of a live call, and it can end while the call is still up: the server sends a going-away notice, a process restarts, a connection drops. Session resumption reconnects and hands the model back the conversation it already had, so the caller hears a pause instead of a new voice asking who they are. Connect uses it on the realtime voice path.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/context-compression/",
        "https://connectbyjbrh.com/docs/phone/session-limits/",
        "https://connectbyjbrh.com/docs/phone/realtime-engine/",
        "https://connectbyjbrh.com/docs/technology/retry/",
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/docs/technology/websocket/"
      ]
    },
    {
      "id": "T0032",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/sessions-cookies/",
      "markdown": "https://connectbyjbrh.com/docs/technology/sessions-cookies/index.md",
      "title": "Sessions and cookies",
      "description": "How a browser stays signed in between requests, which cookie attributes do the real work, and why holding one is not permission to do anything.",
      "summary": "HTTP forgets you between requests, so a cookie carries an opaque reference that the server looks up to find who is calling. The cookie is a bearer credential: whoever holds it is treated as that signed-in person, which is why its attributes matter and why every request is still checked against what that caller may actually do.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/oauth/",
        "https://connectbyjbrh.com/docs/technology/openid-connect/",
        "https://connectbyjbrh.com/docs/technology/https/",
        "https://connectbyjbrh.com/docs/technology/authorization-models/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/research/closed-by-default-facade/"
      ]
    },
    {
      "id": "T0037",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/sip-over-websocket/",
      "markdown": "https://connectbyjbrh.com/docs/technology/sip-over-websocket/index.md",
      "title": "SIP over WebSocket",
      "description": "Carrying call signalling into a browser that cannot open a UDP socket: registration, what keeps it alive, and the addressing mistakes that fail silently.",
      "summary": "A browser cannot open the raw sockets ordinary SIP uses, so SIP is carried inside a WebSocket with the `sip` subprotocol. The browser registers with a registrar over that connection, receives and places calls through it, and hands the audio to WebRTC. Connect's softphone works this way: a person's own line is a `channel_routes` row with `channel='softphone'`.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/sip/",
        "https://connectbyjbrh.com/docs/technology/websocket/",
        "https://connectbyjbrh.com/docs/technology/webrtc/",
        "https://connectbyjbrh.com/docs/technology/sip-trunk/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/technology/call-routing/",
        "https://connectbyjbrh.com/research/provider-independent-telephony/"
      ]
    },
    {
      "id": "T0074",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/sip-trunk/",
      "markdown": "https://connectbyjbrh.com/docs/technology/sip-trunk/index.md",
      "title": "SIP trunks",
      "description": "Inbound and outbound SIP trunks: what an origination URI is, what a dispatch rule decides, and the configuration mistakes that fail silently.",
      "summary": "A SIP trunk is a standing relationship between two systems that carries many calls at once. An inbound trunk tells a carrier where to deliver calls for your numbers; an outbound trunk is how you hand calls back to the network. Connect's realtime voice path arrives over an inbound trunk, and a dispatch rule decides which worker meets the call.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/sip/",
        "https://connectbyjbrh.com/docs/technology/did/",
        "https://connectbyjbrh.com/docs/technology/carrier/",
        "https://connectbyjbrh.com/docs/technology/realtime-voice/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "T0072",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/sip/",
      "markdown": "https://connectbyjbrh.com/docs/technology/sip/index.md",
      "title": "SIP",
      "description": "Signalling for calls: SIP methods and responses, why it carries no audio, what registration binds, and what a host:5060 URI means.",
      "summary": "SIP sets up, changes and tears down calls. It is a text protocol that looks like HTTP and carries no audio at all — it negotiates where the audio will go, and RTP carries it separately. Connect uses SIP in two places: the inbound trunk that delivers realtime calls, and the browser softphone, which registers over SIP inside a WebSocket.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/sip-trunk/",
        "https://connectbyjbrh.com/docs/technology/rtp/",
        "https://connectbyjbrh.com/docs/technology/sip-over-websocket/",
        "https://connectbyjbrh.com/docs/technology/webrtc/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "T0045",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/sitemap/",
      "markdown": "https://connectbyjbrh.com/docs/technology/sitemap/index.md",
      "title": "XML sitemaps",
      "description": "XML sitemaps as a discovery aid: what belongs in one, why lastmod must be true, and when an index file becomes necessary.",
      "summary": "An XML sitemap is a list of URLs you consider worth crawling, with optional metadata about each. It helps a crawler find pages that links alone would reach slowly or not at all. It is a suggestion, not an instruction: nothing in a sitemap is guaranteed to be crawled, and nothing absent from one is excluded.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/robots-txt/",
        "https://connectbyjbrh.com/docs/technology/indexnow/",
        "https://connectbyjbrh.com/docs/technology/canonical-url/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/research/documentation-as-a-build/"
      ]
    },
    {
      "id": "T0091",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/sms/",
      "markdown": "https://connectbyjbrh.com/docs/technology/sms/index.md",
      "title": "SMS",
      "description": "How the short message service actually works: the 140-octet payload, the alphabets, what concatenation costs, and why one emoji halves your message.",
      "summary": "SMS carries at most 140 octets per message, which is 160 characters in its own seven-bit alphabet and 70 in the sixteen-bit one any non-Latin script forces. Longer text is split, billed and delivered as several segments. In Connect the inbound half works and outbound is **foundation**: it depends entirely on the configured provider, and the carrier on the live account carries no SMS at all.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/inbound-sms/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
        "https://connectbyjbrh.com/docs/technology/dlt/",
        "https://connectbyjbrh.com/docs/technology/sender-id/",
        "https://connectbyjbrh.com/docs/technology/stop-keyword/",
        "https://connectbyjbrh.com/docs/technology/unicode-and-scripts/",
        "https://connectbyjbrh.com/docs/sms/sms-dedupe/"
      ]
    },
    {
      "id": "T0053",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/smtp/",
      "markdown": "https://connectbyjbrh.com/docs/technology/smtp/index.md",
      "title": "SMTP",
      "description": "The protocol that moves mail between servers: envelope versus headers, what a 250 response proves, and the states after it.",
      "summary": "SMTP is the protocol one mail server uses to hand a message to another. A client connects, names the sender and the recipients, offers the message, and gets a numeric reply. A `250` means the receiving server has taken responsibility for the message. It does not mean delivered, it does not mean in the inbox, and it certainly does not mean read.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/imap/",
        "https://connectbyjbrh.com/docs/technology/mime/",
        "https://connectbyjbrh.com/docs/technology/spf/",
        "https://connectbyjbrh.com/docs/technology/bounce/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "T0022",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/speech-to-speech/",
      "markdown": "https://connectbyjbrh.com/docs/technology/speech-to-speech/index.md",
      "title": "Speech-to-speech models",
      "description": "A model that takes audio in and gives audio back, with no synthesiser in the loop: what that buys on a call, and what it takes away.",
      "summary": "A speech-to-speech model hears the caller's audio and answers in audio directly, with no recogniser and no synthesiser in between. That removes two hops of delay and keeps the tone of the reply attached to its meaning. The cost is control: the words are decided as they are spoken, the transcript becomes a by-product rather than the input, and the voice is a property of the model rather than something you choose afterwards.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/tts/",
        "https://connectbyjbrh.com/docs/technology/asr/",
        "https://connectbyjbrh.com/docs/technology/realtime-voice/",
        "https://connectbyjbrh.com/docs/technology/barge-in/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/research/silent-failure/"
      ]
    },
    {
      "id": "T0059",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/spf/",
      "markdown": "https://connectbyjbrh.com/docs/technology/spf/index.md",
      "title": "SPF",
      "description": "Sender Policy Framework: the DNS record that authorises sending hosts, the ten-lookup limit, and the claim SPF cannot make.",
      "summary": "SPF is a DNS TXT record on your domain listing the hosts permitted to send mail using it as the **envelope** sender. A receiving server checks the connecting address against that list and gets a pass, a fail or a softer verdict. It authorises a route, not a person, and it says nothing about the `From:` line a reader sees.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/dkim/",
        "https://connectbyjbrh.com/docs/technology/dmarc/",
        "https://connectbyjbrh.com/docs/technology/smtp/",
        "https://connectbyjbrh.com/docs/technology/deliverability/",
        "https://connectbyjbrh.com/docs/technology/dns/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "T0034",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/sse/",
      "markdown": "https://connectbyjbrh.com/docs/technology/sse/index.md",
      "title": "Server-sent events",
      "description": "A single long-lived HTTP response that the server keeps writing to: how it streams updates one way, and why Connect uses it rather than WebSocket.",
      "summary": "Server-sent events is one HTTP response that never ends. The client makes an ordinary request, the server holds it open and writes `text/event-stream` records as things happen, and the browser reassembles them into events. It goes one way only — server to client — and it reconnects by itself. Connect's app uses it for its own event stream.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/websocket/",
        "https://connectbyjbrh.com/docs/technology/http/",
        "https://connectbyjbrh.com/docs/technology/sip-over-websocket/",
        "https://connectbyjbrh.com/developers/asyncapi-events/",
        "https://connectbyjbrh.com/developers/webhooks-vs-polling/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "T0092",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/stop-keyword/",
      "markdown": "https://connectbyjbrh.com/docs/technology/stop-keyword/index.md",
      "title": "STOP and opt-out keywords",
      "description": "The opt-out words a recipient may send, what honouring one actually requires, and why your suppression list and the operator's can quietly disagree.",
      "summary": "A recipient can end messaging by replying with a single word — STOP is the one everybody knows, and several others are treated the same way. Honouring it means stopping immediately, at most confirming once, and remembering it permanently. Connect handles inbound opt-out on SMS and records it as a suppression that outlives the conversation it arrived in.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/stop/",
        "https://connectbyjbrh.com/docs/sms/sms-suppression/",
        "https://connectbyjbrh.com/docs/technology/suppression/",
        "https://connectbyjbrh.com/docs/technology/unsubscribe/",
        "https://connectbyjbrh.com/docs/whatsapp/opt-out/",
        "https://connectbyjbrh.com/docs/technology/sms/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "T0011",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/structured-memory/",
      "markdown": "https://connectbyjbrh.com/docs/technology/structured-memory/index.md",
      "title": "Structured memory",
      "description": "Keeping what an agent knows as records rather than as conversation history, and the operations that only become possible once you do.",
      "summary": "Structured memory means storing what is known as typed records — a fact with a scope, an owner and a tag — instead of keeping a transcript and re-reading it. The difference is not storage efficiency. It is that a record can be queried, corrected, scoped, audited and deleted, and a transcript can only be searched and re-read.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/research/structured-business-memory/",
        "https://connectbyjbrh.com/docs/technology/relationship-memory/",
        "https://connectbyjbrh.com/docs/technology/context-window/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "T0065",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/suppression/",
      "markdown": "https://connectbyjbrh.com/docs/technology/suppression/index.md",
      "title": "Suppression lists",
      "description": "The list that outranks every campaign: what belongs on a suppression list, what does not, and why entries must be hard to remove.",
      "summary": "A suppression list is the record of addresses that must not be contacted, checked at send time rather than when a list is built. Connect checks suppression, unsubscribe, complaints and do-not-contact in one place before any outreach leaves, and the Connect Assistant cannot clear a do-not-contact entry — removing one is a human decision on purpose.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/unsubscribe/",
        "https://connectbyjbrh.com/docs/technology/feedback-loop/",
        "https://connectbyjbrh.com/docs/technology/bounce/",
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "T0005",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/tool-calling/",
      "markdown": "https://connectbyjbrh.com/docs/technology/tool-calling/index.md",
      "title": "Tool calling",
      "description": "How a model asks for an action it cannot perform itself, what the schema is really doing, and the checks a tool must run before it changes anything.",
      "summary": "Tool calling is the mechanism by which a language model, which can only produce text, causes something to happen. The application publishes a list of named functions with typed arguments; the model returns a request to call one; the application runs it, validates everything, and hands the result back as more context. The model never touches the database, the mailbox or the phone line.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/technology/json-schema/",
        "https://connectbyjbrh.com/docs/technology/ai-agent/",
        "https://connectbyjbrh.com/research/agent-tools-call-services/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "T0068",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/transactional-vs-marketing/",
      "markdown": "https://connectbyjbrh.com/docs/technology/transactional-vs-marketing/index.md",
      "title": "Transactional and marketing email",
      "description": "Why the transactional and marketing distinction governs consent, how a single hybrid message destroys it, and what Connect separates instead.",
      "summary": "A transactional message is about something the recipient did — an order, a reset, an appointment. A marketing message promotes. The distinction matters because consent rules, opt-out obligations and sending infrastructure all hang off it, and because it is decided by the content of the message, not by which system happened to send it.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/unsubscribe/",
        "https://connectbyjbrh.com/docs/technology/suppression/",
        "https://connectbyjbrh.com/docs/technology/deliverability/",
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/docs/prospects/"
      ]
    },
    {
      "id": "T0023",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/tts/",
      "markdown": "https://connectbyjbrh.com/docs/technology/tts/index.md",
      "title": "Text to speech",
      "description": "Turning written words into speech: where a synthesiser still earns its place on a realtime call, and the three things it cannot do.",
      "summary": "Text-to-speech takes wording you have already decided and speaks it. That is its whole advantage: the sentence is fixed before any audio exists, so it can be prepared early and played exactly. Connect synthesises the greeting with Google Text-to-Speech and plays it while the line is still connecting; the rest of a realtime call is spoken by the speech-to-speech model, not by a synthesiser.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/speech-to-speech/",
        "https://connectbyjbrh.com/docs/technology/voice-profile/",
        "https://connectbyjbrh.com/docs/technology/multilingual-voice/",
        "https://connectbyjbrh.com/docs/technology/barge-in/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/barge-in-without-cutting-the-greeting/"
      ]
    },
    {
      "id": "T0078",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/turn-detection/",
      "markdown": "https://connectbyjbrh.com/docs/technology/turn-detection/index.md",
      "title": "End-of-turn detection",
      "description": "Deciding that a caller has finished rather than paused: silence timers against semantic endpointing, and why this dominates perceived latency.",
      "summary": "End-of-turn detection decides whether a silence means 'your go' or 'I am thinking'. It is added to every reply before the model begins, which makes it the largest controllable term in how fast a voice agent feels. Connect's fastest setting waits 450 ms of silence, and a semantic path exists that varies the wait by what was said.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/vad/",
        "https://connectbyjbrh.com/docs/technology/barge-in/",
        "https://connectbyjbrh.com/docs/technology/voice-latency/",
        "https://connectbyjbrh.com/docs/technology/voice-profile/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "T0116",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/unicode-and-scripts/",
      "markdown": "https://connectbyjbrh.com/docs/technology/unicode-and-scripts/index.md",
      "title": "Unicode, scripts and transliteration",
      "description": "Why a language and a writing system are different things, what normalisation and collation actually decide, and how both show up in a call transcript.",
      "summary": "A language is what somebody speaks; a script is the set of characters it is written in. One language can be written in several scripts and one script carries many languages, so a transcript of the same conversation can come back in different characters without the language having changed. Text comparison has to account for that, and naive comparison does not.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/multilingual-voice/",
        "https://connectbyjbrh.com/docs/technology/call-transcript/",
        "https://connectbyjbrh.com/docs/technology/asr/",
        "https://connectbyjbrh.com/docs/glossary/identity/",
        "https://connectbyjbrh.com/docs/technology/uuid-identifiers/"
      ]
    },
    {
      "id": "T0066",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/unsubscribe/",
      "markdown": "https://connectbyjbrh.com/docs/technology/unsubscribe/index.md",
      "title": "One-click unsubscribe",
      "description": "The List-Unsubscribe headers, what a one-click POST must not do, and the gap between honouring an opt-out and advertising one.",
      "summary": "One-click unsubscribe is a pair of headers that let a mail client show its own unsubscribe control and act on it with a single POST — no landing page, no login, no confirmation step. The largest mailbox providers require it of bulk senders. Connect enforces the honouring side; adding the header to a message is the sending mailbox's business, not something these sources document Connect doing.",
      "status": "reference",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/suppression/",
        "https://connectbyjbrh.com/docs/technology/transactional-vs-marketing/",
        "https://connectbyjbrh.com/docs/technology/feedback-loop/",
        "https://connectbyjbrh.com/docs/technology/stop-keyword/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "T0120",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/uuid-identifiers/",
      "markdown": "https://connectbyjbrh.com/docs/technology/uuid-identifiers/index.md",
      "title": "Identifiers",
      "description": "UUIDs, sequential keys and opaque identifiers compared, and the rule that saves the most trouble later: never parse an identifier you were given.",
      "summary": "An identifier's job is to name one row and keep naming it. Everything else people ask of one — sortability, guessability, a hint about what it points at — trades against that job. The rule worth adopting early is that an identifier is opaque: pass it back unchanged, compare it exactly, and never read meaning out of its shape.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/glossary/identity/",
        "https://connectbyjbrh.com/docs/technology/relational-data/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/technology/idempotency/",
        "https://connectbyjbrh.com/docs/technology/unicode-and-scripts/"
      ]
    },
    {
      "id": "T0077",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/vad/",
      "markdown": "https://connectbyjbrh.com/docs/technology/vad/index.md",
      "title": "Voice activity detection",
      "description": "Voice activity detection decides one thing — speech or not speech — and the choice of where it runs shapes what a voice agent can react to.",
      "summary": "Voice activity detection answers a single question, thousands of times a minute: is this fragment of audio speech? It does not decide whether someone has finished talking — that is a different job. Connect runs it in two places at once, because the model provider's own detection misses speech starts that the host needs to see.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/turn-detection/",
        "https://connectbyjbrh.com/docs/technology/barge-in/",
        "https://connectbyjbrh.com/docs/technology/realtime-voice/",
        "https://connectbyjbrh.com/docs/technology/asr/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/"
      ]
    },
    {
      "id": "T0106",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/versioning/",
      "markdown": "https://connectbyjbrh.com/docs/technology/versioning/index.md",
      "title": "Versioning",
      "description": "Three problems that share one word: versioning a document, versioning a record, and versioning an interface other people have already built against.",
      "summary": "Versioning a document, a record and an API are three different problems. A document keeps whole snapshots. A record keeps a current value plus the history of what it replaced. An interface keeps a promise to callers you cannot contact. Applying one of those solutions to another's problem is the usual source of trouble.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/memory/superseding/",
        "https://connectbyjbrh.com/docs/protocols/openapi/",
        "https://connectbyjbrh.com/docs/product/versions/",
        "https://connectbyjbrh.com/docs/technology/migrations/"
      ]
    },
    {
      "id": "T0113",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/virtualised-rendering/",
      "markdown": "https://connectbyjbrh.com/docs/technology/virtualised-rendering/index.md",
      "title": "Virtualised rendering",
      "description": "Drawing only the rows a screen can show, the four things that break when you do, and why virtualising the view never fixes an unbounded query.",
      "summary": "Virtualised rendering draws only the rows currently visible, plus a small margin, and reuses that handful of elements as you scroll. It is how a grid stays responsive at thousands of rows. What it costs is everything that assumed the whole list was present: find-in-page, screen readers, selection across a scroll, and naive keyboard navigation.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/technology/query-cost/",
        "https://connectbyjbrh.com/docs/files-data/data-sorting-grouping/",
        "https://connectbyjbrh.com/docs/files-data/data-mobile/",
        "https://connectbyjbrh.com/docs/technology/accessibility/"
      ]
    },
    {
      "id": "T0080",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/voice-latency/",
      "markdown": "https://connectbyjbrh.com/docs/technology/voice-latency/index.md",
      "title": "Voice latency",
      "description": "Where the seconds go on a voice call: the measured components, the floor no setting removes, and why a transcript is the wrong place to measure from.",
      "summary": "The gap before a voice agent answers is made of a few large terms and many small ones. On Connect's realtime engine the default model reaches first audio in 0.6 s, the best measured call had a 3.3 s median reply, and the review treats 2.5 s as the target and 4 s as slow. Some of that gap has no setting behind it at all.",
      "status": "reference",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/docs/technology/turn-detection/",
        "https://connectbyjbrh.com/docs/technology/realtime-voice/",
        "https://connectbyjbrh.com/research/model-limited-findings/"
      ]
    },
    {
      "id": "T0084",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/voice-profile/",
      "markdown": "https://connectbyjbrh.com/docs/technology/voice-profile/index.md",
      "title": "Voice profiles",
      "description": "How a voice profile splits into session parameters the engine enforces and written directions the model only approximates, and which setting wins.",
      "summary": "A voice profile is one named set of settings deciding how a line sounds and behaves. Half of it becomes session parameters the engine enforces exactly — model, voice, silence timers, interruption thresholds. The other half becomes written directions the model follows approximately — pace, warmth, fillers, formality. Connect labels every control with which of the two it is, because a slider that only asks is not a slider that sets.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-lab/",
        "https://connectbyjbrh.com/docs/phone/human-voice-profiles/",
        "https://connectbyjbrh.com/docs/technology/tts/",
        "https://connectbyjbrh.com/docs/technology/speech-to-speech/",
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/docs/technology/multilingual-voice/"
      ]
    },
    {
      "id": "T0087",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/webhook-signature/",
      "markdown": "https://connectbyjbrh.com/docs/technology/webhook-signature/index.md",
      "title": "Provider webhook signatures",
      "description": "How a provider signs a webhook, how to verify one without introducing a hole, and why a valid signature still does not stop the same event arriving twice.",
      "summary": "A webhook signature is a keyed hash the sender computes over the exact bytes it sends, so the receiver can prove the request came from someone holding the shared secret and was not altered on the way. It proves origin and integrity. It does not prove freshness, uniqueness or permission — replay protection is a separate mechanism, and Connect stores a nonce under a unique index to get it.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/webhook-verification/",
        "https://connectbyjbrh.com/docs/technology/webhook/",
        "https://connectbyjbrh.com/docs/technology/idempotency/",
        "https://connectbyjbrh.com/developers/webhook-signatures/",
        "https://connectbyjbrh.com/docs/technology/https/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
        "https://connectbyjbrh.com/docs/technology/call-routing/"
      ]
    },
    {
      "id": "T0033",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/webhook/",
      "markdown": "https://connectbyjbrh.com/docs/technology/webhook/index.md",
      "title": "Webhooks",
      "description": "A provider calling you when something happens: verifying the sender, answering fast, and building a receiver that survives the same event arriving twice.",
      "summary": "A webhook is an HTTP request a provider makes to a URL you gave it, when something happens on their side. It replaces polling and it inverts the reliability problem: you no longer control when the call arrives, how often it repeats, or in what order. A receiver that verifies the sender, answers immediately and tolerates duplicates is correct; one that does any of those loosely will lose events or process them twice.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/webhook-signature/",
        "https://connectbyjbrh.com/docs/technology/idempotency/",
        "https://connectbyjbrh.com/docs/technology/retry/",
        "https://connectbyjbrh.com/developers/webhooks-vs-polling/",
        "https://connectbyjbrh.com/developers/webhooks-outbound/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/"
      ]
    },
    {
      "id": "T0036",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/webrtc/",
      "markdown": "https://connectbyjbrh.com/docs/technology/webrtc/index.md",
      "title": "WebRTC",
      "description": "How a browser sends and receives call audio directly: the media path, why signalling is not part of it, and the security policy that does not reach it.",
      "summary": "WebRTC is the browser's real-time media stack. It captures the microphone, negotiates a route to the far end, and carries encrypted audio directly over that route rather than through the application server. It carries the softphone's audio in Connect. What it deliberately does not include is signalling — deciding who to call and when — which SIP over WebSocket handles.",
      "status": "reference",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/sip-over-websocket/",
        "https://connectbyjbrh.com/docs/technology/rtp/",
        "https://connectbyjbrh.com/docs/technology/csp/",
        "https://connectbyjbrh.com/docs/technology/websocket/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/technology/call-quality/",
        "https://connectbyjbrh.com/research/silent-failure/"
      ]
    },
    {
      "id": "T0035",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/websocket/",
      "markdown": "https://connectbyjbrh.com/docs/technology/websocket/index.md",
      "title": "WebSocket",
      "description": "A two-way connection that starts as an HTTP request and stops being HTTP: the one place Connect uses it, and the reason it is not used anywhere else.",
      "summary": "A WebSocket begins as an HTTP request asking to upgrade, and after the handshake it is no longer HTTP: it is a two-way frame channel over one connection, with no methods, no status codes and no per-message headers. Connect uses it in exactly one place — SIP signalling for the browser softphone — and deliberately not for its own application data, which streams over server-sent events instead.",
      "status": "reference",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/technology/sse/",
        "https://connectbyjbrh.com/docs/technology/sip-over-websocket/",
        "https://connectbyjbrh.com/docs/technology/webrtc/",
        "https://connectbyjbrh.com/docs/technology/http/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/technology/agent-security/"
      ]
    },
    {
      "id": "T0089",
      "kind": "technology",
      "url": "https://connectbyjbrh.com/docs/technology/whatsapp-business/",
      "markdown": "https://connectbyjbrh.com/docs/technology/whatsapp-business/index.md",
      "title": "WhatsApp Business messaging",
      "description": "How business messaging on WhatsApp actually works: the 24-hour window, pre-approved templates, opt-in, and Meta's coexistence route for a number already on a phone.",
      "summary": "Business messaging on WhatsApp is built around one rule: a customer's message opens a window during which a business may write freely, and outside that window it may send only messages whose wording was approved in advance. Everything else — templates, categories, opt-in, quality ratings — follows from that. Connect works directly against Meta, and a workspace connects its number either with its own Meta app or through Meta's QR-linked coexistence route.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/channel-setup/",
        "https://connectbyjbrh.com/docs/whatsapp/inbound-webhook/",
        "https://connectbyjbrh.com/docs/whatsapp/whatsapp-limits/",
        "https://connectbyjbrh.com/docs/whatsapp/opt-out/",
        "https://connectbyjbrh.com/docs/technology/message-status/",
        "https://connectbyjbrh.com/docs/whatsapp/whatsapp-follow-up/",
        "https://connectbyjbrh.com/docs/autonomy/modes/"
      ]
    },
    {
      "id": "E0077",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/index.md",
      "title": "Troubleshooting",
      "description": "The index of documented failures, plus how to read a page here: what each one promises, the three questions to answer first, and what is never printed.",
      "summary": "Every page in this section answers the same eight questions in the same order, and two of them matter more than the rest: what Connect completed, and what it did not complete. Find your symptom in the index below. If it is not there, the three questions in the next section separate a fault from a setting more often than any single page does.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/incident-review/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/getting-started/",
        "https://connectbyjbrh.com/docs/troubleshooting/screen-empty/",
        "https://connectbyjbrh.com/research/invisible-not-missing/"
      ]
    },
    {
      "id": "E0074",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/403-on-a-screen/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/403-on-a-screen/index.md",
      "title": "A screen returned 403",
      "description": "A screen refuses with 403 for one audience and works for the other: which of the two boundaries refused, how to tell, and what to report.",
      "summary": "Two separate boundaries answer 403, and they fail for different reasons: the browser-side rewrite that turns an operator path into a customer one refuses anything it does not recognise, and the allowlist in front of the API refuses a path a customer session may not call. Both are working as designed. What is usually broken is that the capability has no customer route yet.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/customer-facade/",
        "https://connectbyjbrh.com/docs/workflows/owner-tenant-routing/",
        "https://connectbyjbrh.com/docs/troubleshooting/permission-denied/",
        "https://connectbyjbrh.com/docs/troubleshooting/session-expired/",
        "https://connectbyjbrh.com/research/closed-by-default-facade/"
      ]
    },
    {
      "id": "E0007",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/after-hours-call/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/after-hours-call/index.md",
      "title": "A caller reached the closed-line message",
      "description": "A caller heard the closed-line message instead of the voice: why that is the line working, what the message says and does not say, and how to change it.",
      "summary": "The line refused the call on purpose, because it is switched off, outside its hours, or over its budget. The caller heard a short spoken message in the business's own name and the call ended with a reason on the record. This is the designed behaviour: the alternative, which this replaced, was a caller hearing the call connect and drop with no record of it anywhere.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/first-phone-setup/",
        "https://connectbyjbrh.com/docs/workflows/inbound-phone-call/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-answered-in-silence/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0072",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/allowance-reached/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/allowance-reached/index.md",
      "title": "The allowance is spent",
      "description": "A daily counter is spent. What keeps running, what is held rather than dropped, and the four things a person can genuinely do about it today.",
      "summary": "One counter is spent, not all of them. Each metered dimension has its own daily number, so reaching the sending limit stops sending and leaves ingest and everything else alone. The work that could not proceed is held rather than discarded, it appears in Needs You as a refusal, and the counter resets at midnight UTC — 05:30 IST.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/usage/",
        "https://connectbyjbrh.com/docs/account/entitlements/",
        "https://connectbyjbrh.com/docs/workflows/allowance-enforcement/",
        "https://connectbyjbrh.com/docs/workflows/quota-refusal/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/troubleshooting/plan-lapsed/"
      ]
    },
    {
      "id": "E0061",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/approval-not-appearing/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/approval-not-appearing/index.md",
      "title": "The approval is not in the queue",
      "description": "You are waiting for something to approve and the queue does not have it. The two states that look exactly like absence, and the four other reasons.",
      "summary": "Two states look identical to a missing approval: the action was never queued, because `draft_only` prepares without asking; or there was never an approval to queue, because a gate refused the action outright. Both are visible in the decision log, which is the screen that separates 'held silently' from 'refused' from 'already decided by somebody else'.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-sending/",
        "https://connectbyjbrh.com/docs/troubleshooting/unexpected-autonomous-action/",
        "https://connectbyjbrh.com/docs/account/workspace-resolution/"
      ]
    },
    {
      "id": "E0050",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/assistant-missing/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/assistant-missing/index.md",
      "title": "The Assistant is not on screen",
      "description": "The Assistant launcher or panel is not where it should be: the two layout causes, the one session cause, and how to tell them apart in under a minute.",
      "summary": "Three things make the Assistant look gone, and only one of them is a fault. Something is drawn on top of the launcher; a size remembered from a wider window has put the panel where you cannot see it; or the session has expired and the panel cannot open at all. A reload settles the first two. The third needs you to sign in again.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/opening/",
        "https://connectbyjbrh.com/docs/assistant/assistant-responsive/",
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/research/invisible-ui-defects/"
      ]
    },
    {
      "id": "E0051",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/assistant-refused/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/assistant-refused/index.md",
      "title": "The Assistant refused to do it",
      "description": "The Assistant declined to do something you asked: the four kinds of refusal — authority, autonomy, evidence and plan — and which of them a person can lift.",
      "summary": "A refusal is one of four things, and they need different responses. The Assistant lacks the authority; the channel's autonomy rule says a person decides; the evidence a rule requires is missing; or it could not form a plan from what you said. Only the last is about your wording. The first cannot be lifted at all — a person has to act instead.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/assistant-authority/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/assistant/uncertainty/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/research/authority-separation/"
      ]
    },
    {
      "id": "E0053",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/assistant-stuck/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/assistant-stuck/index.md",
      "title": "The Assistant stopped responding",
      "description": "The Assistant stops mid-answer or never starts: separating a dropped stream from a provider limit from a spent AI budget, and what each one needs.",
      "summary": "Three different faults look identical from the outside. The stream between the browser and the app dropped; the model provider refused or throttled the call; or the workspace's AI budget is spent. The status line tells them apart: a half-written answer is a stream, a long `Understanding…` with no steps is the provider, and a refusal naming the budget is the budget.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/live-stream/",
        "https://connectbyjbrh.com/docs/assistant/executing-actions/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/research/model-limited-findings/"
      ]
    },
    {
      "id": "E0052",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/assistant-wrong-context/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/assistant-wrong-context/index.md",
      "title": "The Assistant answered about the wrong record",
      "description": "An answer about a record you were not asking about: how screen context is claimed and checked, what a pinned record overrides, and how to reset both.",
      "summary": "The Assistant is told which screen you are on and which record is pinned to the tab, and it checks that claim against the database before trusting it. An answer about the wrong record almost always means the pin is older than your attention: you moved on, the tab did not. Clearing the pin, or naming the record in the question, fixes it immediately.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/screen-context/",
        "https://connectbyjbrh.com/docs/assistant/record-context/",
        "https://connectbyjbrh.com/docs/workflows/assistant-context-check/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/"
      ]
    },
    {
      "id": "E0092",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/audit-entry-missing/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/audit-entry-missing/index.md",
      "title": "There is no audit entry for something",
      "description": "No audit entry for something that clearly happened: which of Connect's three self-records holds it, what the audit trail deliberately excludes, and what an absence proves.",
      "summary": "Connect keeps three records of itself and they answer different questions. The audit trail holds only the consequential actions — the ones with money, data, access or irreversibility attached. Ordinary work lives in the activity record, and failures live in the diagnostic trail. An absence from one is not an absence from all three.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/incident-review/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/derived-control-state/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/docs/troubleshooting/cannot-delete/"
      ]
    },
    {
      "id": "E0084",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/budget-exhausted/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/budget-exhausted/index.md",
      "title": "The AI budget is spent",
      "description": "The AI spend ceiling has been reached. What stops immediately, what carries on untouched, and the sentence a caller hears instead of a conversation.",
      "summary": "A spent AI budget stops new model work and nothing else. Stored data stays readable, inbound messages are still received and kept, and a person can still send by hand. On the phone the effect is visible immediately: outbound calls are not placed, and an inbound caller is answered, told the line is closed in the business's own voice, and recorded.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/budget-guard/",
        "https://connectbyjbrh.com/docs/phone/voice-budget/",
        "https://connectbyjbrh.com/docs/troubleshooting/model-unavailable/",
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-cost-surprise/",
        "https://connectbyjbrh.com/docs/workflows/usage-metering/"
      ]
    },
    {
      "id": "E0002",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/call-answered-in-silence/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/call-answered-in-silence/index.md",
      "title": "The call connected and nobody spoke",
      "description": "The call connected and nothing was said: the greeting failure that used to read as caller abandonment, how it is recorded now, and what to check.",
      "summary": "The call was answered and the opening line could not be spoken. Rather than leaving the caller in silence, the engine now records a greeting failure, ends the call and marks the record as a silent failure with an outcome that says the caller was never reached. Before that, five such calls were filed as \"the caller hung up before speaking\", which is the opposite of what happened.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/greeting-too-slow/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-never-rang/",
        "https://connectbyjbrh.com/research/silent-failure/",
        "https://connectbyjbrh.com/docs/workflows/call-recovery/",
        "https://connectbyjbrh.com/docs/workflows/inbound-phone-call/"
      ]
    },
    {
      "id": "E0097",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/call-audio-quality/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/call-audio-quality/index.md",
      "title": "The call sounded bad",
      "description": "When a call sounded bad: separating band-limited telephone audio from network trouble, turn-taking faults and delivery, and what Connect can actually measure.",
      "summary": "Four different complaints arrive as 'the call sounded bad', and they have different causes: audio that is narrow because telephone audio is narrow, audio that breaks up because of the network, a voice that seems to cut people off, and a voice that sounds wrong rather than broken. Connect measures timing and turn-taking on the wire; it does not measure the network leg, and there is no recording on the live carrier to listen back to.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/connect-voice-tts/",
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/docs/phone/softphone/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/docs/troubleshooting/voice-cut-the-caller/"
      ]
    },
    {
      "id": "E0014",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/call-cost-surprise/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/call-cost-surprise/index.md",
      "title": "A call cost more than expected",
      "description": "Why a voice minute costs more than a text minute: audio token rates, context re-billed every turn, restarts, swept calls and calls that report no tokens.",
      "summary": "A live call is billed on audio tokens, which cost several times what the same model charges for text, and a realtime session is re-billed for the whole context it carries on every single turn. On production calls, 92% of the input tokens are carried context rather than anything new. A long call is therefore not linear in its length, and that is the usual surprise.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/docs/phone/voice-budget/",
        "https://connectbyjbrh.com/docs/phone/session-limits/",
        "https://connectbyjbrh.com/docs/phone/stuck-calls/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/docs/phone/phone-owner-tenant/"
      ]
    },
    {
      "id": "E0008",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/call-cut-short/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/call-cut-short/index.md",
      "title": "The call ended early",
      "description": "The call ended before the conversation did: how to tell a product ceiling, a session limit, a silence watcher and a carrier hang-up apart from each other.",
      "summary": "Read the attribution first. Every ending is attributed to one of six actors — the caller, the model, the owner, the engine, the carrier or an agent — and that single field distinguishes a call that hit the 30-minute ceiling from one the carrier dropped, a silence watcher closing an abandoned line from a model session that failed. Duration alone tells you almost nothing.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/model-session-failed/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-answered-in-silence/",
        "https://connectbyjbrh.com/docs/workflows/call-recovery/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-audio-quality/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "E0004",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/call-never-rang/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/call-never-rang/index.md",
      "title": "The call never rang",
      "description": "An outbound call recorded as never reached: how it differs from nobody answering, which of the dial, the dispatch or the worker failed, and what to do about each.",
      "summary": "The record says the call never rang, which is a different fact from nobody picking up. Something before the ring failed: the dial at the carrier, the dispatch that should have put a worker on the call, or the worker itself. No lead is created from it and no conclusion should be drawn about the person called — this is an operational failure, not a signal about them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/outbound-phone-call/",
        "https://connectbyjbrh.com/docs/troubleshooting/phone-worker-unavailable/",
        "https://connectbyjbrh.com/docs/troubleshooting/model-session-failed/",
        "https://connectbyjbrh.com/docs/workflows/call-recovery/",
        "https://connectbyjbrh.com/docs/follow-ups/"
      ]
    },
    {
      "id": "E0096",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/cannot-delete/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/cannot-delete/index.md",
      "title": "Something will not delete",
      "description": "Something refuses to be removed: what Connect protects and why, which removals are marks rather than erasures, and what to do instead of deleting.",
      "summary": "Three kinds of thing resist removal, for three different reasons: the accountability trail, because a record you can erase proves nothing; entries that protect somebody, such as a do-not-contact instruction; and anything with history hanging off it, which is marked rather than erased so the history survives. Only the first is absolute.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/data-request/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/email/dnc/",
        "https://connectbyjbrh.com/docs/troubleshooting/audit-entry-missing/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0069",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/cannot-sign-in/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/cannot-sign-in/index.md",
      "title": "You cannot sign in",
      "description": "Three different failures wear the same face at the sign-in screen: consent, the address you used, and membership. How to tell them apart in order.",
      "summary": "Almost every failed sign-in is one of three things, and they look identical from the outside. Either Google never finished consenting, or you signed in with an address that belongs to no workspace, or the account is fine and nobody has added it to a workspace yet. Check them in that order; the third is the most common and the least like a fault.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/google-sign-in/",
        "https://connectbyjbrh.com/docs/workflows/first-sign-in/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-workspace/",
        "https://connectbyjbrh.com/docs/troubleshooting/session-expired/",
        "https://connectbyjbrh.com/docs/account/sessions/",
        "https://connectbyjbrh.com/docs/workflows/adding-a-colleague/"
      ]
    },
    {
      "id": "E0006",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/capacity-full/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/capacity-full/index.md",
      "title": "Every line is busy",
      "description": "Calls are refused because every voice worker is over its load threshold: what the caller meets, how capacity is actually computed, and what to change.",
      "summary": "Every live worker is over the busy threshold, so admission refuses new calls rather than accepting them into a process that cannot hold them. Capacity is computed from what the workers report — one-minute load per core and the calls they are holding — and the same threshold is given to the room service, so admission and the fleet cannot disagree about what busy means.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/phone-worker-unavailable/",
        "https://connectbyjbrh.com/docs/workflows/realtime-engine-enablement/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-never-rang/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0003",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/carrier-verification-failed/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/carrier-verification-failed/index.md",
      "title": "The carrier callback was refused",
      "description": "The carrier's callback was refused before the call was answered: what a refusal before pickup looks like on both logs, and the workspace-scope trap that causes most of them.",
      "summary": "Connect refused the carrier's request because it could not prove the request was genuine, and it refuses before answering rather than after. On the carrier's log the call shows as failed at the application; in the workspace there is nothing at all. The usual cause is not a wrong secret but a verification performed outside the workspace that owns the credentials, which reads them as empty.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/first-phone-setup/",
        "https://connectbyjbrh.com/docs/troubleshooting/phone-line-not-ringing/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0043",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/case-not-created/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/case-not-created/index.md",
      "title": "No case was opened",
      "description": "A customer raised a problem and no case exists. Why opening one is an action rather than an inference, and what to do when it should have happened.",
      "summary": "No case exists because nobody opened one. Connect does not create a case from a message sounding unhappy — opening is an explicit action by a person, by the Assistant when asked, or by a workspace route. The conversation, the person and the reply are all intact; what is missing is the record that makes the problem countable and chaseable.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/cases/",
        "https://connectbyjbrh.com/docs/support/case-context/",
        "https://connectbyjbrh.com/docs/workflows/support-case/",
        "https://connectbyjbrh.com/docs/relationships/duplicates/",
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "E0036",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/company-not-linked/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/company-not-linked/index.md",
      "title": "A person is not attached to their company",
      "description": "The company link is a decision somebody makes, not something inferred from an address. Where it comes from, and how to set it in each place.",
      "summary": "The link between a Person and a Company is a record somebody sets — on the relationship screen, in the Data grid, through the Assistant, or at the moment a prospect becomes a relationship. Nothing derives it from a mail domain, so a person who has only ever written from a free address has no company to attach to until one is chosen.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/companies/",
        "https://connectbyjbrh.com/docs/relationships/people/",
        "https://connectbyjbrh.com/docs/sales/deal-relationships/",
        "https://connectbyjbrh.com/docs/troubleshooting/duplicate-not-detected/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/prospects/"
      ]
    },
    {
      "id": "E0037",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/connect-refused-to-quote/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/connect-refused-to-quote/index.md",
      "title": "Connect would not give a price",
      "description": "Connect would not give a price, an SLA or a warranty term. Why the refusal is correct, what evidence changes it, and how to answer the customer today.",
      "summary": "A price, an SLA or a warranty that Knowledge does not support is refused and escalated to a person rather than improvised. That is `safe_sales` working. The fix is not a setting — it is a grounded fact in Knowledge, after which Connect will quote it. Until then, a person answers the commercial question and Connect handles the rest of the thread.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/sales/commercial-escalation/",
        "https://connectbyjbrh.com/docs/knowledge/unsupported-claims/",
        "https://connectbyjbrh.com/docs/troubleshooting/knowledge-insufficient/",
        "https://connectbyjbrh.com/docs/follow-ups/reason/"
      ]
    },
    {
      "id": "E0068",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/csv-export-formula/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/csv-export-formula/index.md",
      "title": "A CSV export looks escaped",
      "description": "An exported CSV shows odd leading characters on some cells. That is formula neutralisation working, why it is not optional, and how to read the file safely.",
      "summary": "CSV export neutralises formulas. A cell whose text a spreadsheet would run as an instruction rather than read as data is written so it stays text, which is why a few cells arrive looking escaped. The file is correct; the appearance is the defence. It matters because a CSV is opened by a spreadsheet that executes what it finds, and some of what it finds was typed by somebody outside your business.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/data-import-export/",
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/files-data/saved-views/",
        "https://connectbyjbrh.com/docs/workflows/data-import/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/developers/public-api/"
      ]
    },
    {
      "id": "E0075",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/data-not-visible/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/data-not-visible/index.md",
      "title": "Data that should be here is not",
      "description": "A record you expect is not in a list: the three different silences behind that, how to tell them apart, and the one that is a defect rather than a boundary.",
      "summary": "Three unrelated things produce the same empty screen. The record may belong to another workspace, in which case the emptiness is correct. It may be filtered out by the screen itself. Or it may carry no workspace stamp at all — matching no scope and no policy — so every list omits it silently while actions naming it directly still work.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/invisible-not-missing/",
        "https://connectbyjbrh.com/research/workspace-stamp/",
        "https://connectbyjbrh.com/docs/security/rls/",
        "https://connectbyjbrh.com/docs/security/mailbox-ownership/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/"
      ]
    },
    {
      "id": "E0039",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/deal-missing-from-pipeline/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/deal-missing-from-pipeline/index.md",
      "title": "A deal is not on the board",
      "description": "A deal you expected is not on the board. Four causes checked in order: the filter, the stage, who owns the record, and which workspace you are in.",
      "summary": "Work through four things in order: the filter or search on the board, the stage the deal is actually in, whether the record belongs to somebody your view excludes, and which workspace your session is signed into. The fourth is the one that looks most like a bug and is isolation working correctly.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/pipeline/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/support/website-enquiries/",
        "https://connectbyjbrh.com/docs/troubleshooting/stage-move-refused/",
        "https://connectbyjbrh.com/docs/troubleshooting/data-not-visible/"
      ]
    },
    {
      "id": "E0021",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/draft-never-sent/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/draft-never-sent/index.md",
      "title": "The draft is still waiting",
      "description": "A written reply that has not gone out: the four holds that cause it, the screen that reveals each one, and what the customer is experiencing meanwhile.",
      "summary": "Four things hold a written reply: the autonomy mode, an approval nobody has acted on, a spent daily allowance, and a suppressed recipient. They are checked in that order, and each is visible on a different screen. Nothing is broken in any of the four cases — but the customer is receiving no reply rather than a slow one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/email/approve-reject/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/troubleshooting/suppressed-recipient/",
        "https://connectbyjbrh.com/docs/workflows/email-reply-approval/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "E0013",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/duplicate-follow-up/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/duplicate-follow-up/index.md",
      "title": "The same call-back was booked twice",
      "description": "Two follow-ups for one promise: how a repeated commitment, a second call or a split person record each produce a double booking, and how to clear one.",
      "summary": "A commitment is recorded when it is made, so a promise restated three times in one call, made again on a second call, or attached to two different records for one person can land as more than one follow-up. Clearing it means deciding which one is the commitment, cancelling the rest, and fixing the cause — usually a split person record rather than the call itself.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/duplicates/",
        "https://connectbyjbrh.com/docs/phone/call-follow-up/",
        "https://connectbyjbrh.com/docs/follow-ups/execution/",
        "https://connectbyjbrh.com/docs/relationships/duplicates/",
        "https://connectbyjbrh.com/docs/workflows/duplicate-merge/",
        "https://connectbyjbrh.com/docs/troubleshooting/too-many-follow-ups/"
      ]
    },
    {
      "id": "E0035",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/duplicate-not-detected/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/duplicate-not-detected/index.md",
      "title": "An obvious duplicate was not suggested",
      "description": "Why two records that look identical to you share nothing a detector can match on, and how to merge them yourself without losing either side.",
      "summary": "Duplicate detection proposes; it never decides. It works from the evidence on the records — the identities they hold and the names and organisations written on them — so two records that share no address and no normalised name give it nothing to propose. Recognising a duplicate from context you hold and Connect does not is exactly the case for merging manually.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/duplicates/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/relationships/merge-safety/",
        "https://connectbyjbrh.com/docs/workflows/duplicate-merge/",
        "https://connectbyjbrh.com/docs/workflows/identity-merge-decision/",
        "https://connectbyjbrh.com/docs/relationships/identities/"
      ]
    },
    {
      "id": "E0094",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/duplicate-record-created/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/duplicate-record-created/index.md",
      "title": "A duplicate record was created",
      "description": "Two records for one person or company: the three ways a second one is created, what merging does to history, and what to check before you merge.",
      "summary": "A second record appears when a person arrives by a route that could not be matched to the first — a new channel with no linked identity, a number stored without its normalised key, or an import that did not match on anything. Merging joins the records and their identities, so the check before merging is whether every identity really belongs to one human.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/duplicates/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/relationships/merge-safety/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-recipient/",
        "https://connectbyjbrh.com/docs/troubleshooting/prospect-already-customer/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0023",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/duplicate-threads/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/duplicate-threads/index.md",
      "title": "The same conversation appears twice",
      "description": "One conversation showing as two: why mail threading splits, what Connect can and cannot merge, and how the person's timeline restores the whole story.",
      "summary": "Threading follows the reference headers a sending client writes, and some clients and mailing lists rewrite them — which splits one exchange into two conversations. Connect does not stitch threads back together; it merges the *people*, so Customer 360 and the timeline show one continuous history even where the mail itself arrived in two pieces.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/threads/",
        "https://connectbyjbrh.com/docs/relationships/duplicates/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/relationships/merge-safety/",
        "https://connectbyjbrh.com/docs/email/contact-resolution/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/workflows/thread-creation/"
      ]
    },
    {
      "id": "E0098",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/email-formatting-lost/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/email-formatting-lost/index.md",
      "title": "The reply lost its formatting",
      "description": "A message that looks plainer than it should: what the reading sanitiser removes, what the composer never adds, and how to tell lost styling from lost content.",
      "summary": "Two separate things flatten a message, and they are both deliberate. The reading side sanitises incoming HTML aggressively and does not fetch remote images, so a message can look plainer in Connect than at your provider. The writing side composes structured text under the mailbox's signature rather than a designed layout. Lost styling is by design; lost words are not.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/html-email/",
        "https://connectbyjbrh.com/docs/email/remote-images/",
        "https://connectbyjbrh.com/docs/troubleshooting/html-looks-wrong/",
        "https://connectbyjbrh.com/docs/email/mailbox-signature/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/"
      ]
    },
    {
      "id": "E0044",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/enquiry-not-visible/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/enquiry-not-visible/index.md",
      "title": "A website enquiry is not in my workspace",
      "description": "An enquiry from the JBRH site is not in your workspace, and it never will be. What you are actually seeing, where the record is, and what it protects.",
      "summary": "You are seeing tenant isolation behave correctly. An enquiry submitted on JBRH's public site is addressed to the operator and stored on the control plane, outside every workspace, so no workspace-scoped query can return it — including yours. The record is not lost, not deleted and not delayed. It is in a place your session is not entitled to read.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/website-enquiries/",
        "https://connectbyjbrh.com/docs/workflows/website-enquiry/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/invisible-not-missing/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/troubleshooting/mail-not-arriving/"
      ]
    },
    {
      "id": "E0091",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/export-missing-rows/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/export-missing-rows/index.md",
      "title": "An export is missing rows",
      "description": "A download that is shorter than the screen suggested: what an export actually follows, why the visible rows are not the set, and the cells that change on the way out.",
      "summary": "An export follows the view, not the sheet. Whatever the current filters, grouping and saved view exclude is left out of the export, and the grid is virtualised, so the rows on screen were never the whole set to begin with. Compare the export against the count for the view, not against what you scrolled past.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/research/grid-over-services/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/",
        "https://connectbyjbrh.com/docs/troubleshooting/screen-empty/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/developers/entity-ids/"
      ]
    },
    {
      "id": "E0064",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/file-rejected/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/file-rejected/index.md",
      "title": "The file was refused",
      "description": "A file would not attach: the format list, the content check that ignores the extension, and the two safety refusals that happen before anything is parsed.",
      "summary": "A refused file never reached the part of Connect that reads documents. One file service handles every attachment, and it checks the format, the content and two specific safety conditions before parsing begins. The reason is shown with the refusal, and it is nearly always one of four: an unsupported format, content that is not what the extension claims, or one of the two safety refusals.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/supported-formats/",
        "https://connectbyjbrh.com/docs/files-data/mime-validation/",
        "https://connectbyjbrh.com/docs/files-data/safe-parsing/",
        "https://connectbyjbrh.com/docs/files-data/upload/",
        "https://connectbyjbrh.com/docs/workflows/data-import/",
        "https://connectbyjbrh.com/docs/troubleshooting/pdf-no-text/"
      ]
    },
    {
      "id": "E0012",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-booked/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-booked/index.md",
      "title": "The call promised a call-back that never happened",
      "description": "A caller was promised a call-back and no follow-up exists: the time-mismatch refusal, the unbooked-promise finding, and where the evidence is.",
      "summary": "Saying a time on a call and booking it are two separate acts, and the second one can refuse. The usual reason a promised call-back does not exist is that the voice proposed a time the caller never said and never agreed aloud, so recording it was refused and the tool answered that nothing was recorded. The call review names this as a promise with nothing behind it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/promise-integrity/",
        "https://connectbyjbrh.com/docs/phone/call-follow-up/",
        "https://connectbyjbrh.com/docs/follow-ups/due-time/",
        "https://connectbyjbrh.com/docs/follow-ups/channel-choice/",
        "https://connectbyjbrh.com/research/callback-promises/",
        "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-executed/"
      ]
    },
    {
      "id": "E0040",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-executed/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-executed/index.md",
      "title": "A follow-up did not go out",
      "description": "A follow-up came due and nothing went out. The six gates in the order they are checked, and how to tell from the row which one stopped yours.",
      "summary": "A due follow-up that produced no message almost always hit one of six gates: the channel is `task` and never drains, autonomy held it for approval, the recipient is suppressed, the line or mailbox was not ready, the budget could not cover the work, or it was more than 24 hours late and was closed as missed. The row records which, in Connect's own words.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/execution/",
        "https://connectbyjbrh.com/docs/follow-ups/stale/",
        "https://connectbyjbrh.com/docs/follow-ups/task-channel/",
        "https://connectbyjbrh.com/docs/workflows/follow-up-approval/",
        "https://connectbyjbrh.com/docs/troubleshooting/follow-up-wrong-time/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "E0041",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/follow-up-wrong-time/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/follow-up-wrong-time/index.md",
      "title": "The follow-up went out at the wrong time",
      "description": "A follow-up reached someone at an hour nobody intended. What the due time actually promises, and the four delays that move a send later.",
      "summary": "A due time on a follow-up is the earliest moment it may run, not an appointment. The drain reaches due rows on a tick and takes phone follow-ups two at a time, approval can add hours, an unready line adds about one, and the hour a reader sees depends on which clock they are reading. Compare the due time on the row with the timeline entry before you change anything.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/due-time/",
        "https://connectbyjbrh.com/docs/follow-ups/execution/",
        "https://connectbyjbrh.com/docs/follow-ups/overdue/",
        "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-executed/",
        "https://connectbyjbrh.com/docs/phone/business-hours/",
        "https://connectbyjbrh.com/developers/time-and-timezones/"
      ]
    },
    {
      "id": "E0027",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/gmail-labels-missing/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/gmail-labels-missing/index.md",
      "title": "Gmail was not updated",
      "description": "The reply went out but Gmail still shows the thread unread and unlabelled: what write-back is, why its failure never blocks a send, and how to retry it.",
      "summary": "Write-back is the step after the send in which Connect marks the Gmail thread read and applies your label. It is deliberately non-blocking: if it fails, the reply has already gone and is already recorded, and only the Gmail side is out of date. Nothing is lost, nothing is queued for a person, and the usual cause is a permission the mailbox no longer holds.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/gmail-writeback/",
        "https://connectbyjbrh.com/docs/workflows/gmail-writeback-flow/",
        "https://connectbyjbrh.com/docs/email/gmail-scopes/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/"
      ]
    },
    {
      "id": "E0011",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/greeting-too-slow/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/greeting-too-slow/index.md",
      "title": "The greeting took seconds to arrive",
      "description": "Why a caller hears a pause before the first sentence: a cold worker process, a refused warm-up, or greeting wording that no longer matches the cache.",
      "summary": "The greeting is synthesised before the caller is picked up and played the instant they are, so a greeting that arrives seconds late was not in the answering process's cache and had to be made while the caller waited. Three things cause that: a process that has never warmed, a synthesis the model refused, and a greeting whose wording changed since the warm-up ran. The call record itself is unaffected.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/greeting/",
        "https://connectbyjbrh.com/docs/phone/greeting-prewarm/",
        "https://connectbyjbrh.com/docs/phone/latency/",
        "https://connectbyjbrh.com/docs/phone/voice-worker/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-answered-in-silence/"
      ]
    },
    {
      "id": "E0066",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/grid-edit-refused/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/grid-edit-refused/index.md",
      "title": "The grid would not save an edit",
      "description": "A cell reverted instead of saving: the service that owns the record declined the change. The six reasons it declines, and how to find which one applied.",
      "summary": "The grid does not save anything itself. It hands every edit to the service that owns that record, and a cell that snaps back is that service declining. The refusal carries a reason, and it is one of six: a field the service never accepts, a value it will not take, a permission you do not have, a rule that governs the field, a stale row, or a column that is derived rather than stored.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/inline-edit/",
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/workflows/data-grid-edit/",
        "https://connectbyjbrh.com/docs/workflows/bulk-edit/",
        "https://connectbyjbrh.com/docs/assistant/assistant-authority/",
        "https://connectbyjbrh.com/research/grid-over-services/"
      ]
    },
    {
      "id": "E0025",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/html-looks-wrong/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/html-looks-wrong/index.md",
      "title": "The email renders badly",
      "description": "A message that renders as plain, broken or oddly laid out: what the sanitiser takes out, why it is aggressive, and how to see the original safely.",
      "summary": "Connect renders mail through a sanitiser that removes active content and anything that would reach out of the message, then rewrites remote references to its own proxy. Elaborate marketing layouts lose most of their styling as a result. The stored message is untouched, so the original is always available at the provider.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/html-email/",
        "https://connectbyjbrh.com/docs/email/remote-images/",
        "https://connectbyjbrh.com/docs/troubleshooting/images-not-loading/",
        "https://connectbyjbrh.com/docs/troubleshooting/email-formatting-lost/",
        "https://connectbyjbrh.com/docs/email/attachments/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "E0024",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/images-not-loading/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/images-not-loading/index.md",
      "title": "Images in an email do not load",
      "description": "Pictures in a message are missing or broken: what the image proxy does, why it exists, and which of the five causes you can actually do something about.",
      "summary": "Remote pictures are fetched through Connect's own proxy rather than by your browser, so opening a message tells the sender nothing. A picture that does not appear usually means the remote host refused the proxy, the file needs a sign-in, the link is dead, or the picture was a tracking beacon that the renderer removed on purpose.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/remote-images/",
        "https://connectbyjbrh.com/docs/email/html-email/",
        "https://connectbyjbrh.com/docs/troubleshooting/html-looks-wrong/",
        "https://connectbyjbrh.com/docs/email/attachments/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/workflows/inbound-email/"
      ]
    },
    {
      "id": "E0067",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/import-rows-dropped/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/import-rows-dropped/index.md",
      "title": "Some imported rows are missing",
      "description": "Fewer records arrived than the file had rows. The three causes that account for nearly all of it, and the report that names each one by row.",
      "summary": "A row that does not arrive was refused, matched or never became a candidate, and the import report tells you which. Refused rows failed the owning service's validation. Matched rows updated a record you already had rather than creating a second one. Rows that never became candidates were blank, headerless or outside the mapped columns. Nothing is discarded quietly.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/data-import/",
        "https://connectbyjbrh.com/docs/files-data/data-import-export/",
        "https://connectbyjbrh.com/docs/files-data/data-duplicates/",
        "https://connectbyjbrh.com/docs/troubleshooting/file-rejected/",
        "https://connectbyjbrh.com/docs/workflows/bulk-edit/",
        "https://connectbyjbrh.com/docs/prospects/"
      ]
    },
    {
      "id": "E0081",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/integration-disconnected/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/integration-disconnected/index.md",
      "title": "An integration disconnected",
      "description": "A connected provider has stopped working. The shape every disconnection shares, what each provider does differently, and why reconnection happens at the provider.",
      "summary": "A disconnection means the credential Connect holds is no longer accepted by the provider. Everything already fetched stays; nothing new arrives; and outbound work on that connection is refused rather than queued indefinitely. Repair happens at the provider, because consent withdrawn there cannot be restored from here — Connect never holds a copy it could replay.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/mailbox-disconnected/",
        "https://connectbyjbrh.com/docs/troubleshooting/reconnect-required/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/security/credential-sealing/",
        "https://connectbyjbrh.com/docs/workflows/credential-rotation/",
        "https://connectbyjbrh.com/research/stale-credentials/"
      ]
    },
    {
      "id": "E0089",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/keyboard-trap/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/keyboard-trap/index.md",
      "title": "Keyboard navigation gets stuck",
      "description": "Tab stops working or focus vanishes: how to tell a real focus trap from focus you cannot see, the reliable way out, and what a useful report contains.",
      "summary": "Most reports of a keyboard trap are not traps. Focus is still moving; there is simply nothing on screen showing where it is, which is indistinguishable from being stuck. Press a key that would act on the focused control and watch what responds — if something does, the indicator is the defect, and the fix is a different one from a genuine trap.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/focus-rings-that-computed-to-none/",
        "https://connectbyjbrh.com/docs/troubleshooting/mobile-layout-broken/",
        "https://connectbyjbrh.com/research/invisible-ui-defects/",
        "https://connectbyjbrh.com/docs/troubleshooting/screen-empty/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/docs/account/"
      ]
    },
    {
      "id": "E0057",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/knowledge-insufficient/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/knowledge-insufficient/index.md",
      "title": "Connect said it does not know",
      "description": "A thread waiting because approved Knowledge held no confident answer: the six causes in order of likelihood, and the three things that change it.",
      "summary": "Connect checked its Knowledge, found nothing with the authority to answer, and stopped before writing anything. That is the designed behaviour rather than a fault. What makes it actionable is the record left behind, which says what was retrieved, which of it carried authority, and which verdict the gate reached — three fields that usually name the fix.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/unsupported-claims/",
        "https://connectbyjbrh.com/docs/knowledge/retrieval-test/",
        "https://connectbyjbrh.com/docs/knowledge/facts/",
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/"
      ]
    },
    {
      "id": "E0018",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/mail-not-arriving/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/mail-not-arriving/index.md",
      "title": "Mail is in the provider but not in Connect",
      "description": "A message is visible at Gmail or on the mail server and absent from Conversations. Four checks, in the order that finds the cause fastest.",
      "summary": "Check four things in this order: the daily allowance, the read cursor, whether the sync ran, and whether the bridge copied what the sync fetched. Each one produces the same symptom — a message at the provider and nothing on Conversations — and each has a different remedy, so the order is what saves the time.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/inbox-sync/",
        "https://connectbyjbrh.com/docs/workflows/inbound-email/",
        "https://connectbyjbrh.com/docs/workflows/quota-refusal/",
        "https://connectbyjbrh.com/docs/email/imap-cursor/",
        "https://connectbyjbrh.com/docs/email/gmail-history-sync/",
        "https://connectbyjbrh.com/docs/troubleshooting/mailbox-disconnected/",
        "https://connectbyjbrh.com/research/cursor-loss/"
      ]
    },
    {
      "id": "E0016",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/mailbox-disconnected/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/mailbox-disconnected/index.md",
      "title": "The mailbox disconnected",
      "description": "A mailbox has stopped authenticating: the causes in order of likelihood, what is still safe while it is down, and the path back to working.",
      "summary": "A disconnected mailbox means the stored credential no longer authenticates. Nothing is lost while it is down: the read cursor stays where it is, the canonical conversations are untouched, and held work waits. The repair is to reconnect the row that already exists rather than to add a second one for the same inbox.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/mailbox-disconnect/",
        "https://connectbyjbrh.com/docs/workflows/mailbox-repair/",
        "https://connectbyjbrh.com/docs/troubleshooting/reconnect-required/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/troubleshooting/mail-not-arriving/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
        "https://connectbyjbrh.com/research/invisible-not-missing/"
      ]
    },
    {
      "id": "E0100",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/mcp-client-cannot-connect/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/mcp-client-cannot-connect/index.md",
      "title": "An MCP client cannot connect",
      "description": "An MCP client that will not talk to Connect: the four refusals it can meet — transport, origin, protocol version and authentication — and the one-line test for each.",
      "summary": "Connect's MCP endpoint is `POST /mcp` and nothing else. Four refusals cover almost every failure: a GET or DELETE gets 405, a present but unrecognised `Origin` gets 403, a protocol version that disagrees between header and body gets JSON-RPC error -32020, and a workspace tool without an integration key is refused while the documentation tools need no credential at all.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/mcp-authentication/",
        "https://connectbyjbrh.com/developers/mcp-errors/",
        "https://connectbyjbrh.com/developers/mcp-client-generic/",
        "https://connectbyjbrh.com/docs/workflows/mcp-tool-call/",
        "https://connectbyjbrh.com/developers/a2a-integration/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0056",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/memory-budget/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/memory-budget/index.md",
      "title": "An older fact stopped being used",
      "description": "Something Connect used to mention has quietly stopped appearing: the per-channel character budgets, the fixed group order, and what falls off the end first.",
      "summary": "Nothing was deleted. Recalled memories are rendered in a fixed group order and the block is then cut to a character budget — 700 on a live call. Because the order is fixed, the last groups are what the cut removes: facts about people, then what earlier work produced. A memory that used to appear is usually still active and now sits past the end of the slice.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/memory/memory-in-channels/",
        "https://connectbyjbrh.com/docs/troubleshooting/memory-not-applied/",
        "https://connectbyjbrh.com/docs/knowledge/retrieval/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/docs/memory/viewing/"
      ]
    },
    {
      "id": "E0054",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/memory-not-applied/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/memory-not-applied/index.md",
      "title": "Connect ignored what I told it",
      "description": "A reply that ignores something you wrote down: the four causes in order of likelihood, what to check for each, and what the reply did and did not do meanwhile.",
      "summary": "Four things cause this, and they are worth checking in order: the row is at the wrong tier, a narrower row disagrees with it, it did not fit the character budget on a call, or what you did was not a memory at all. A fifth possibility is that it worked and the conversation you looked at was already in flight when you wrote it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/memory/memory-in-channels/",
        "https://connectbyjbrh.com/docs/workflows/memory-correction/",
        "https://connectbyjbrh.com/docs/troubleshooting/memory-viewer-empty/",
        "https://connectbyjbrh.com/docs/troubleshooting/memory-budget/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "E0099",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/memory-viewer-empty/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/memory-viewer-empty/index.md",
      "title": "The memory viewer shows nothing",
      "description": "You opened the memory viewer expecting to see what Connect knows and found nothing. Which tier you are actually looking at, and when empty is the true answer.",
      "summary": "An empty tier in the viewer is a real answer, not a loading failure: tiers are returned even when they hold nothing, so that \"nothing is set here\" is visible. The usual causes are looking at a narrower tier than the one the memory was written to, opening the viewer from a different mount point, or a second person record holding the history.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/viewing/",
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/workflows/memory-write/",
        "https://connectbyjbrh.com/docs/troubleshooting/memory-not-applied/",
        "https://connectbyjbrh.com/docs/memory/directives/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-workspace/",
        "https://connectbyjbrh.com/docs/memory/person-memory/"
      ]
    },
    {
      "id": "E0034",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/missing-timeline-entry/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/missing-timeline-entry/index.md",
      "title": "Something is missing from the timeline",
      "description": "Four kinds of event never appear on a customer timeline by design, and one kind of absence is a real gap. How to tell them apart.",
      "summary": "Most absences are deliberate. A timeline shows what happened *with a person* on records this workspace owns: drafts that never went out, deleted threads, enquiries that belong to JBRH rather than to you, and anything sitting under a second Person are all excluded on purpose. A genuine gap looks different — the conversation exists but its events do not.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/workflows/timeline-assembly/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-person-matched/",
        "https://connectbyjbrh.com/research/invisible-not-missing/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/"
      ]
    },
    {
      "id": "E0088",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/mobile-layout-broken/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/mobile-layout-broken/index.md",
      "title": "The layout is wrong on a phone",
      "description": "Overlapping or unreachable controls on a phone: where the layout comes from, the breakpoint that matters, and the four details that make a report reproducible.",
      "summary": "Layout comes from 56 ordered stylesheet layers behind a single index, and a defect at one width is usually invisible in the source and obvious in a browser. Report four things — the route, the viewport width, the `data-ui` name of the element, and the theme — because every visible element carries a `data-ui` name and that is what makes the report reproducible.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/invisible-ui-defects/",
        "https://connectbyjbrh.com/research/focus-rings-that-computed-to-none/",
        "https://connectbyjbrh.com/docs/troubleshooting/keyboard-trap/",
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0005",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/model-session-failed/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/model-session-failed/index.md",
      "title": "The voice model refused the session",
      "description": "The voice model would not start or dropped the session: the three close codes in plain language, the settings that cause each, and the retry and fallback.",
      "summary": "The model refused to open or hold the session, so there was no voice to put on the call. Connect opens it once more on the same model and once on the fallback before giving the call up, and records that it restarted. Almost every case is a setting the chosen model does not accept — an option it refuses, an identifier in the wrong form, or a parameter that is invalid on an audio session.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/call-never-rang/",
        "https://connectbyjbrh.com/docs/workflows/voice-tuning-cycle/",
        "https://connectbyjbrh.com/docs/workflows/call-recovery/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-cut-short/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "E0083",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/model-unavailable/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/model-unavailable/index.md",
      "title": "The AI provider refused",
      "description": "The AI provider refused. Quota, a rejected key, the spend ceiling and a bad model choice produce one symptom — here is how to tell which of the four it was.",
      "summary": "Four unrelated conditions look identical from a screen: the account is out of quota, the key is rejected, the spend ceiling was reached, or the configured model is not a valid choice for what was asked. Two of them open a provider breaker, one is local arithmetic that never touches the provider, and one is a configuration mistake reported before anything starts.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/quota-breaker/",
        "https://connectbyjbrh.com/docs/troubleshooting/budget-exhausted/",
        "https://connectbyjbrh.com/docs/workflows/budget-guard/",
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/docs/troubleshooting/model-session-failed/",
        "https://connectbyjbrh.com/docs/troubleshooting/provider-outage/"
      ]
    },
    {
      "id": "E0063",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/needs-you-empty/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/needs-you-empty/index.md",
      "title": "Needs You is empty and something is wrong",
      "description": "An empty queue is not a clean bill of health. What Needs You raises, what it deliberately leaves to other screens, and where to look when it is quiet.",
      "summary": "Needs You raises what something knew to raise: actions held for a decision, questions Connect could not settle, and operational faults it can detect. It does not raise work that never began, a limit that is a number rather than a fault, or a judgement about something already sent. An empty list means no open item, not that the business is being served.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you-kinds/",
        "https://connectbyjbrh.com/docs/workflows/needs-you-triage/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/account/usage/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-happening/"
      ]
    },
    {
      "id": "E0028",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/no-prospects-found/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/no-prospects-found/index.md",
      "title": "Discovery returned nothing",
      "description": "Discovery finished and the list is empty or nearly so. The four causes in order of likelihood, how to tell them apart, and what to change for each.",
      "summary": "An empty result almost always means one of four things: the brief describes a category rather than a business, the location scope excludes the candidates, everything found resolved to organisations you already know, or paid research was refused by the budget. The decision trail distinguishes them in about a minute.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/discovery-criteria/",
        "https://connectbyjbrh.com/docs/prospects/location-scope/",
        "https://connectbyjbrh.com/docs/workflows/prospect-discovery/",
        "https://connectbyjbrh.com/docs/prospects/prospect-identity/",
        "https://connectbyjbrh.com/docs/prospects/prospect-costs/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0078",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-happening/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-happening/index.md",
      "title": "Connect appears to be doing nothing",
      "description": "Connect looks idle: no replies, no calls, no activity. The seven reasons, ordered by how often each one turns out to be the answer.",
      "summary": "In almost every case Connect is working and something is holding the result: the runtime is off, the autonomy rule says a person decides, the allowance is spent, no mailbox is connected, a provider breaker is skipping scheduled work, nothing has actually arrived, or you are looking at a different workspace than the one doing the work. Check them in that order.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-sending/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/troubleshooting/allowance-reached/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/autonomy/connect-on-off/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-workspace/"
      ]
    },
    {
      "id": "E0060",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-sending/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-sending/index.md",
      "title": "Connect is preparing work but sending nothing",
      "description": "Connect is clearly working — drafts appear, calls are planned — and nothing leaves. The four causes in the order they actually apply, and how to tell them apart.",
      "summary": "Four things stop an outbound action, and they apply in this order: the autonomy mode for that channel, a pending approval, the daily allowance, and the AI budget. Each looks identical from the conversation screen — a finished message that never left — so the fix is to identify which one is holding it rather than to retry.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/approvals/",
        "https://connectbyjbrh.com/docs/autonomy/spend-context/",
        "https://connectbyjbrh.com/docs/account/plan/",
        "https://connectbyjbrh.com/docs/troubleshooting/allowance-reached/",
        "https://connectbyjbrh.com/docs/troubleshooting/budget-exhausted/",
        "https://connectbyjbrh.com/docs/workflows/approval-decision/"
      ]
    },
    {
      "id": "E0030",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/outreach-blocked/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/outreach-blocked/index.md",
      "title": "Outreach was blocked",
      "description": "A message to a prospect was refused or held. Which gate did it, where the reason is written, and which refusals a person is allowed to lift.",
      "summary": "Six things can stop outreach, and they behave differently: two hold the message until a condition changes, three refuse it outright, and one never wrote it at all. The reason is recorded on the decision trail with the rule that produced it. Some of those refusals a person may lift; one of them is deliberately beyond the Assistant entirely.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/compliance-check/",
        "https://connectbyjbrh.com/docs/prospects/sender-readiness/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/workflows/prospect-outreach/",
        "https://connectbyjbrh.com/docs/troubleshooting/prospect-allowance/"
      ]
    },
    {
      "id": "E0065",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/pdf-no-text/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/pdf-no-text/index.md",
      "title": "The PDF has no readable text",
      "description": "A PDF with no text layer still gets read, as an image, by the model. What that changes about the answer, and when to go back for a better source.",
      "summary": "A PDF made by scanning paper often contains pictures of words rather than words. Connect tries the text layer first; when there is none, the model reads the page as an image instead. You still get an answer, but it is a reading rather than an extraction — good for what a document says, unreliable for a column of figures you intend to act on without checking.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/text-extraction/",
        "https://connectbyjbrh.com/docs/files-data/table-extraction/",
        "https://connectbyjbrh.com/docs/files-data/image-understanding/",
        "https://connectbyjbrh.com/docs/files-data/preview/",
        "https://connectbyjbrh.com/docs/troubleshooting/file-rejected/",
        "https://connectbyjbrh.com/docs/workflows/upload-and-answer/"
      ]
    },
    {
      "id": "E0095",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/permission-denied/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/permission-denied/index.md",
      "title": "You do not have permission",
      "description": "Three unrelated things produce 'you do not have permission': your audience, your workspace and your role. Each looks different once you know what to look at.",
      "summary": "A refusal is one of three things. The audience boundary refuses a path that is not part of the customer surface. The workspace boundary does not refuse at all — data in another workspace is invisible, so you see nothing rather than a denial. Your role refuses an action inside your own workspace. The symptom differs in each case, and so does the fix.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/403-on-a-screen/",
        "https://connectbyjbrh.com/docs/security/authorization/",
        "https://connectbyjbrh.com/docs/security/customer-facade/",
        "https://connectbyjbrh.com/docs/troubleshooting/data-not-visible/",
        "https://connectbyjbrh.com/docs/account/workspace-admin/",
        "https://connectbyjbrh.com/research/closed-by-default-facade/"
      ]
    },
    {
      "id": "E0015",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/phone-line-not-ringing/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/phone-line-not-ringing/index.md",
      "title": "Nobody can reach the number",
      "description": "Nobody can reach your business number: the checklist in order — claim, trunk, routing, worker, hours, switch — and what each failure leaves on the record.",
      "summary": "Start with one question: does a call record exist for the attempt? A call the carrier never saw, a call the carrier saw and Connect refused before any row existed, and a call that was answered and declined are three different faults with three different fixes. The checklist below runs in the order the call itself travels: claim, trunk, routing, worker, hours, switch.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/business-number/",
        "https://connectbyjbrh.com/docs/phone/line-configuration/",
        "https://connectbyjbrh.com/docs/phone/business-hours/",
        "https://connectbyjbrh.com/docs/phone/line-off/",
        "https://connectbyjbrh.com/docs/troubleshooting/phone-worker-unavailable/",
        "https://connectbyjbrh.com/docs/workflows/first-phone-setup/"
      ]
    },
    {
      "id": "E0001",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/phone-worker-unavailable/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/phone-worker-unavailable/index.md",
      "title": "No voice worker is available",
      "description": "Calls are refused or reach nothing because no voice worker has checked in: what the caller meets, why a screen once said ready anyway, and the two ways it clears.",
      "summary": "No worker has checked in recently, so the realtime engine has nothing to hand a call to. New calls are refused before a record exists, with a retryable word, and the line reports the worker as the thing that is missing. It usually clears by itself within a deploy cycle; when it does not, it is a process that stopped, a fleet with no capacity, or a door with no token.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/capacity-full/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-never-rang/",
        "https://connectbyjbrh.com/docs/workflows/realtime-engine-enablement/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0073",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/plan-lapsed/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/plan-lapsed/index.md",
      "title": "The plan has lapsed",
      "description": "Four different things stop a workspace and all of them look the same from a screen. How to tell a lapse from the other three in about a minute.",
      "summary": "A lapse and three unrelated causes produce the identical symptom: Connect has gone quiet. Each one has a signature that separates it from the others in seconds — whether mail is still arriving, whether drafts are still being written, and what the refusal message actually says. Check those three before assuming a billing problem, because two of the four are settings.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/lapsed-plan/",
        "https://connectbyjbrh.com/docs/workflows/lapse-and-recovery/",
        "https://connectbyjbrh.com/docs/troubleshooting/allowance-reached/",
        "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-sending/",
        "https://connectbyjbrh.com/docs/troubleshooting/mailbox-disconnected/",
        "https://connectbyjbrh.com/docs/account/entitlements/"
      ]
    },
    {
      "id": "E0032",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/prospect-allowance/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/prospect-allowance/index.md",
      "title": "The prospecting allowance is spent",
      "description": "Prospecting has stopped because a limit was reached. Which of the two allowances it was, what carries on regardless, and what is waiting rather than lost.",
      "summary": "Two separate limits govern prospecting in a customer workspace: an AI budget covering research, and a daily send allowance covering outbound messages. They run out independently and behave differently — research is refused, sends are held. Nothing that was already done is undone, and no approval needs giving twice.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/prospect-owner-tenant/",
        "https://connectbyjbrh.com/docs/prospects/prospect-costs/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/workflows/quota-refusal/",
        "https://connectbyjbrh.com/docs/troubleshooting/outreach-blocked/",
        "https://connectbyjbrh.com/docs/account/"
      ]
    },
    {
      "id": "E0031",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/prospect-already-customer/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/prospect-already-customer/index.md",
      "title": "Connect refused to prospect an existing customer",
      "description": "A candidate was recognised as somebody the workspace already deals with. What the match was made on, and how to correct it when the match is wrong.",
      "summary": "The candidate resolved to a Person or Company already in your relationships, so it was not created as a cold prospect. That is `prospect_identity_resolution` doing the job it exists for. When the match is genuinely wrong, the fix is to correct the identity that caused it rather than to disable the check.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/prospect-identity/",
        "https://connectbyjbrh.com/docs/relationships/identities/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/workflows/list-import/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0029",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/prospect-no-email/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/prospect-no-email/index.md",
      "title": "A good prospect has no address",
      "description": "A qualified prospect with no contact address. Why nothing was invented to fill the gap, what the record is still worth, and the next actions that do work.",
      "summary": "The prospect is right, the research is right, and no source published an address. Connect will not generate one — not from a name and a domain, not from a pattern that works for most companies. The record is kept as a researched prospect with a next action that is not email, and that is a deliberate trade rather than a missing feature.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/docs/prospects/contactability/",
        "https://connectbyjbrh.com/docs/workflows/keeping-a-prospect-without-email/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/",
        "https://connectbyjbrh.com/docs/prospects/decision-makers/",
        "https://connectbyjbrh.com/docs/follow-ups/"
      ]
    },
    {
      "id": "E0082",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/provider-outage/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/provider-outage/index.md",
      "title": "A provider is down",
      "description": "A provider Connect depends on is failing. What is handled automatically, what simply waits, and the few things a person should and should not do meanwhile.",
      "summary": "An outage is handled by waiting, not by working around it. Transient failures are retried, the mail read position is not advanced over anything that was not stored, and no message is recorded as sent without the provider's own acknowledgement. The most useful thing a person can do is resist resending, because a duplicate is the one damage an outage cannot cause on its own.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/integration-disconnected/",
        "https://connectbyjbrh.com/docs/troubleshooting/uncertain-send/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/workflows/quota-breaker/",
        "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-happening/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/"
      ]
    },
    {
      "id": "E0017",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/reconnect-required/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/reconnect-required/index.md",
      "title": "Reconnect required",
      "description": "Why a stored grant stops working, what running the consent again restores, and the four things it deliberately does not put right.",
      "summary": "Reconnect required means the stored grant can no longer be refreshed, so Connect is asking you to consent again. Doing so restores reading and sending, and work resumes from the message the cursor last confirmed. It does not replay failed sends, resolve an uncertain one, or backfill write-back that was missed.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/connect-gmail/",
        "https://connectbyjbrh.com/docs/email/gmail-scopes/",
        "https://connectbyjbrh.com/docs/workflows/connect-gmail-workflow/",
        "https://connectbyjbrh.com/docs/workflows/mailbox-repair/",
        "https://connectbyjbrh.com/docs/troubleshooting/mailbox-disconnected/",
        "https://connectbyjbrh.com/research/stale-credentials/",
        "https://connectbyjbrh.com/docs/workflows/quota-refusal/"
      ]
    },
    {
      "id": "E0086",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/screen-empty/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/screen-empty/index.md",
      "title": "A screen is empty and should not be",
      "description": "A list showing nothing when it should show rows: the four causes — a filter, a workspace stamp, a permission, or genuine emptiness — and how to tell them apart.",
      "summary": "An empty screen has four causes and they look identical. A filter or folder is excluding the rows; the rows carry no workspace stamp and are invisible rather than missing; the path was refused for this session and the screen rendered its empty state; or there is genuinely nothing. Work through them in that order — the first is far commoner than the last.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/invisible-not-missing/",
        "https://connectbyjbrh.com/research/workspace-stamp/",
        "https://connectbyjbrh.com/research/closed-by-default-facade/",
        "https://connectbyjbrh.com/docs/troubleshooting/slow-screen/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0090",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/search-finds-nothing/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/search-finds-nothing/index.md",
      "title": "Search returns nothing",
      "description": "Search returns nothing for something you know exists: which fields are actually matched, how wildcard characters behave, and why results are a page rather than a set.",
      "summary": "Search matches specific fields, not whole conversations. A conversation is matched on its subject and its summary; a call on the caller's name, the two numbers and its summary. A word that appears only inside a message body will not be found, however certain you are that you read it there.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/counting-past-the-limit/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/troubleshooting/screen-empty/",
        "https://connectbyjbrh.com/developers/docs-search-api/",
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0019",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/send-failed/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/send-failed/index.md",
      "title": "The reply would not send",
      "description": "A reply was refused by the provider or never left: how to read the category of failure, which ones are worth retrying, and what to do about each.",
      "summary": "A failed send is a reply that was written, handed to the provider, and refused. It stays as a record against its thread rather than disappearing, and Connect does not silently try again. What to do depends on the category: a rejected recipient, a temporary provider failure, and a credential problem need three different responses.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/failed-send/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/troubleshooting/uncertain-send/",
        "https://connectbyjbrh.com/docs/email/sending/",
        "https://connectbyjbrh.com/docs/troubleshooting/suppressed-recipient/",
        "https://connectbyjbrh.com/docs/email/deliverability/",
        "https://connectbyjbrh.com/docs/troubleshooting/mailbox-disconnected/"
      ]
    },
    {
      "id": "E0071",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/session-expired/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/session-expired/index.md",
      "title": "You were signed out",
      "description": "A session expires on a clock rather than on idleness, and it does it without warning. What that looks like on an open screen, and what your last action did.",
      "summary": "A session has a fixed lifetime set when it was created. Using Connect all day does not extend it, and nothing warns you before it ends — the next request is simply no longer authenticated. On a screen that is already open that reads as frozen or suddenly empty rather than as a sign-in prompt, which is why it is so often reported as a bug.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/sessions/",
        "https://connectbyjbrh.com/docs/account/session-replacement/",
        "https://connectbyjbrh.com/docs/troubleshooting/cannot-sign-in/",
        "https://connectbyjbrh.com/docs/workflows/first-sign-in/",
        "https://connectbyjbrh.com/docs/account/security-settings/",
        "https://connectbyjbrh.com/docs/troubleshooting/screen-empty/"
      ]
    },
    {
      "id": "E0085",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/slow-screen/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/slow-screen/index.md",
      "title": "A screen is slow to load",
      "description": "A screen that takes seconds to appear: what it is actually fetching, the two query patterns that make screens slow, and how to tell which one you have.",
      "summary": "Two patterns account for nearly every slow screen here, and both are about query count rather than query speed: work that costs one statement per row, and work the application does in memory over a slice of rows. Measure statements at two workspace sizes and the pattern names itself — a count that grows with the data is the one that gets worse on its own.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/n-plus-one-that-grows/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/",
        "https://connectbyjbrh.com/docs/troubleshooting/screen-empty/",
        "https://connectbyjbrh.com/docs/troubleshooting/stale-data/",
        "https://connectbyjbrh.com/docs/workflows/scaling-up/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0049",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/sms-duplicate-reply/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/sms-duplicate-reply/index.md",
      "title": "The same SMS was answered twice",
      "description": "One text message produced two answers, two follow-ups or two cases. What the deduplication key covers, what defeats it, and how to clean up without losing a promise.",
      "summary": "A customer wrote once and two pieces of work exist. Almost always the provider delivered the same message twice under two different identifiers, so the key that normally makes a retry update in place had nothing to match. On the live carrier the duplicate cannot be a duplicate text — no SMS goes out — so what you are seeing is duplicated downstream work: two follow-ups, two cases, or two emails.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/sms-dedupe/",
        "https://connectbyjbrh.com/docs/workflows/sms-inbound/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/troubleshooting/duplicate-follow-up/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
        "https://connectbyjbrh.com/docs/troubleshooting/sms-not-sending/"
      ]
    },
    {
      "id": "E0048",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/sms-not-sending/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/sms-not-sending/index.md",
      "title": "SMS will not send",
      "description": "A text message will not go out. The provider check comes first, then DLT, then suppression — with what Connect completed and what it never started.",
      "summary": "On the live carrier this is expected rather than broken: that carrier carries no SMS, so no text can leave. Check in one order — a provider that carries SMS, then DLT registration if you are sending in India, then suppression on the recipient, then the autonomy rule. The first unmet condition is the answer, and the ones below it were never reached.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
        "https://connectbyjbrh.com/docs/sms/dlt/",
        "https://connectbyjbrh.com/docs/sms/sms-suppression/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/workflows/channel-failure/"
      ]
    },
    {
      "id": "E0079",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/something-was-sent-twice/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/something-was-sent-twice/index.md",
      "title": "The same message went out twice",
      "description": "Two copies of one message, or one call placed twice: how retries are made safe, the two causes that produce a genuine duplicate, and what to do next.",
      "summary": "A retried delivery is not a duplicate — retries are deduplicated at the point they arrive, and a 4xx is treated as an answer and never retried. Two copies mean either two separate intents, or one intent sent again by a person after an uncertain result. Establish which before changing anything, because the two have opposite fixes.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/uncertain-send/",
        "https://connectbyjbrh.com/docs/troubleshooting/duplicate-follow-up/",
        "https://connectbyjbrh.com/docs/troubleshooting/duplicate-threads/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "E0058",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/source-failed/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/source-failed/index.md",
      "title": "A Knowledge source failed to process",
      "description": "A Knowledge source that ended in error or never went active: the format, size, content and service causes, with the repair for each.",
      "summary": "A source that failed carries the reason on its own record, and the reason sorts into four families: the file was refused before it was stored, extraction produced nothing usable, the work timed out or the service was unavailable, or the content itself was flagged. Only the last leaves a recoverable source — the others need a different file.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/extraction/",
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/workflows/add-knowledge/",
        "https://connectbyjbrh.com/docs/knowledge/source-conflict/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "E0038",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/stage-move-refused/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/stage-move-refused/index.md",
      "title": "The deal would not move stage",
      "description": "A deal will not move to the stage you picked. The rules that block a move, how to satisfy each one, and the stage change people confuse it with.",
      "summary": "`move` runs the stage rules before it changes anything, and a rule it cannot satisfy stops the move with the reason attached. The usual reasons are a missing value, an open review, or a target stage the deal cannot reach from where it is. Satisfy the rule and the same move goes through; there is no override.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/stage-rules/",
        "https://connectbyjbrh.com/docs/sales/opportunities/",
        "https://connectbyjbrh.com/docs/troubleshooting/deal-missing-from-pipeline/",
        "https://connectbyjbrh.com/docs/workflows/move-opportunity/",
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/"
      ]
    },
    {
      "id": "E0087",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/stale-data/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/stale-data/index.md",
      "title": "The screen shows old data",
      "description": "The screen shows something you know has changed: the five reasons old data appears, including a tab that never noticed a release and a record still being written.",
      "summary": "Old data on a screen usually means one of five things, and only two of them are faults. A tab has been open across a release and is running the modules it loaded; a record is still being written; a derived value has not been recomputed yet; you are looking at a deliberate snapshot; or something really did not save. Reload before concluding anything.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/slow-screen/",
        "https://connectbyjbrh.com/docs/troubleshooting/screen-empty/",
        "https://connectbyjbrh.com/research/derived-control-state/",
        "https://connectbyjbrh.com/docs/phone/call-summary/",
        "https://connectbyjbrh.com/docs/troubleshooting/mail-not-arriving/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0022",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/suppressed-recipient/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/suppressed-recipient/index.md",
      "title": "The recipient is suppressed",
      "description": "Connect refused to write to an address: how to find out why, who is allowed to clear the entry, and the one kind nobody should clear casually.",
      "summary": "A refusal here means the address carries a compliance entry: an unsubscribe, a complaint, a bounce, or a do-not-contact record. The entry shows its origin on the person's record, and a workspace member may clear the ones that are clearable. Do-not-contact is the one that is not cleared casually, and the Assistant cannot clear it at all.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/email/dnc/",
        "https://connectbyjbrh.com/docs/email/unsubscribe/",
        "https://connectbyjbrh.com/docs/workflows/unsubscribe-workflow/",
        "https://connectbyjbrh.com/docs/workflows/suppression-application/",
        "https://connectbyjbrh.com/docs/email/complaints/",
        "https://connectbyjbrh.com/docs/assistant/"
      ]
    },
    {
      "id": "E0093",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/time-is-wrong/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/time-is-wrong/index.md",
      "title": "A time is shown in the wrong zone",
      "description": "A clock reading that looks an hour or half a day out: which zone each surface uses, why a promised call-back follows the line rather than the caller, and what to check.",
      "summary": "Records store an unambiguous instant; every surface then renders it in a zone of its own choosing. A screen uses the browser's zone, a phone commitment is resolved in the **line's** zone, and business hours belong to the line as well. A reading that looks wrong is nearly always a surface disagreement rather than a stored value that is out.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/time-and-timezones/",
        "https://connectbyjbrh.com/docs/phone/business-hours/",
        "https://connectbyjbrh.com/docs/phone/promise-integrity/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/troubleshooting/after-hours-call/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0042",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/too-many-follow-ups/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/too-many-follow-ups/index.md",
      "title": "The same person is being chased repeatedly",
      "description": "One person is being chased again and again. Where the extra commitments come from, why duplicate protection missed them, and how to stop them.",
      "summary": "Duplicate protection catches one shape only: the same due moment for the same person. Three commitments an hour apart are three different rows, all valid, and each executes. Repeated chasing is nearly always several honest follow-ups rather than one row running twice, and the fix is a stop for that person or that thread rather than a bug report.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/duplicates/",
        "https://connectbyjbrh.com/docs/follow-ups/editing/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/relationships/merge-safety/",
        "https://connectbyjbrh.com/docs/troubleshooting/duplicate-follow-up/",
        "https://connectbyjbrh.com/docs/relationships/timeline/"
      ]
    },
    {
      "id": "E0020",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/uncertain-send/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/uncertain-send/index.md",
      "title": "The send result is uncertain",
      "description": "A reply whose outcome the provider never confirmed: what that state means, why nothing is re-sent on a guess, and the evidence that settles it.",
      "summary": "Uncertain means the provider neither acknowledged the message nor refused it — the connection dropped, or a call timed out after the message may already have been accepted. Connect shows that honestly instead of picking an answer. It resolves with evidence: the provider's own sent folder, or a reply from the person you wrote to.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/email/sending/",
        "https://connectbyjbrh.com/docs/troubleshooting/send-failed/",
        "https://connectbyjbrh.com/docs/workflows/send-with-evidence/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/docs/workflows/email-reply-approval/"
      ]
    },
    {
      "id": "E0062",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/unexpected-autonomous-action/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/unexpected-autonomous-action/index.md",
      "title": "Connect did something without asking",
      "description": "Something went out with no approval. How to read the decision log entry that explains it, and why the scope in force is usually wider than the one you set.",
      "summary": "Every action Connect takes is written to the decision log with what was decided, by what, under which rule, and what happened. Start there: the entry names the scope that permitted it. In practice the answer is one of four — a wider scope than you checked, a standing instruction, a colleague's approval, or the Connect Assistant acting on somebody's request.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/autonomy/scopes/",
        "https://connectbyjbrh.com/docs/autonomy/standing-instructions/",
        "https://connectbyjbrh.com/docs/autonomy/explicit-gates/",
        "https://connectbyjbrh.com/docs/workflows/autonomy-change/",
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/research/authority-separation/"
      ]
    },
    {
      "id": "E0010",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/voice-cut-the-caller/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/voice-cut-the-caller/index.md",
      "title": "The voice talked over the caller",
      "description": "The voice kept talking over the caller, or stopped when nobody interrupted: the interruption thresholds, false-interruption resume, and why the host path leaves it off.",
      "summary": "Two opposite complaints share one set of controls. The voice talking over somebody is an interruption that was not acted on quickly enough; the voice stopping for a cough is one that was acted on too eagerly. Both are measured per reply, both have named findings in the call review, and the resume behaviour that fixes one of them is deliberately off on the host detection path.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/voice-tuning-cycle/",
        "https://connectbyjbrh.com/research/barge-in-without-cutting-the-greeting/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-language-on-call/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-audio-quality/"
      ]
    },
    {
      "id": "E0076",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/webhook-rejected/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/webhook-rejected/index.md",
      "title": "An inbound webhook was rejected",
      "description": "A provider reports failed deliveries and nothing arrives in Connect: the four causes of a refused callback, in the order they are worth checking.",
      "summary": "A refused callback failed one of four checks: it could not be shown to come from the provider, it was too old, it named something Connect does not serve, or it was a repeat of a delivery already handled. Only the first three are faults. The fourth is the retry mechanism working, and it is acknowledged rather than acted on twice.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/webhook-verification/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
        "https://connectbyjbrh.com/docs/workflows/credential-rotation/",
        "https://connectbyjbrh.com/docs/troubleshooting/provider-outage/",
        "https://connectbyjbrh.com/developers/webhooks-vs-polling/"
      ]
    },
    {
      "id": "E0045",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-not-receiving/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-not-receiving/index.md",
      "title": "WhatsApp messages are not arriving",
      "description": "No WhatsApp conversations are appearing in Connect: the causes in order of likelihood, what Connect did and did not complete, and how to prove which half is broken.",
      "summary": "Messages sent to your business number are not appearing anywhere in Connect. Almost always Meta is not calling the webhook, or its call is failing the signature check — when a call arrives and verifies, a conversation appears within seconds. Work outwards from Meta rather than inwards from the screen: the application cannot notice a call that never arrived.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/inbound-webhook/",
        "https://connectbyjbrh.com/docs/whatsapp/channel-setup/",
        "https://connectbyjbrh.com/docs/workflows/whatsapp-setup-workflow/",
        "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-send-failed/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/docs/workflows/channel-failure/"
      ]
    },
    {
      "id": "E0046",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-send-failed/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-send-failed/index.md",
      "title": "The WhatsApp reply would not send",
      "description": "A WhatsApp reply was written and did not go: telling the 24-hour window from a consent block, a spent allowance, an unapproved template and the hourly cap.",
      "summary": "Six things stop a finished WhatsApp reply and they look similar on screen: the autonomy mode held it, a STOP or a block refused it, the plan's allowance is spent, the 24-hour window has closed, the template is not one Meta approved, or the hourly cap for the connection type is reached. The decision log distinguishes them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/replying/",
        "https://connectbyjbrh.com/docs/whatsapp/whatsapp-limits/",
        "https://connectbyjbrh.com/docs/whatsapp/message-status/",
        "https://connectbyjbrh.com/docs/whatsapp/opt-out/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/"
      ]
    },
    {
      "id": "E0047",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-wrong-person/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-wrong-person/index.md",
      "title": "The WhatsApp message attached to the wrong person",
      "description": "A WhatsApp conversation is attached to the wrong contact: why matching works from the number alone, what the wrong join affects, and the two different repairs.",
      "summary": "A WhatsApp thread is showing against the wrong contact. There are only two shapes of this problem — one human holding two records, or one record holding two humans — and they have opposite repairs. Matching is by sending number alone, so the fix is always to correct the identity, never to move an individual message.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/person-resolution/",
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/research/one-person-many-channels/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/"
      ]
    },
    {
      "id": "E0059",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/wrong-answer-from-knowledge/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/wrong-answer-from-knowledge/index.md",
      "title": "An answer quoted the wrong thing",
      "description": "A reply cited something out of date, contradictory or beside the point. The causes in order of likelihood, what Connect finished, and what it never attempted.",
      "summary": "An answer that quotes the wrong thing has almost always retrieved successfully and selected badly. The usual causes are two sources that disagree, a superseded document still sitting in the bank, or a retrieval budget spent on the wrong passage because the question was read as one line rather than as a conversation. Fix the sources, not the wording.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/source-conflict/",
        "https://connectbyjbrh.com/docs/workflows/resolve-conflict/",
        "https://connectbyjbrh.com/docs/knowledge/retrieval-test/",
        "https://connectbyjbrh.com/docs/workflows/retrieval-for-a-reply/",
        "https://connectbyjbrh.com/docs/troubleshooting/knowledge-insufficient/",
        "https://connectbyjbrh.com/docs/knowledge/prompt-injection/",
        "https://connectbyjbrh.com/docs/memory/superseding/",
        "https://connectbyjbrh.com/docs/knowledge/unsupported-claims/"
      ]
    },
    {
      "id": "E0009",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/wrong-language-on-call/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/wrong-language-on-call/index.md",
      "title": "The voice answered in the wrong language",
      "description": "The voice answered in a language the caller did not use: which language a call opens in, what counts as evidence for a switch, and the transcript that looks wrong and is not.",
      "summary": "A call opens in the line's language and changes on evidence, but how much evidence depends on what Connect knows about the caller. A whole sentence is needed where the language was remembered or nothing is on file. Where the contact's city or state makes one likely, two or three words are enough, even mixed with English. A pinned line never moves, and a reply transcribed in Latin letters is still the language it was spoken in.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/voice-tuning-cycle/",
        "https://connectbyjbrh.com/docs/troubleshooting/voice-cut-the-caller/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/model-limited-findings/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-audio-quality/"
      ]
    },
    {
      "id": "E0026",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/wrong-mailbox-sent/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/wrong-mailbox-sent/index.md",
      "title": "The reply went from the wrong address",
      "description": "Why a reply left from a mailbox you did not expect: how the sending address is chosen, why a thread keeps it, and what to do about a message already gone.",
      "summary": "The sending mailbox is decided by the thread, not by the draft. A reply goes from the mailbox that received the message it answers, and a first message goes from the mailbox whose role covers that kind of work — the primary mailbox when nothing narrower applies. An address you did not expect almost always means the mail arrived somewhere you did not expect, or a role has moved since the thread began.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/mailbox-roles/",
        "https://connectbyjbrh.com/docs/email/primary-mailbox/",
        "https://connectbyjbrh.com/docs/workflows/mailbox-role-assignment/",
        "https://connectbyjbrh.com/docs/email/mailbox-signature/",
        "https://connectbyjbrh.com/research/invisible-not-missing/"
      ]
    },
    {
      "id": "E0055",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/wrong-memory/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/wrong-memory/index.md",
      "title": "Connect remembers something wrong",
      "description": "Connect keeps repeating something about your business that is not true: how to find where it is stored, correct it at the right tier, and confirm the fix.",
      "summary": "Almost always the correction was made at a wider tier than the one that is actually being read. Memory resolves narrowest-first — contact beats endpoint beats channel beats workspace — so a workspace-level edit does nothing while a contact-level row says otherwise. Open the memory viewer on the contact, check every tier, and forget the row at the tier that owns it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/",
        "https://connectbyjbrh.com/research/structured-business-memory/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0033",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/wrong-person-matched/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/wrong-person-matched/index.md",
      "title": "Two people were treated as one",
      "description": "A reply that mixes up two contacts: how an over-broad identity or a bad merge causes it, and how to separate the consequences afterwards.",
      "summary": "Almost always one address is attached to the wrong Person, or a merge joined two records that were not the same human. Connect did not guess: it followed an Identity row somebody or something created. Fix the identity first, then work through what the confusion already produced — replies, follow-ups, stages and deals do not unwind themselves.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/identities/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/relationships/merge-safety/",
        "https://connectbyjbrh.com/docs/workflows/identity-merge-decision/",
        "https://connectbyjbrh.com/docs/troubleshooting/company-not-linked/",
        "https://connectbyjbrh.com/docs/relationships/person-memory/"
      ]
    },
    {
      "id": "E0080",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/wrong-recipient/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/wrong-recipient/index.md",
      "title": "A message went to the wrong person",
      "description": "A reply or a call reached the wrong person: how identity resolution and thread stickiness decide a recipient, and how to correct the record afterwards.",
      "summary": "Connect does not pick a recipient. It resolves an identity — one address on one channel — to a Person, and replies to the thread that identity belongs to. A message reaching the wrong human almost always means two humans share one identity, or two records for one human were linked the wrong way round. The fix is on the identity, not on the message.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/identities/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/relationships/merge-safety/",
        "https://connectbyjbrh.com/docs/troubleshooting/duplicate-record-created/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-mailbox-sent/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "E0070",
      "kind": "troubleshooting",
      "url": "https://connectbyjbrh.com/docs/troubleshooting/wrong-workspace/",
      "markdown": "https://connectbyjbrh.com/docs/troubleshooting/wrong-workspace/index.md",
      "title": "You are in the wrong workspace",
      "description": "Why you are looking at another business's screens, how a workspace is actually chosen, and the one version of this that is worth reporting.",
      "summary": "Your workspace is resolved from your membership at sign-in and carried by the session. It is never read from a web address, a header or anything you can type, so landing in the wrong one is nearly always the wrong account or a second session in the same browser. Switching means changing which session you are using, not changing an address.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/workspace-resolution/",
        "https://connectbyjbrh.com/docs/account/owner-vs-tenant/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/troubleshooting/cannot-sign-in/",
        "https://connectbyjbrh.com/docs/troubleshooting/data-not-visible/",
        "https://connectbyjbrh.com/docs/account/sessions/"
      ]
    },
    {
      "id": "G0061",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/index.md",
      "title": "Business use cases",
      "description": "The shapes of work Connect is put to, what each one needs configured first, and the limits that decide whether a given shape is possible at all.",
      "summary": "Connect is one worker across email, WhatsApp, phone and inbound SMS, so a use case here is a shape of work rather than a product tier. Every page in this section names the channels involved, what has to exist before any of it runs, what Connect refuses or cannot do, and where the money actually goes on that shape of work.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/docs/getting-started/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/use-cases/missed-calls/",
        "https://connectbyjbrh.com/docs/use-cases/outbound-prospecting/",
        "https://connectbyjbrh.com/docs/compare/connect-vs-chatbot/"
      ]
    },
    {
      "id": "G0063",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/after-hours-enquiries/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/after-hours-enquiries/index.md",
      "title": "After-hours enquiries",
      "description": "What a caller and an emailer actually get outside working hours, what is held until morning, and the promises Connect must not make at midnight.",
      "summary": "Out of hours nothing changes about arrival: the call is answered and the mail is read on the same tick it would be at noon. What changes is what Connect may promise with nobody behind it, and what is deliberately held. The night shift is therefore an autonomy decision plus a follow-up policy, not a separate mode you switch on at six.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/use-cases/missed-calls/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/docs/use-cases/solo-operator/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "G0076",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/agency-multiple-clients/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/agency-multiple-clients/index.md",
      "title": "An agency with several clients",
      "description": "Running several clients from one product: why each client is its own workspace, what isolation actually enforces, and what deliberately cannot be shared.",
      "summary": "One client, one workspace. The workspace is the isolation root: nearly every record carries a workspace id and is filtered automatically, and the filtering happens three separate times before any data reaches a screen. That makes client separation structural rather than a matter of care — and it also means there is no view across clients.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/compare/owner-vs-tenant-concept/",
        "https://connectbyjbrh.com/research/workspace-stamp/",
        "https://connectbyjbrh.com/docs/use-cases/multi-location/"
      ]
    },
    {
      "id": "G0081",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/appointment-booking/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/appointment-booking/index.md",
      "title": "Booking appointments",
      "description": "What Connect can agree, confirm and chase around an appointment, why it does not hold your diary, and the read-back rule that keeps a booked time honest.",
      "summary": "Connect can take a booking request on any channel it runs, ask for what a booking needs, read the agreed time back before the call ends, and write it down as a dated follow-up with a reason. It does not hold a diary: no calendar integration is recorded in the capability registry, so whatever owns your slots still owns them, and Connect works to the hours configured on the line.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/use-cases/appointment-follow-up/",
        "https://connectbyjbrh.com/docs/follow-ups/creating/",
        "https://connectbyjbrh.com/docs/follow-ups/due-time/",
        "https://connectbyjbrh.com/docs/phone/promise-integrity/",
        "https://connectbyjbrh.com/docs/how-to/set-business-hours/",
        "https://connectbyjbrh.com/docs/sales/safe-sales/"
      ]
    },
    {
      "id": "G0067",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/appointment-follow-up/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/appointment-follow-up/index.md",
      "title": "Chasing appointments and commitments",
      "description": "Chasing appointments, call-backs and commitments across channels, with the duplicate, staleness and reason rules that keep the chasing honest.",
      "summary": "A follow-up is a dated commitment on one channel, carrying a reason. Connect creates them from conversations, drains the phone ones every tick under the same gates as any outbound call, and refuses to make the two mistakes that destroy trust in chasing: ringing somebody twice about the same thing, and ringing them about something they asked about last week.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/use-cases/quote-follow-up/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/callback-promises/",
        "https://connectbyjbrh.com/docs/use-cases/missed-calls/",
        "https://connectbyjbrh.com/docs/relationships/"
      ]
    },
    {
      "id": "G0079",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/b2b-sales-team/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/b2b-sales-team/index.md",
      "title": "A B2B sales team",
      "description": "A sales team using Connect for pipeline hygiene and follow-through, with the commercial escalation that keeps the agent out of the negotiation.",
      "summary": "Connect does the parts of B2B selling that decay when people are busy: recording what was said, keeping the pipeline honest, chasing the commitments and grounding the answers. It does not price, discount or negotiate — a commercial term Knowledge cannot support is refused and escalated, which is what makes the rest safe to run unattended.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/use-cases/quote-follow-up/",
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/research/evidence-for-next-action/",
        "https://connectbyjbrh.com/docs/use-cases/outbound-prospecting/"
      ]
    },
    {
      "id": "G0086",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/clinic-or-practice/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/clinic-or-practice/index.md",
      "title": "A clinic or practice",
      "description": "Scheduling-shaped enquiries for a clinic or practice, the privacy questions to settle first, and the clinical work that must never leave a person.",
      "summary": "Connect can take the administrative half of a practice's traffic — where you are, when you are open, what to bring, chasing a form somebody promised — and record it against the person. It holds no health-sector certification of any kind, and the clinical half must stay with a clinician: triage, advice, results, medication and anything urgent are outside what this is for.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/use-cases/regulated-communication/",
        "https://connectbyjbrh.com/docs/knowledge/unsupported-claims/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/security/data-retention/",
        "https://connectbyjbrh.com/docs/use-cases/appointment-booking/",
        "https://connectbyjbrh.com/docs/memory/deleting/"
      ]
    },
    {
      "id": "G0082",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/customer-reactivation/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/customer-reactivation/index.md",
      "title": "Reaching dormant customers",
      "description": "Reaching customers who have gone quiet: the compliance checks that run first, the evidence that makes a message worth sending, and which channels can carry it.",
      "summary": "A reactivation run is ordinary outreach to people who are already relationships, so it passes the same compliance gate, the same autonomy rule and the same send boundary as any other message. The order matters: suppression and do-not-contact are checked before a draft exists, the relationship record supplies what makes the message specific, and only then does anything go out.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/email/dnc/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/sms/dlt/",
        "https://connectbyjbrh.com/docs/use-cases/quote-follow-up/",
        "https://connectbyjbrh.com/docs/autonomy/modes/"
      ]
    },
    {
      "id": "G0069",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/customer-support-continuity/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/customer-support-continuity/index.md",
      "title": "Support that remembers the sale",
      "description": "Carrying what was learned during the sale into support: how one person stays one record across channels, and what breaks the thread when it breaks.",
      "summary": "Continuity is an identity problem before it is a memory problem. A Person is the canonical human; an Identity is one address on one channel, and a person may hold many. Once the address on an incoming message resolves to a Person, the sale, the promises, the calls and the open cases arrive with it — which is why the interesting failures are all resolution failures.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/support/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/research/one-person-many-channels/",
        "https://connectbyjbrh.com/research/relationship-memory/",
        "https://connectbyjbrh.com/docs/use-cases/professional-services/"
      ]
    },
    {
      "id": "G0099",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/debt-and-payment-reminders/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/debt-and-payment-reminders/index.md",
      "title": "Payment reminders",
      "description": "Reminding customers about unpaid invoices: the factual part that automates safely, the regulated part that cannot, and the evidence a dispute will need.",
      "summary": "A polite factual reminder — this invoice, this amount, this date, here is how to pay — automates well, because every element of it comes from a record rather than a judgement. Everything past that point is regulated work in most places: arrangements, interest, escalation, anything that could be read as pressure. Those belong to a person, and Connect refuses the terms that constitute them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/use-cases/regulated-communication/",
        "https://connectbyjbrh.com/docs/email/dnc/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/use-cases/supplier-chasing/"
      ]
    },
    {
      "id": "G0077",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/ecommerce-enquiries/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/ecommerce-enquiries/index.md",
      "title": "Order and delivery enquiries",
      "description": "Where is my order, and can I change it: answering from real data, refusing what is not known, and the order lookup Connect does not have by default.",
      "summary": "Order enquiries are almost entirely a grounding problem. Connect answers from Knowledge, from files in the workspace and from the data grid, and refuses what none of those support rather than producing a plausible delivery date. What it does not have out of the box is a connection to your order system — that has to be supplied.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/docs/use-cases/logistics-and-delivery/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/research/grounding-without-a-vector-database/"
      ]
    },
    {
      "id": "G0088",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/education-and-admissions/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/education-and-admissions/index.md",
      "title": "Education and admissions",
      "description": "Admissions-season enquiry volume, families who write in several languages, and the decisions a school must keep out of software entirely.",
      "summary": "Admissions traffic is seasonal, repetitive and multilingual, which is the combination Connect handles best: the same prospectus answer, in the family's language, at two in the morning in the week the forms open. Admissions decisions are the opposite kind of work, and nothing here should be routed through software — eligibility, offers, fees and appeals stay with people.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/use-cases/multilingual-customers/",
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/phone/language-detection/",
        "https://connectbyjbrh.com/docs/sms/dlt/"
      ]
    },
    {
      "id": "G0083",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/event-followup/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/event-followup/index.md",
      "title": "After an event or exhibition",
      "description": "Turning a box of cards from an exhibition into researched, evidenced records and a first message, without a single invented email address.",
      "summary": "Upload what you collected, let Connect research each organisation from public sources and attach evidence to every claim, then send only where a real contactable address exists. The rule that shapes the whole exercise is that Connect never generates a pattern address, so a card with a name and no email becomes a researched prospect with a different next action rather than a guess sent into the dark.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/docs/prospects/prospect-upload/",
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/use-cases/outbound-prospecting/",
        "https://connectbyjbrh.com/docs/follow-ups/task-channel/"
      ]
    },
    {
      "id": "G0100",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/feedback-collection/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/feedback-collection/index.md",
      "title": "Asking for feedback",
      "description": "Asking customers what they thought: when the request is triggered, which channel can carry it, and why a reply should rarely become Knowledge.",
      "summary": "Connect can ask for feedback at the moment something finishes — a case resolved, an onboarding completed, a deal closed — because those moments are events on the record rather than dates in a spreadsheet. The reply comes back as an ordinary conversation on the same relationship. What it is not is a survey platform: there is no scoring, no dashboard and no rating capability.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/resolving/",
        "https://connectbyjbrh.com/docs/memory/creating-memory/",
        "https://connectbyjbrh.com/docs/knowledge/knowledge-vs-fact/",
        "https://connectbyjbrh.com/docs/follow-ups/reason/",
        "https://connectbyjbrh.com/docs/use-cases/customer-support-continuity/",
        "https://connectbyjbrh.com/docs/whatsapp/whatsapp-limits/"
      ]
    },
    {
      "id": "G0072",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/field-service/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/field-service/index.md",
      "title": "A business whose people are not at a desk",
      "description": "When the people who do the work are on site rather than at a desk: what the phone covers, what the browser covers, and what genuinely cannot be done.",
      "summary": "A field business is phone-first by necessity: the call arrives while the only person who could answer it is under a sink or on a roof. Connect answers it, grounds the conversation in Knowledge, and turns whatever it cannot settle into a dated follow-up. What it cannot do is put the caller through to the person on site.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/use-cases/missed-calls/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/use-cases/trades-and-installers/",
        "https://connectbyjbrh.com/research/provider-independent-telephony/"
      ]
    },
    {
      "id": "G0096",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/franchise/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/franchise/index.md",
      "title": "A franchise network",
      "description": "A network of independently run branches: one workspace each, what genuinely cannot be pooled across them, and why there is no franchisor console.",
      "summary": "A franchise network is separate businesses, so it is separate workspaces — one per franchisee, each with its own plan, mailboxes, numbers, Knowledge and records. Isolation is enforced three times over and there is no mechanism to read across it, which means there is no network-wide view of customers and no franchisor console. That constraint is the design, not a missing feature.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/use-cases/multi-location/",
        "https://connectbyjbrh.com/docs/security/multi-tenancy/",
        "https://connectbyjbrh.com/docs/security/rls/",
        "https://connectbyjbrh.com/docs/use-cases/agency-multiple-clients/",
        "https://connectbyjbrh.com/docs/account/owner-vs-tenant/",
        "https://connectbyjbrh.com/docs/knowledge/owner-authority/"
      ]
    },
    {
      "id": "G0073",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/high-volume-inbox/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/high-volume-inbox/index.md",
      "title": "A high-volume inbox",
      "description": "An inbox with more mail than anyone can read: how work is picked, why the allowance holds rather than drops, and what to automate first.",
      "summary": "At volume the question stops being whether replies can be written and becomes which mail gets attention first, and what happens when the day allowance runs out. Connect picks work by the priority stored on the thread, holds rather than drops when the allowance is spent, and leaves the read cursor where it was so nothing is quietly skipped.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/n-plus-one-that-grows/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/",
        "https://connectbyjbrh.com/docs/use-cases/small-team-coverage/",
        "https://connectbyjbrh.com/docs/account/"
      ]
    },
    {
      "id": "G0065",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/inbound-lead-response/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/inbound-lead-response/index.md",
      "title": "Responding to inbound leads quickly",
      "description": "Answering a new enquiry before it goes cold: what Connect can say straight away, what it refuses, and why a held draft is not a fast reply.",
      "summary": "A new enquiry is read, triaged and answered on the same tick it arrives, grounded in Knowledge, and the parts nobody may improvise — a price, an SLA, a warranty — are refused and escalated instead of guessed. The thing that decides how fast the customer actually hears back is not the model. It is the autonomy mode on that channel.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/docs/use-cases/quote-follow-up/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/docs/compare/draft-vs-send/"
      ]
    },
    {
      "id": "G0075",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/india-sms-and-voice/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/india-sms-and-voice/index.md",
      "title": "Operating in India",
      "description": "Operating in India: what DLT registration actually requires, why outbound SMS does not work on the live carrier, and which channels do the job instead.",
      "summary": "Two facts shape everything here. Commercial SMS in India requires DLT registration with the telecom operators — entity, header and template — and the carrier on the live account carries no outbound SMS at all. Voice and WhatsApp are therefore the working channels, and the Phone screen states the messaging position rather than offering a thread that cannot send.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms",
        "phone",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/use-cases/multilingual-customers/",
        "https://connectbyjbrh.com/docs/use-cases/missed-calls/",
        "https://connectbyjbrh.com/docs/compare/realtime-vs-turn-based-voice/"
      ]
    },
    {
      "id": "G0085",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/internal-handover/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/internal-handover/index.md",
      "title": "Handing work between colleagues",
      "description": "Giving a colleague a customer relationship mid-flight: what the record already carries, what does not transfer at all, and who ends up accountable.",
      "summary": "A handover in Connect is mostly a matter of nothing needing to be moved. The history, the commitments and the decisions already live on the relationship rather than in one person's mailbox, so the colleague taking over opens the same record. What genuinely has to be handed across is the judgement: the reasons behind open follow-ups, and anything a person decided that the record cannot infer.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/how-to/hand-over-to-a-colleague/",
        "https://connectbyjbrh.com/docs/follow-ups/reason/",
        "https://connectbyjbrh.com/docs/relationships/relationship-story/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/phone/live-transfer/",
        "https://connectbyjbrh.com/docs/account/sessions/"
      ]
    },
    {
      "id": "G0090",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/logistics-and-delivery/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/logistics-and-delivery/index.md",
      "title": "Delivery and order status enquiries",
      "description": "Answering where-is-it questions from records you actually hold, refusing the ones you do not, and why an answer from a sample is worse than no answer.",
      "summary": "Connect answers a status question from the records in your workspace — the Data grid's sheets, an uploaded manifest, Knowledge — and says it does not know when none of those carry the answer. There is no courier-tracking integration in the capability registry, so whatever your operational system knows reaches Connect as data you put there, or it does not reach it at all.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/assistant/uncertainty/",
        "https://connectbyjbrh.com/docs/use-cases/ecommerce-enquiries/",
        "https://connectbyjbrh.com/docs/support/cases/",
        "https://connectbyjbrh.com/docs/prospects/prospect-counts/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/"
      ]
    },
    {
      "id": "G0091",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/manufacturing-enquiries/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/manufacturing-enquiries/index.md",
      "title": "Manufacturing and B2B enquiries",
      "description": "Technical enquiries and requests for quotation: which specification questions can be answered from documents, which are refused, and how the engineer gets involved.",
      "summary": "A works enquiry is mostly a document problem. Connect reads the datasheets and drawings you have supplied as Knowledge, answers what they support, refuses what they do not, and puts the rest in front of an engineer as a `task` follow-up with the thread attached. Price, lead time and warranty are refused outright unless Knowledge carries them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/supported-formats/",
        "https://connectbyjbrh.com/docs/knowledge/source-conflict/",
        "https://connectbyjbrh.com/docs/sales/commercial-escalation/",
        "https://connectbyjbrh.com/docs/use-cases/b2b-sales-team/",
        "https://connectbyjbrh.com/docs/knowledge/prompt-injection/",
        "https://connectbyjbrh.com/docs/follow-ups/task-channel/"
      ]
    },
    {
      "id": "G0062",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/missed-calls/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/missed-calls/index.md",
      "title": "Never miss a business call",
      "description": "Answering every inbound call in hours and out: what the caller gets, what still needs a person, and the three limits that shape the whole thing.",
      "summary": "A number pointed at Connect is answered on every call, at any hour, by either the turn-based carrier path or the realtime speech path a workspace opts into. The caller gets a conversation grounded in your Knowledge; a transcript and a summary land on the call record; and whatever could not be settled becomes a follow-up carrying a reason, rather than a call nobody remembers.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/use-cases/after-hours-enquiries/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/research/silent-failure/",
        "https://connectbyjbrh.com/docs/use-cases/field-service/",
        "https://connectbyjbrh.com/docs/compare/realtime-vs-turn-based-voice/"
      ]
    },
    {
      "id": "G0095",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/multi-location/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/multi-location/index.md",
      "title": "A business with several locations",
      "description": "Several branches inside one workspace: a line and a mailbox each, branch facts that stay local, and one relationship record the customer never sees split.",
      "summary": "One business with five branches is one workspace with five lines and as many mailboxes. Each line carries its own number, hours, routing and voice; each mailbox its own role and signature. The relationship stays whole underneath: a customer who rings one branch and emails another is one Person with several identities, and the second conversation knows about the first.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/use-cases/franchise/",
        "https://connectbyjbrh.com/docs/phone/line-configuration/",
        "https://connectbyjbrh.com/docs/memory/channel-context/",
        "https://connectbyjbrh.com/docs/relationships/cross-channel-identity/",
        "https://connectbyjbrh.com/docs/how-to/connect-a-second-number/",
        "https://connectbyjbrh.com/docs/email/mailbox-roles/"
      ]
    },
    {
      "id": "G0064",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/multilingual-customers/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/multilingual-customers/index.md",
      "title": "Serving customers in several languages",
      "description": "Serving customers in more than one language across phone, email and WhatsApp: how the language is chosen, what it costs, and what is not claimed.",
      "summary": "Connect answers in the language the conversation is being held in, grounded in the same Knowledge whichever language the question arrived in. On voice a regional speaking-style layer shapes delivery, and a human voice profile shapes character. What this documentation does not carry is a certified list of supported languages, and this page does not invent one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/use-cases/india-sms-and-voice/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "G0093",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/non-profit/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/non-profit/index.md",
      "title": "A small organisation with no support desk",
      "description": "Coverage for an organisation where answering enquiries is nobody's actual job, and the decisions that have to stay with a named person anyway.",
      "summary": "In a charity, a club or a community organisation the enquiries arrive constantly and belong to nobody. Connect gives that traffic a consistent answer, keeps what was said on the person rather than in a volunteer's inbox, and puts anything requiring a decision into one shared queue. What it must not absorb is the judgement — money, welfare and membership decisions stay with people.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/use-cases/small-team-coverage/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/autonomy/connect-on-off/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/how-to/reduce-your-costs/"
      ]
    },
    {
      "id": "G0066",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/outbound-prospecting/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/outbound-prospecting/index.md",
      "title": "Outbound prospecting without buying a list",
      "description": "Finding and approaching new organisations from public research rather than a bought list, and the refusals that cap the volume on purpose.",
      "summary": "Prospecting here starts from criteria and public research rather than an uploaded list, attaches evidence to every claim it records, and stops at a compliance check before anything is sent. The rule that shapes the whole thing is that no email address is ever guessed: a prospect with no discoverable address stays researched and takes a different next action.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/",
        "https://connectbyjbrh.com/research/research-cost-routing/",
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/docs/use-cases/b2b-sales-team/",
        "https://connectbyjbrh.com/docs/compare/evidence-vs-inference/"
      ]
    },
    {
      "id": "G0084",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/partner-communication/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/partner-communication/index.md",
      "title": "Working with partners and suppliers",
      "description": "Pointing the same machinery at counterparties who are not customers: suppliers, partners and agencies, with the scoping and refusals that differ.",
      "summary": "A supplier is a Company, a partner contact is a Person with identities, and the correspondence is threads and calls — the same records a customer produces. What changes is the scoping: partner traffic usually deserves its own mailbox role, its own autonomy setting and its own memory at the endpoint tier, because the tone and the authority you want are not the ones you want facing customers.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/companies/",
        "https://connectbyjbrh.com/docs/autonomy/scopes/",
        "https://connectbyjbrh.com/docs/email/mailbox-roles/",
        "https://connectbyjbrh.com/docs/use-cases/supplier-chasing/",
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/memory/channel-context/"
      ]
    },
    {
      "id": "G0078",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/professional-services/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/professional-services/index.md",
      "title": "Professional services enquiries",
      "description": "Enquiries for advisory and professional work: scoping without committing, reading what the client sends, and the decisions that must stay with a person.",
      "summary": "For advisory work the automatable part is the front of the conversation — understanding what is being asked, gathering what a person will need, and keeping the thread warm. The part that must not be automated is anything that commits the firm: scope, fee, timescale, and the professional judgement itself. Connect refuses the second set by design.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/use-cases/b2b-sales-team/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/use-cases/regulated-communication/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/",
        "https://connectbyjbrh.com/docs/relationships/"
      ]
    },
    {
      "id": "G0068",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/quote-follow-up/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/quote-follow-up/index.md",
      "title": "Following up a quotation",
      "description": "Following up a quotation without letting the agent restate the price: the sequence, the refusal rule, and how a commercial question escalates.",
      "summary": "Connect chases a quotation the way a disciplined salesperson does: it references that a quotation exists, asks what would help the decision, records what comes back against the opportunity, and hands any question about the number itself to a person. `safe_sales` is the rule — a price, an SLA or a warranty Knowledge cannot support is refused, not improvised.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/use-cases/b2b-sales-team/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/use-cases/appointment-follow-up/"
      ]
    },
    {
      "id": "G0089",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/real-estate/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/real-estate/index.md",
      "title": "Property enquiries",
      "description": "Portal enquiries answered in minutes, qualified in the reply, and turned into a viewing commitment — with the listing-accuracy problem stated plainly.",
      "summary": "Property enquiries are won on the first reply and lost in the gap between one portal alert and somebody getting back to their desk. Connect closes that gap on email, WhatsApp and phone, asks the qualifying questions in the same message, and books the viewing as a dated follow-up. It answers only from the listing information you supply, which is where the real risk sits.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/source-conflict/",
        "https://connectbyjbrh.com/docs/relationships/cross-channel-identity/",
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/use-cases/inbound-lead-response/",
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/knowledge/unsupported-claims/"
      ]
    },
    {
      "id": "G0080",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/recruiting-and-hiring/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/recruiting-and-hiring/index.md",
      "title": "Handling applicants",
      "description": "Handling applicants at volume: the correspondence Connect takes on, the records it keeps, and the hiring decisions it must never be given.",
      "summary": "Applicant handling splits cleanly. The correspondence — acknowledging, answering questions about the role and the process, chasing what somebody said they would send — is ordinary inbox work Connect does well. The assessment is not: no capability recorded here scores, ranks or shortlists a person, and this page does not pretend one exists.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/use-cases/high-volume-inbox/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/use-cases/regulated-communication/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/use-cases/education-and-admissions/"
      ]
    },
    {
      "id": "G0074",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/regulated-communication/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/regulated-communication/index.md",
      "title": "Communication you must be able to explain",
      "description": "Work where every message may have to be explained later: what is recorded, what evidence exists, and the certifications this documentation does not claim.",
      "summary": "If you have to be able to explain a message months later, the useful question is what was recorded at the time. Connect records what was decided, by what, under which rule and what happened — including refusals, because a refusal is a decision. What it does not have is a certification, and no page here claims one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/use-cases/professional-services/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/"
      ]
    },
    {
      "id": "G0097",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/reseller-and-partner-enquiries/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/reseller-and-partner-enquiries/index.md",
      "title": "Reseller and partner enquiries",
      "description": "Inbound approaches from would-be resellers and partners: qualifying them with evidence, and the commercial terms that never leave a person.",
      "summary": "A reseller approach is an inbound enquiry that happens to be about distribution rather than a purchase, so the same machinery handles it: resolve the person and the organisation, research the company from public sources with evidence attached, ask the qualifying questions, and open an opportunity. Every term a partnership actually turns on — margin, territory, exclusivity — is refused and escalated.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/use-cases/partner-communication/",
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/sales/opportunities/",
        "https://connectbyjbrh.com/docs/sales/commercial-escalation/",
        "https://connectbyjbrh.com/docs/prospects/prospect-identity/",
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/"
      ]
    },
    {
      "id": "G0092",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/saas-trials/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/saas-trials/index.md",
      "title": "Software trials and onboarding",
      "description": "Trial and onboarding nudges that are worth receiving: what they can be grounded in, the stop rules, and the product data Connect does not have.",
      "summary": "Connect can run the human half of a trial: the check-in that references what somebody actually asked, the answer grounded in your documentation, the follow-up that stops the moment they reply. What it cannot do by itself is know what they did inside your product — there is no telemetry integration, so usage reaches the workspace as data you put there or not at all.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/onboarding/",
        "https://connectbyjbrh.com/docs/prospects/cold-sequence-stop/",
        "https://connectbyjbrh.com/docs/follow-ups/duplicates/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/knowledge/unsupported-claims/",
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/"
      ]
    },
    {
      "id": "G0094",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/seasonal-business/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/seasonal-business/index.md",
      "title": "A business with a season",
      "description": "Handling a season that is ten times the rest of the year: what you widen, what capacity actually limits you, and the rules that must not move.",
      "summary": "A season is handled by widening autonomy and raising the allowance, not by changing how anything works. Compliance, isolation and the send boundary stay exactly as they are; what moves is how much Connect may do without asking and how much the plan permits. Out of season you narrow the same two dials, or turn the runtime off entirely, and nothing is lost.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/how-to/prepare-for-a-busy-week/",
        "https://connectbyjbrh.com/docs/phone/worker-capacity/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/autonomy/connect-on-off/",
        "https://connectbyjbrh.com/docs/phone/business-hours/",
        "https://connectbyjbrh.com/docs/account/usage/"
      ]
    },
    {
      "id": "G0070",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/small-team-coverage/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/small-team-coverage/index.md",
      "title": "Covering a small team's inbox",
      "description": "Covering a shared inbox with a handful of people: mailbox roles, per-mailbox autonomy, and the queue that keeps a human in charge of what goes out.",
      "summary": "A small team gets the most out of Connect by treating each mailbox as a separate decision rather than switching the whole workspace on. Every mailbox carries its own role, signature, autonomy setting and health verdicts, and everything held for a person lands in one ranked queue with the approval recorded against whoever released it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/research/invisible-not-missing/",
        "https://connectbyjbrh.com/docs/use-cases/high-volume-inbox/",
        "https://connectbyjbrh.com/docs/use-cases/solo-operator/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "G0071",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/solo-operator/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/solo-operator/index.md",
      "title": "Running a business on your own",
      "description": "One person, no colleagues to approve anything: the settings that give the widest cover for the least risk, and where the single-approver problem bites.",
      "summary": "Running alone changes one thing structurally: you are the only approver, so every setting that says 'a person decides' means 'this waits until you look'. The arrangement that works is a ladder — watch, then approve, then release — applied channel by channel, with the queue as the single place anything unfinished can hide.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/use-cases/small-team-coverage/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/use-cases/field-service/",
        "https://connectbyjbrh.com/research/authority-separation/"
      ]
    },
    {
      "id": "G0098",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/supplier-chasing/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/supplier-chasing/index.md",
      "title": "Chasing suppliers",
      "description": "Outbound follow-up aimed at people who owe you something rather than owe you money: what drains automatically, what expires, and what the record proves.",
      "summary": "Chasing a supplier is the follow-up machinery pointed outward: a dated commitment with a reason, drained on email or phone under the same gates as any other outbound, with the transcript or the send evidence as the record of what was promised. The commercial decision at the end of a chase — accept, escalate, go elsewhere — is not one Connect makes.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "phone",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/execution/",
        "https://connectbyjbrh.com/docs/follow-ups/overdue/",
        "https://connectbyjbrh.com/docs/phone/phone-followup-drain/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/use-cases/partner-communication/",
        "https://connectbyjbrh.com/docs/support/cases/"
      ]
    },
    {
      "id": "G0087",
      "kind": "guide",
      "url": "https://connectbyjbrh.com/docs/use-cases/trades-and-installers/",
      "markdown": "https://connectbyjbrh.com/docs/use-cases/trades-and-installers/index.md",
      "title": "Trades and installers",
      "description": "Enquiries answered while you are up a ladder: qualifying a job, arranging a visit, and chasing the quote afterwards without ever naming a price.",
      "summary": "The shape is narrow and it fits well: catch the call you cannot answer, find out what the job is and where, agree a time to look at it, and chase the quote until it is answered. The hard boundary is the number. Connect will not price a job, because `safe_sales` refuses any commercial term Knowledge does not support and escalates it to you instead.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "whatsapp",
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/use-cases/field-service/",
        "https://connectbyjbrh.com/docs/use-cases/quote-follow-up/",
        "https://connectbyjbrh.com/docs/phone/phone-followup-drain/",
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/phone/voice-lab-review/",
        "https://connectbyjbrh.com/docs/follow-ups/overdue/"
      ]
    },
    {
      "id": "C0183",
      "kind": "hub",
      "url": "https://connectbyjbrh.com/docs/whatsapp/",
      "markdown": "https://connectbyjbrh.com/docs/whatsapp/index.md",
      "title": "WhatsApp in Connect",
      "description": "WhatsApp as a Connect channel: the two ways a number is connected to Meta, what Meta decides, and where every WhatsApp topic in this manual sits.",
      "summary": "Connect receives WhatsApp messages on a workspace's own Meta business number and answers under the same autonomy rule that governs email and phone. The number is connected one of two ways — Official API, the business's own Meta app, or QR-linked, Meta's coexistence route through Embedded Signup. The number, template approval, the 24-hour window and delivery reporting belong to Meta; Connect works inside them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/channel-setup/",
        "https://connectbyjbrh.com/docs/whatsapp/inbound-webhook/",
        "https://connectbyjbrh.com/docs/whatsapp/replying/",
        "https://connectbyjbrh.com/docs/whatsapp/whatsapp-limits/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0184",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/whatsapp/channel-setup/",
      "markdown": "https://connectbyjbrh.com/docs/whatsapp/channel-setup/index.md",
      "title": "Setting up WhatsApp",
      "description": "Connecting WhatsApp in a workspace: Official API credentials or Meta's QR-linked coexistence route, the webhook, the autonomy decision, and the test that proves it.",
      "summary": "Choose a connection mode first. Official API means entering your own Meta phone number ID, WhatsApp Business account ID, access token and app secret, then pointing Meta's webhook at Connect. QR-linked means accepting Meta's coexistence warning and running Embedded Signup, which is not switched on in production yet. Either way, set the channel's autonomy mode and then message the number from a phone you hold.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/whatsapp/inbound-webhook/",
        "https://connectbyjbrh.com/docs/workflows/whatsapp-setup-workflow/",
        "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-not-receiving/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/workflows/channel-configuration/"
      ]
    },
    {
      "id": "C0188",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/whatsapp/conversation-continuity/",
      "markdown": "https://connectbyjbrh.com/docs/whatsapp/conversation-continuity/index.md",
      "title": "Continuing a WhatsApp conversation",
      "description": "What Connect carries from one WhatsApp message to the next: the thread, the relationship, memory and knowledge — and how a long silence is treated.",
      "summary": "A WhatsApp exchange is one canonical thread against one Person, so the next message is read with everything before it in view. Beyond the thread, Connect carries the relationship record, memory at four tiers and the workspace's Knowledge. A long gap does not erase any of that — but it closes Meta's 24-hour window, which changes what may be sent, not what is known.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/whatsapp/person-resolution/",
        "https://connectbyjbrh.com/docs/whatsapp/replying/",
        "https://connectbyjbrh.com/docs/whatsapp/whatsapp-limits/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/workflows/cross-channel-handover/",
        "https://connectbyjbrh.com/research/relationship-memory/"
      ]
    },
    {
      "id": "C0186",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/whatsapp/inbound-webhook/",
      "markdown": "https://connectbyjbrh.com/docs/whatsapp/inbound-webhook/index.md",
      "title": "Receiving a WhatsApp message",
      "description": "How a WhatsApp message reaches Connect: Meta's signed webhook call, which workspace it belongs to, every message type it can carry, and the record it becomes.",
      "summary": "Meta posts to one Connect URL, `/api/whatsapp/webhook`, for every workspace. The `phone_number_id` in the body finds the account, that account's app secret has to validate an HMAC-SHA256 signature over the raw bytes, and only then is the payload read as meaningful. Connect resolves the sender to a Person and writes the conversation and message the engine and every screen read.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/whatsapp/person-resolution/",
        "https://connectbyjbrh.com/docs/workflows/whatsapp-inbound/",
        "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-not-receiving/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
        "https://connectbyjbrh.com/developers/webhooks-outbound/"
      ]
    },
    {
      "id": "C0192",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/whatsapp/message-status/",
      "markdown": "https://connectbyjbrh.com/docs/whatsapp/message-status/index.md",
      "title": "Delivery and read status",
      "description": "Delivery and read receipts on WhatsApp: what Meta reports, what Connect stores, what it refuses to infer, and the billed category that rides along with a status.",
      "summary": "Connect records what Meta tells it about an outbound message and nothing beyond that. A returned message id makes a message sent; each status callback afterwards is matched on that id and stored as it arrives, along with the category Meta billed the conversation under. Where nothing is reported, the message shows no status rather than an assumed one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/whatsapp/replying/",
        "https://connectbyjbrh.com/docs/whatsapp/whatsapp-limits/",
        "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-send-failed/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/",
        "https://connectbyjbrh.com/docs/follow-ups/"
      ]
    },
    {
      "id": "C0191",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/whatsapp/opt-out/",
      "markdown": "https://connectbyjbrh.com/docs/whatsapp/opt-out/index.md",
      "title": "Opting out of WhatsApp",
      "description": "What a customer can say to stop WhatsApp messages, how Connect honours it, where the suppression is recorded, and what still reaches them afterwards.",
      "summary": "**STOP** on its own ends WhatsApp messages and **START** restores them, recognised exactly as strictly as on SMS. Connect writes the change in two places: consent withdrawn on that person's WhatsApp route, and a memory block that every send path already consults. Inbound messages keep arriving — consent governs what Connect sends, not what it hears.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/whatsapp/replying/",
        "https://connectbyjbrh.com/docs/workflows/whatsapp-optout/",
        "https://connectbyjbrh.com/docs/workflows/dnc-across-channels/",
        "https://connectbyjbrh.com/docs/sms/stop/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "C0187",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/whatsapp/person-resolution/",
      "markdown": "https://connectbyjbrh.com/docs/whatsapp/person-resolution/index.md",
      "title": "Recognising who sent a WhatsApp message",
      "description": "How a WhatsApp number becomes a named Person in your relationships, what happens when the sender is unknown, and how a wrong match is corrected.",
      "summary": "The sending number is an **Identity** — one address on one channel — and `identity.py` resolves it to a **Person** in the workspace's relationships. If that address is already known, the message joins that person's history across every channel. If it is not, a Person is created with the number as its first identity and whatever the profile offered as a provisional name.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/whatsapp/inbound-webhook/",
        "https://connectbyjbrh.com/docs/whatsapp/conversation-continuity/",
        "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-wrong-person/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/one-person-many-channels/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/"
      ]
    },
    {
      "id": "C0185",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/whatsapp/provider-identity/",
      "markdown": "https://connectbyjbrh.com/docs/whatsapp/provider-identity/index.md",
      "title": "The WhatsApp business identity",
      "description": "The number, the display name and the verification mark a customer sees on a WhatsApp chat: what Meta owns, what the connection mode changes, and what Connect cannot.",
      "summary": "The identity at the top of a customer's chat — the number, the business name, the profile photo and any verification mark — belongs to the WhatsApp Business account held at Meta. Connect reads three facts back from Meta when you verify the connection and never overrides any of them. What a workspace controls is what the messages say, who they go to, and whether a person approves them first.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/whatsapp/channel-setup/",
        "https://connectbyjbrh.com/docs/whatsapp/person-resolution/",
        "https://connectbyjbrh.com/docs/whatsapp/whatsapp-limits/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "C0189",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/whatsapp/replying/",
      "markdown": "https://connectbyjbrh.com/docs/whatsapp/replying/index.md",
      "title": "Replying on WhatsApp",
      "description": "How a WhatsApp reply is written, what decides whether it is sent or held for approval, and what counts as evidence that it actually went.",
      "summary": "`whatsapp_engine` writes the reply — grounded in Knowledge, memory, what the same person has said on email, phone and SMS, their instructions and the regional style policy — and hands it to `whatsapp.dispatch`. Dispatch asks the autonomy policy, which sends it, queues it for approval, or holds it as a draft. A reply is recorded as sent only once Meta has acknowledged it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/whatsapp/conversation-continuity/",
        "https://connectbyjbrh.com/docs/whatsapp/message-status/",
        "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-send-failed/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "C0190",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/whatsapp/whatsapp-follow-up/",
      "markdown": "https://connectbyjbrh.com/docs/whatsapp/whatsapp-follow-up/index.md",
      "title": "Follow-ups on WhatsApp",
      "description": "Scheduling a WhatsApp follow-up: what can be promised, what Meta's 24-hour window allows, and what happens when the due time arrives and only a template will do.",
      "summary": "A follow-up is a dated commitment on a channel with a reason attached, and `whatsapp` is one of the channels `followups.py` supports. Connect will schedule one and act on it when it is due — but what may be sent at that moment depends on Meta's 24-hour window. Inside it, the message Connect wrote. Outside it, only the approved template the workspace chose for follow-ups, sent under Meta's category for that template.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/whatsapp/replying/",
        "https://connectbyjbrh.com/docs/whatsapp/whatsapp-limits/",
        "https://connectbyjbrh.com/docs/workflows/whatsapp-follow-up-execution/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/research/callback-promises/"
      ]
    },
    {
      "id": "C0193",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/whatsapp/whatsapp-limits/",
      "markdown": "https://connectbyjbrh.com/docs/whatsapp/whatsapp-limits/index.md",
      "title": "What WhatsApp cannot do here",
      "description": "The honest boundaries of WhatsApp in Connect: two things not proven in production, what Meta decides rather than Connect, and the limits that are Connect's own.",
      "summary": "Two things are not proven in production and this page says so first. No WhatsApp number is connected in production, so no outbound message has ever gone to Meta from the live build; and the QR route cannot open Meta's signup there. Inbound, the signature check, automation and approval are proven live against a probe number.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/whatsapp/message-status/",
        "https://connectbyjbrh.com/docs/whatsapp/whatsapp-follow-up/",
        "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-send-failed/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/research/provider-independent-telephony/"
      ]
    },
    {
      "id": "C0194",
      "kind": "capability",
      "url": "https://connectbyjbrh.com/docs/whatsapp/whatsapp-owner-tenant/",
      "markdown": "https://connectbyjbrh.com/docs/whatsapp/whatsapp-owner-tenant/index.md",
      "title": "WhatsApp for the Owner and for a customer",
      "description": "One WhatsApp implementation, two audiences: what the Owner and a customer workspace share, what is separate, and why a test on one proves nothing about the other.",
      "summary": "There is one WhatsApp implementation and both audiences use it. Numbers, credentials, conversations, people, memory and suppressions are per workspace and never shared. The only real differences are commercial — a customer's use is bounded by their plan's allowances, the Owner's is not — and the path a request takes to reach the same code.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/whatsapp/channel-setup/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/research/workspace-stamp/"
      ]
    },
    {
      "id": "W0079",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/index.md",
      "title": "End-to-end workflows",
      "description": "How every end-to-end flow in this manual is documented: the twelve stages, what each promises, how to read the failure column, and the index of every flow.",
      "summary": "Every workflow page here follows one chain of twelve stages, from the trigger to the audit entry, and documents the same four things at each: what you see, what Connect does, what data changes, and what can fail. Read the chain first, then jump to the stage that matches your question. The index further down groups every flow by the channel or surface it belongs to.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/workflows/first-response/",
        "https://connectbyjbrh.com/docs/workflows/regression-check/",
        "https://connectbyjbrh.com/developers/"
      ]
    },
    {
      "id": "W0140",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/a2a-discovery-flow/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/a2a-discovery-flow/index.md",
      "title": "An agent discovering Connect",
      "description": "How another agent finds Connect: fetching the Agent Card from its well-known URL, reading the published skills, and sending a message to one of them.",
      "summary": "An agent fetches one JSON document from a well-known URL, reads the skills it advertises, and sends a message naming one of them. Connect publishes an Agent Card to A2A version 1.0.0 with five public documentation skills and nothing else. Streaming and push notifications are declared as unsupported rather than left ambiguous, so a caller knows before it asks.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/agent-card/",
        "https://connectbyjbrh.com/developers/a2a-integration/",
        "https://connectbyjbrh.com/docs/workflows/mcp-public-search/",
        "https://connectbyjbrh.com/docs/protocols/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/bot-verification/"
      ]
    },
    {
      "id": "W0090",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/account-security-review/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/account-security-review/index.md",
      "title": "Reviewing account security, end to end",
      "description": "A working review of one workspace's access: the sessions, the provider grants, the stored credentials and the audit trail, with the question to ask of each.",
      "summary": "A review has four parts and each has one question. Sessions: is every live one yours? Provider grants: does each connection still hold consent you would give again today? Stored credentials: is anything here a copy of a secret somebody else rotates? The trail: can you still tell who decided what? Nothing in the review needs a support request to complete.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/security-settings/",
        "https://connectbyjbrh.com/docs/account/sessions/",
        "https://connectbyjbrh.com/docs/security/credential-sealing/",
        "https://connectbyjbrh.com/docs/security/audit-access/",
        "https://connectbyjbrh.com/docs/workflows/credential-rotation/",
        "https://connectbyjbrh.com/research/stale-credentials/"
      ]
    },
    {
      "id": "W0057",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/add-knowledge/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/add-knowledge/index.md",
      "title": "Adding a Knowledge source, end to end",
      "description": "From choosing a file to a passage that answers a question: every stage of adding a Knowledge source, with the status the record carries at each.",
      "summary": "Adding a source runs through hashing, extraction, cleaning, scanning, contradiction checking and passage building before anything can be answered from it. Most sources arrive `active` in under a minute. A source that trips the scanner or contradicts approved material lands in `needs_review` instead, and waits for a person rather than quietly changing what Connect says.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/knowledge/extraction/",
        "https://connectbyjbrh.com/docs/knowledge/indexing/",
        "https://connectbyjbrh.com/docs/workflows/knowledge-ingest/",
        "https://connectbyjbrh.com/docs/troubleshooting/source-failed/",
        "https://connectbyjbrh.com/docs/knowledge/source-conflict/"
      ]
    },
    {
      "id": "W0073",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/adding-a-colleague/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/adding-a-colleague/index.md",
      "title": "Adding a colleague, end to end",
      "description": "How a second person gets into a workspace: membership, their own Google sign-in, the role that gates configuration, and what is recorded per person.",
      "summary": "A colleague joins by being made a member of the workspace against the Google address they will sign in with. There is no invitation email and no pending state: a person is a member or is not. Their own first sign-in binds their identity, their session resolves to that workspace, and from then on every approval and every change is recorded against them individually.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/workspace-admin/",
        "https://connectbyjbrh.com/docs/autonomy/permissions/",
        "https://connectbyjbrh.com/docs/workflows/first-sign-in/",
        "https://connectbyjbrh.com/docs/account/sessions/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/getting-started/inviting-your-team/"
      ]
    },
    {
      "id": "W0146",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/ai-citation/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/ai-citation/index.md",
      "title": "An AI search engine citing a page",
      "description": "The chain from crawl to citation to referral: what has to be true at each step, which steps can actually be measured from this side, and which cannot.",
      "summary": "A citation needs four things to be true, in order: the page was fetched, it was retained, it was selected for a particular question, and the answer credited it with a link. Only the first is directly observable from this side. The rest are inferred, and the honest position is that citation share is not something a publisher can measure.",
      "status": "available",
      "audiences": [
        "developer",
        "owner"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/crawler-access/",
        "https://connectbyjbrh.com/research/measuring-ai-visibility/",
        "https://connectbyjbrh.com/research/writing-for-people-and-machines/",
        "https://connectbyjbrh.com/developers/llms-txt-here/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/docs/workflows/docs-verification/"
      ]
    },
    {
      "id": "W0132",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/allowance-enforcement/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/allowance-enforcement/index.md",
      "title": "Enforcing an allowance, end to end",
      "description": "The moment a daily allowance runs out: how the approach is checked, what the refusal says, what is held rather than lost, and how the work resumes.",
      "summary": "The last unit of an allowance is claimed by a conditional update, so two simultaneous attempts cannot both win it. The one that loses gets a coded refusal before any provider is called. Nothing it was carrying is discarded: the draft stays, the approval stays recorded, and mail ingestion holds its read position. At the next daily reset the same work proceeds untouched.",
      "status": "available",
      "audiences": [
        "customer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/usage-metering/",
        "https://connectbyjbrh.com/docs/account/usage/",
        "https://connectbyjbrh.com/docs/troubleshooting/allowance-reached/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/workflows/quota-refusal/",
        "https://connectbyjbrh.com/research/cursor-loss/"
      ]
    },
    {
      "id": "W0061",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/approval-decision/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/approval-decision/index.md",
      "title": "Approving a held action, end to end",
      "description": "A held action from the moment it reaches the queue to the provider's acknowledgement: who may decide, what an edit changes, and what the log keeps.",
      "summary": "Connect prepares an action, the autonomy rule for that channel says a person decides, and the action waits in Needs You with the thing it answers. A member with permission on that channel edits it or leaves it alone, then approves or rejects. Approval runs the action through the same send boundary a person's own send uses, and both the decision and its result land in the decision log.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/approvals/",
        "https://connectbyjbrh.com/docs/autonomy/editing-before-approval/",
        "https://connectbyjbrh.com/docs/autonomy/rejecting/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/troubleshooting/approval-not-appearing/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "W0049",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/assistant-action/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/assistant-action/index.md",
      "title": "Asking the Assistant to do something, end to end",
      "description": "From an instruction to an audited change: how a writing tool becomes a proposal, what the confirmation buys you, and where autonomy re-enters the path.",
      "summary": "Tell the Assistant to do something and it does not do it. It produces a proposal naming the exact change, and waits. Confirming runs the writing tool through the service that owns the record, which applies the same autonomy rules, suppression checks and allowance a screen would apply. The result carries a decision-log entry with your name on it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/action-cards/",
        "https://connectbyjbrh.com/docs/assistant/executing-actions/",
        "https://connectbyjbrh.com/docs/assistant/assistant-authority/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/agent-tools-call-services/"
      ]
    },
    {
      "id": "W0123",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/assistant-context-check/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/assistant-context-check/index.md",
      "title": "Checking the Assistant's screen context",
      "description": "The Assistant is told which screen and record you are on. That claim is checked against the database before it is trusted, and dropped when it does not hold.",
      "summary": "When you ask the Assistant something, the browser sends a claim about where you are: this route, this record. The claim is not believed on sight. It is checked against the database in your workspace before any of it reaches the model, and a claim that does not hold is dropped rather than corrected — which is why an answer can be usefully specific and can also say it does not know what you meant.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/screen-context/",
        "https://connectbyjbrh.com/docs/assistant/record-context/",
        "https://connectbyjbrh.com/docs/assistant/tabs/",
        "https://connectbyjbrh.com/docs/workflows/assistant-question/",
        "https://connectbyjbrh.com/docs/troubleshooting/assistant-wrong-context/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/"
      ]
    },
    {
      "id": "W0051",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/assistant-correction/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/assistant-correction/index.md",
      "title": "Correcting Connect from a conversation, end to end",
      "description": "From a wrong answer to changed behaviour: how a correction typed in conversation becomes a memory at a tier, and what proves it actually took effect.",
      "summary": "Tell the Assistant it is wrong and the correction becomes a proposal to write a memory, showing the wording and the tier before anything is stored. Confirming writes it through the memory service. The proof it worked is not the acknowledgement in the chat — it is the fact appearing in Memory and the next answer drawing on the new wording instead of the old.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/assistant-memory/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/assistant/source-conflict/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/"
      ]
    },
    {
      "id": "W0050",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/assistant-file/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/assistant-file/index.md",
      "title": "Working on a file with the Assistant, end to end",
      "description": "Attaching a file to the Assistant and working on it: validation, extraction, the answer, the new version, and where the file ends up linked.",
      "summary": "Attach a file by button, drop or paste. It is validated before anything parses it, read with the standard library for its format, and answered from. If you ask for a change, the Assistant proposes one and writes it as a new version — the original is never overwritten — and the file stays linked to whatever record the tab was working on.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/files-in-assistant/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/workflows/upload-and-answer/",
        "https://connectbyjbrh.com/research/files-through-one-service/"
      ]
    },
    {
      "id": "W0048",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/assistant-question/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/assistant-question/index.md",
      "title": "Asking the Assistant a question, end to end",
      "description": "A question typed into the Assistant, followed all the way to a grounded answer: what runs at each stage, what it costs, and where an answer loses its citations.",
      "summary": "You type a question, the Assistant resolves your workspace, checks what it has been told is on your screen against the database, chooses read-only tools, assembles knowledge and memory within a fixed budget, answers, and shows what the answer rests on. Nothing is written. The whole path changes no record, so it needs no approval and produces no Needs You item.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/read-only-answers/",
        "https://connectbyjbrh.com/docs/assistant/evidence-and-citation/",
        "https://connectbyjbrh.com/docs/workflows/assistant-action/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/research/grounding-without-a-vector-database/"
      ]
    },
    {
      "id": "W0052",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/assistant-undo/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/assistant-undo/index.md",
      "title": "Undoing an action, end to end",
      "description": "Undoing an Assistant action: the three outcomes — reversed, compensated, or recorded only — and how to tell which one your action will get.",
      "summary": "Undo asks for the opposite of what was done, and gets one of three answers. A record created inside the workspace is reversed. Something that left an effect elsewhere is compensated — a new action that corrects it. Something that reached another person cannot be recalled at all, and undo records the intention rather than pretending. Which one you get depends on where the action landed.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/undo/",
        "https://connectbyjbrh.com/docs/workflows/assistant-action/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/research/undo-for-agents/"
      ]
    },
    {
      "id": "W0062",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/autonomy-change/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/autonomy-change/index.md",
      "title": "Changing what Connect may do, end to end",
      "description": "Changing an autonomy rule end to end: what takes effect at once, what the change cannot reach backwards, and where the change itself is recorded.",
      "summary": "You pick a channel, a scope and a mode, and the new rule governs the next piece of work Connect picks up. It does not release anything already waiting for a decision, it does not un-send anything already sent, and it never overrides a gate. The change is itself written to the decision log with who made it, so a widened permission is as visible afterwards as the actions it allows.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/scopes/",
        "https://connectbyjbrh.com/docs/autonomy/explicit-gates/",
        "https://connectbyjbrh.com/docs/autonomy/permissions/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/workflows/stopping-connect/",
        "https://connectbyjbrh.com/docs/troubleshooting/unexpected-autonomous-action/"
      ]
    },
    {
      "id": "W0055",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/blocking-someone/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/blocking-someone/index.md",
      "title": "Blocking a contact, end to end",
      "description": "One tag on one memory row, and what it stops across email, WhatsApp, SMS and voice — including the browser line a colleague dials from.",
      "summary": "Blocking somebody is one memory row against the contact, tagged `block:<channel>`. From the next piece of work Connect will not initiate or reply on the channels the tag names, on any path — including a call placed from a colleague's browser. Their messages still reach you, which is deliberate: a block controls what the business sends, not what it receives.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/directives/",
        "https://connectbyjbrh.com/docs/memory/deleting/",
        "https://connectbyjbrh.com/docs/memory/person-memory/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "W0103",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/bounce-handling/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/bounce-handling/index.md",
      "title": "Handling a bounce, end to end",
      "description": "A bounced message from the notification to the record: how permanent and temporary failures are told apart, what changes on the address, and what is never retried.",
      "summary": "A bounce says the message did not reach the recipient, and the first job is to decide whether that is permanent or temporary. A permanent bounce suppresses the recipient and changes what the person's record claims about reaching them. A temporary one leaves it alone. Neither produces an automatic loop of re-sends, and neither is a reason to invent a different one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/bounces/",
        "https://connectbyjbrh.com/docs/workflows/suppression-application/",
        "https://connectbyjbrh.com/docs/email/deliverability/",
        "https://connectbyjbrh.com/docs/prospects/contactability/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/"
      ]
    },
    {
      "id": "W0008",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/browser-call/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/browser-call/index.md",
      "title": "Making a call from the browser",
      "description": "A person dialling from the browser: the SIP registration, the invite that does not dial the number in it, the bridge, and what is recorded as human-owned.",
      "summary": "A browser line is a `channel_routes` row with `channel='softphone'`, registered over SIP-to-WebSocket with a per-person endpoint. Pressing dial sends an invite the carrier does not act on directly: it posts to the same answer URL a customer's call arrives on, marked as outbound, and Connect answers with a dial instruction under the business's own line. The bridged leg is a call owned by the person, not the engine.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "softphone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/outbound-phone-call/",
        "https://connectbyjbrh.com/docs/workflows/first-phone-setup/",
        "https://connectbyjbrh.com/docs/troubleshooting/phone-line-not-ringing/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/provider-independent-telephony/"
      ]
    },
    {
      "id": "W0133",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/budget-guard/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/budget-guard/index.md",
      "title": "The AI budget guard, end to end",
      "description": "The AI budget guard on the voice path: when it is asked, what it refuses, what a caller hears instead of silence, and how a call gets through again.",
      "summary": "The guard is asked twice: before an outbound call is placed, and before an inbound one is answered. It refuses for two reasons — the AI budget is spent, or the model account itself is refusing — and both used to sound identical to a caller, because both were silence. A refused inbound call is now answered, given the closed-line message in the business's own voice, and recorded.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/voice-budget/",
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/docs/troubleshooting/budget-exhausted/",
        "https://connectbyjbrh.com/docs/workflows/quota-breaker/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-answered-in-silence/",
        "https://connectbyjbrh.com/docs/phone/line-off/"
      ]
    },
    {
      "id": "W0069",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/bulk-edit/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/bulk-edit/index.md",
      "title": "Editing many records at once, end to end",
      "description": "Selecting many rows in the Data grid and changing them together: how a selection becomes one service call per record, and what a partial result means.",
      "summary": "A bulk edit is not one write. The grid turns your selection into one call per record against the service that owns that record, applies each on its own, and reports what happened row by row. Nothing is written by the grid itself, so a field a service refuses from its own screen is refused here too — and a run that changes forty rows out of fifty is a normal outcome, not a fault.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/bulk-actions/",
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/files-data/inline-edit/",
        "https://connectbyjbrh.com/docs/workflows/data-grid-edit/",
        "https://connectbyjbrh.com/docs/troubleshooting/grid-edit-refused/",
        "https://connectbyjbrh.com/research/grid-over-services/"
      ]
    },
    {
      "id": "W0095",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/burst-ingest/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/burst-ingest/index.md",
      "title": "Ingesting a burst of mail, end to end",
      "description": "Hundreds of messages arriving at once: how they are taken in, the order they are processed, what the allowance holds back, and why no wave of replies follows.",
      "summary": "A burst is taken in as bounded passes rather than one enormous read, oldest message first, each becoming a canonical record before the read position moves past it. The daily allowance decides how much is processed today and holds the rest. Ingest and sending are separate gates, so several hundred arriving messages never become several hundred replies leaving at once.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/burst-handling/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/workflows/quota-refusal/",
        "https://connectbyjbrh.com/docs/email/triage/",
        "https://connectbyjbrh.com/research/single-thinker/"
      ]
    },
    {
      "id": "W0007",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/call-escalation/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/call-escalation/index.md",
      "title": "Escalating a call to a person",
      "description": "When a caller asks for a person: what is queued, what the caller hears, what a colleague can do on the live call, and what a completed transfer still depends on.",
      "summary": "An escalation phrase queues a transfer and puts the call in front of a colleague, who can steer, pause or take it over from the supervisor panel while it is still live. What it does not do on the live carrier is hand the caller to a person's handset: a completed warm transfer depends on a provider capability that is not enabled. The escalation is real; the handover is narrower than the word suggests.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/inbound-phone-call/",
        "https://connectbyjbrh.com/docs/workflows/phone-follow-up-execution/",
        "https://connectbyjbrh.com/research/derived-control-state/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-cut-short/"
      ]
    },
    {
      "id": "W0010",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/call-recovery/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/call-recovery/index.md",
      "title": "Recovering a failed call",
      "description": "Every way a call can fail on this path and the recovery for each, in the order the failures are detected — from admission control to a late provider webhook.",
      "summary": "Failures on a call path arrive in a fixed order, and the recovery differs at every point: before the ring a refusal is retryable, during the greeting a failure ends the call rather than leaving silence, mid-call a dropped session reconnects carrying the conversation, and after the ending the digest runs in the background. Knowing which stage failed tells you whether to wait, retry or change something.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/call-never-rang/",
        "https://connectbyjbrh.com/docs/troubleshooting/model-session-failed/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-answered-in-silence/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
        "https://connectbyjbrh.com/docs/workflows/inbound-phone-call/"
      ]
    },
    {
      "id": "W0154",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/call-review-cycle/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/call-review-cycle/index.md",
      "title": "Reviewing calls as a routine",
      "description": "A weekly pass over the call record: which fields to read first, what each pattern points at, and which findings a setting can fix rather than the model deciding.",
      "summary": "Read four things each week: how calls ended and who ended them, which calls were never conversations at all, promises with no booking behind them, and reply latency. Each points somewhere specific — attribution at a line or a model problem, unbooked promises at the wording of the instructions, latency at a floor no setting moves.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/phone/call-outcome/",
        "https://connectbyjbrh.com/docs/phone/hangup-attribution/",
        "https://connectbyjbrh.com/docs/workflows/voice-tuning-cycle/",
        "https://connectbyjbrh.com/research/model-limited-findings/",
        "https://connectbyjbrh.com/research/callback-promises/"
      ]
    },
    {
      "id": "W0006",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/call-to-relationship/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/call-to-relationship/index.md",
      "title": "From a call to a customer relationship",
      "description": "What survives a phone call: the person, the company, the timeline entry and the next action, and the rules that stop each of them being invented.",
      "summary": "When a call ends, `voice.end_call` turns it into things that outlive it: a summary, a lead, a memory and a follow-up. Each has a rule that refuses it. A call that was never a conversation produces no lead, a call with almost no caller speech is never summarised, and a form of address is never stored as somebody's name. What is left is a relationship, not a transcript.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/inbound-phone-call/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/one-person-many-channels/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/workflows/phone-follow-up-execution/"
      ]
    },
    {
      "id": "W0118",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/channel-configuration/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/channel-configuration/index.md",
      "title": "Configuring a channel, end to end",
      "description": "The shape every channel setup shares in Connect — identity, credentials, routing, rules, verification — and the specific places email, WhatsApp, phone and SMS differ.",
      "summary": "Every channel is configured the same way: prove who you are to the provider, give Connect credentials it seals immediately, route the address or number to one workspace, set the autonomy rule, then verify with real traffic. What differs is who grants the identity and what they can refuse. Following that order makes a channel that does not work diagnosable in one pass.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "sms",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/channel-verification/",
        "https://connectbyjbrh.com/docs/workflows/channel-failure/",
        "https://connectbyjbrh.com/docs/whatsapp/channel-setup/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "W0121",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/channel-failure/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/channel-failure/index.md",
      "title": "A channel provider going down",
      "description": "What happens when a channel's provider stops answering: how the failure is detected, what stops attempting, what carries on regardless, and how recovery works.",
      "summary": "A provider outage surfaces as health rather than as silence. The channel's own signal — a mailbox that has stopped fetching, a line that is not ready — escalates into Needs You, outbound work on that channel is refused with a reason instead of being retried into a wall, and everything on the other channels carries on untouched. Recovery drains the held work by itself as the cause clears.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "sms",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/channel-verification/",
        "https://connectbyjbrh.com/docs/workflows/channel-configuration/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/troubleshooting/sms-not-sending/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "W0119",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/channel-verification/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/channel-verification/index.md",
      "title": "Verifying a channel actually works",
      "description": "The one test that proves each channel is really working, what each test does not prove, and why a saved setting and a green screen are not evidence.",
      "summary": "Send one real message in each direction and watch where it lands. A saved credential proves somebody typed something; a health indicator proves a connection was accepted. Neither proves that a customer's message reaches the right workspace, attaches to the right person and produces the decision you expect. Only traffic proves that, and each channel has a different half it cannot prove.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "sms",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/channel-configuration/",
        "https://connectbyjbrh.com/docs/workflows/channel-failure/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
        "https://connectbyjbrh.com/research/invisible-ui-defects/"
      ]
    },
    {
      "id": "W0029",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/client-to-support/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/client-to-support/index.md",
      "title": "From client to support, end to end",
      "description": "What carries over when a deal is won: onboarding, the first support case, and the continuity that depends on one person record rather than two.",
      "summary": "Winning a deal moves the relationship to *client*, a move Connect may propose and a person confirms. Onboarding follows, then ordinary support: a case is opened against the same person, answered from the same knowledge, and resolved. Nothing is handed over between systems, because the sale and the support were always the same record.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/cases/",
        "https://connectbyjbrh.com/docs/support/onboarding/",
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/",
        "https://connectbyjbrh.com/docs/sales/won-and-lost/",
        "https://connectbyjbrh.com/docs/follow-ups/reason/",
        "https://connectbyjbrh.com/docs/relationships/cross-channel-identity/",
        "https://connectbyjbrh.com/docs/workflows/won-deal-handover/"
      ]
    },
    {
      "id": "W0034",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/close-deal/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/close-deal/index.md",
      "title": "Closing a deal, end to end",
      "description": "What changes when an opportunity is marked won or lost: the stage rules, the stored value, the follow-ups that stop, and what picks the person up next.",
      "summary": "Closing is a stage move like any other, so `move` applies the same stage rules and refuses a close it cannot satisfy. Won hands the person to onboarding and support; lost stops the chasing. Both settle the value, deal with the deal's open follow-ups, and leave a record of who decided and when — which is the part that gets asked about months later.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/won-and-lost/",
        "https://connectbyjbrh.com/docs/sales/stage-rules/",
        "https://connectbyjbrh.com/docs/sales/pipeline/",
        "https://connectbyjbrh.com/docs/support/onboarding/",
        "https://connectbyjbrh.com/docs/follow-ups/completion/",
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/"
      ]
    },
    {
      "id": "W0115",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/commercial-decision/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/commercial-decision/index.md",
      "title": "A commercial decision reaching a person",
      "description": "What happens when a customer asks a price, a warranty or a deadline that Knowledge does not support: the refusal, the escalation, the human decision and the reply.",
      "summary": "Connect does not invent commercial terms. A price, service level or warranty that the workspace's Knowledge does not support is refused, and the question is escalated to a person with the customer's words attached. The refusal is recorded as a decision. A person answers, the reply goes back on the original thread, and the answer can be added to Knowledge so the next one is grounded.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/sales/commercial-escalation/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/",
        "https://connectbyjbrh.com/docs/knowledge/unsupported-claims/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/workflows/escalation/",
        "https://connectbyjbrh.com/docs/knowledge/facts/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/"
      ]
    },
    {
      "id": "W0033",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/commercial-question/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/commercial-question/index.md",
      "title": "Answering a commercial question, end to end",
      "description": "A customer asks what it costs: the grounded answer, the refusal, the escalation, the human decision, and how the same question stops recurring.",
      "summary": "The question is answered from your own sources where they cover it, and refused where they do not. A refusal is not silence: everything answerable is answered, the commercial part goes to a person with the conversation attached, and the promise to come back becomes a dated commitment rather than a phrase.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/safe-sales/",
        "https://connectbyjbrh.com/docs/sales/commercial-escalation/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/troubleshooting/connect-refused-to-quote/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/",
        "https://connectbyjbrh.com/docs/phone/realtime-engine/"
      ]
    },
    {
      "id": "W0150",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/complaint-escalation/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/complaint-escalation/index.md",
      "title": "Escalating a complaint, end to end",
      "description": "How a complaint is recognised on any channel, who it reaches, what Connect commits to on the business's behalf, and what it deliberately refuses to promise.",
      "summary": "A complaint is handled as a case rather than as a message. Connect acknowledges it in the conversation, opens a support case against the person, puts it in front of somebody with the conversation attached, and schedules a follow-up that carries its reason. What it does not do is agree a remedy, a refund or a timescale the business has not authorised.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/workflows/out-of-scope-request/",
        "https://connectbyjbrh.com/docs/workflows/service-interruption/",
        "https://connectbyjbrh.com/research/relationship-memory/"
      ]
    },
    {
      "id": "W0102",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/complaint-handling/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/complaint-handling/index.md",
      "title": "Handling a spam complaint, end to end",
      "description": "A spam complaint from the moment it arrives: how the recipient is identified, what is suppressed, and what it should change about the way a workspace sends.",
      "summary": "A complaint arrives as a notification from a mail provider rather than as a message from the person. Connect identifies the recipient, records a suppression carrying *complaint* as its origin, and every later outreach to that address is refused by the one compliance check. The second half is the part that matters longer: a complaint is evidence about how a workspace sends, not only about who it sent to.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/complaints/",
        "https://connectbyjbrh.com/docs/email/deliverability/",
        "https://connectbyjbrh.com/docs/workflows/suppression-application/",
        "https://connectbyjbrh.com/docs/workflows/bounce-handling/",
        "https://connectbyjbrh.com/docs/prospects/compliance-check/"
      ]
    },
    {
      "id": "W0013",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/connect-gmail-workflow/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/connect-gmail-workflow/index.md",
      "title": "Connecting Gmail, end to end",
      "description": "Connecting a Google mailbox from the consent screen to the first synced thread, with the evidence that proves each step actually happened.",
      "summary": "You start the connection from the Mailboxes screen, consent at Google, and come back to a mailbox row that holds sealed tokens rather than a password. The first sync then proves the connection is real. Connecting a mailbox is a separate consent from signing in to Connect, and revoking one does not revoke the other.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/connect-gmail/",
        "https://connectbyjbrh.com/docs/email/gmail-scopes/",
        "https://connectbyjbrh.com/docs/email/mailboxes/",
        "https://connectbyjbrh.com/docs/workflows/connect-imap-workflow/",
        "https://connectbyjbrh.com/docs/workflows/mailbox-role-assignment/",
        "https://connectbyjbrh.com/docs/troubleshooting/reconnect-required/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/"
      ]
    },
    {
      "id": "W0014",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/connect-imap-workflow/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/connect-imap-workflow/index.md",
      "title": "Connecting an IMAP mailbox, end to end",
      "description": "Connecting a plain IMAP and SMTP mailbox: what you supply, the two separate proofs that must pass, and what a half-working connection looks like.",
      "summary": "Any IMAP and SMTP server can be connected. You supply the server settings on the connection form; Connect seals them and builds a transport from them. Reading and sending are two different connections, so they are proved separately: a sync that returns mail proves one, and a message the server acknowledges proves the other.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/connect-imap-smtp/",
        "https://connectbyjbrh.com/docs/email/imap-cursor/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/workflows/connect-gmail-workflow/",
        "https://connectbyjbrh.com/docs/workflows/imap-cursor-advance/",
        "https://connectbyjbrh.com/docs/troubleshooting/send-failed/",
        "https://connectbyjbrh.com/docs/email/microsoft-graph/"
      ]
    },
    {
      "id": "W0106",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/contact-discovery/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/contact-discovery/index.md",
      "title": "Finding a contact address, end to end",
      "description": "How Connect finds an address to write to, what it records about where the address came from, and why it will not construct one from a naming pattern.",
      "summary": "Connect looks for an address that a public source actually states, records where it found it, and attaches that evidence to the prospect. It does not construct one from a company's naming pattern — no invented address is produced, tested or written to. A prospect with no discoverable address stays a researched prospect with a different next action.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/docs/prospects/contact-evidence/",
        "https://connectbyjbrh.com/docs/prospects/contactability/",
        "https://connectbyjbrh.com/docs/prospects/decision-makers/",
        "https://connectbyjbrh.com/docs/workflows/keeping-a-prospect-without-email/",
        "https://connectbyjbrh.com/docs/prospects/compliance-check/",
        "https://connectbyjbrh.com/docs/workflows/sender-readiness-check/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/"
      ]
    },
    {
      "id": "W0145",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/crawler-access/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/crawler-access/index.md",
      "title": "A search crawler fetching a page",
      "description": "What a search crawler receives from this site, what it does not, how policy differs for search, user fetches and training, and how a bot proves who it claims to be.",
      "summary": "A crawler gets what a reader gets: the whole page as HTML, served without JavaScript, a cookie or a sign-in. Policy is set by purpose rather than by company — search crawling and user-initiated fetches are allowed, model-training crawlers are a deliberate decision recorded separately — and identity is settled by verifying the fetch, never by trusting the user-agent string.",
      "status": "available",
      "audiences": [
        "developer",
        "owner"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/crawler-policy/",
        "https://connectbyjbrh.com/developers/bot-verification/",
        "https://connectbyjbrh.com/docs/workflows/ai-citation/",
        "https://connectbyjbrh.com/docs/workflows/docs-verification/",
        "https://connectbyjbrh.com/research/measuring-ai-visibility/",
        "https://connectbyjbrh.com/developers/llms-txt-here/"
      ]
    },
    {
      "id": "W0067",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/create-document/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/create-document/index.md",
      "title": "Creating a document, end to end",
      "description": "From asking for a document to a produced file sitting on the right record: what is resolved, what is proposed, what is written, and what is deliberately left blank.",
      "summary": "You describe the document you want. Connect resolves the record it is about, assembles the contents from material it can point at, and shows you a proposal — including the fields it could not fill. On your confirmation `create_file` writes version 1 into the workspace file store, the audit records who allowed it, and the file can then be linked where it belongs.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/create-file/",
        "https://connectbyjbrh.com/docs/files-data/linking-files/",
        "https://connectbyjbrh.com/docs/workflows/modify-document/",
        "https://connectbyjbrh.com/docs/assistant/action-cards/",
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "W0035",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/create-follow-up/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/create-follow-up/index.md",
      "title": "Creating a follow-up, end to end",
      "description": "From a promise made out loud to a scheduled row: the guard on the time, the channel decision, the duplicate test, and what each stage records.",
      "summary": "A commitment is spoken or written; the guard checks the proposed time against what was actually said; `due_at` resolves it in the line's timezone; `follow_up_channel` picks the channel; `schedule` writes one row — unless that person already has one at that instant. The path is built to fail loudly rather than book a time nobody named.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email",
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/creating/",
        "https://connectbyjbrh.com/docs/follow-ups/due-time/",
        "https://connectbyjbrh.com/docs/follow-ups/duplicates/",
        "https://connectbyjbrh.com/docs/workflows/execute-follow-up/",
        "https://connectbyjbrh.com/docs/follow-ups/channel-choice/",
        "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-booked/"
      ]
    },
    {
      "id": "W0031",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/create-opportunity/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/create-opportunity/index.md",
      "title": "Creating an opportunity, end to end",
      "description": "From a sentence in a conversation to a deal on the board with its first commitment: every stage, what changes, and what can fail on the way.",
      "summary": "Somebody signals intent, a person or the Assistant opens a deal against the relationship it came from, a value in minor units is set where one is known, and the first next action becomes a dated commitment. No message goes out as a side effect of creating the record — the sale becomes visible before anything is said about it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/opportunities/",
        "https://connectbyjbrh.com/docs/sales/pipeline/",
        "https://connectbyjbrh.com/docs/workflows/move-opportunity/",
        "https://connectbyjbrh.com/docs/workflows/email-to-opportunity/",
        "https://connectbyjbrh.com/docs/sales/sales-follow-ups/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/"
      ]
    },
    {
      "id": "W0077",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/credential-rotation/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/credential-rotation/index.md",
      "title": "Rotating a provider credential, end to end",
      "description": "Replacing a provider credential in a workspace: what happens on save, how to verify a value you can never read back, and what becomes of work in flight.",
      "summary": "A new credential is entered once, sealed on save, and never rendered back to any screen. Verification is therefore behavioural rather than visual: the next operation on that channel either succeeds against the provider or it does not. Work already accepted by the provider finishes under the old value; work not yet handed over uses the new one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/credential-sealing/",
        "https://connectbyjbrh.com/research/stale-credentials/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/troubleshooting/integration-disconnected/",
        "https://connectbyjbrh.com/docs/workflows/incident-response/"
      ]
    },
    {
      "id": "W0030",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/cross-channel-continuity/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/cross-channel-continuity/index.md",
      "title": "Continuing one conversation on another channel",
      "description": "What happens when someone who emailed last week rings instead: how the same person is recognised, and exactly which context follows them.",
      "summary": "A channel change is not a new conversation. The address the person arrives on — a number, a mailbox, a WhatsApp handle — resolves to an Identity, the Identity resolves to a Person, and that Person's memory, stage, open follow-ups and deals are what Connect reasons with. The message thread stays per channel. The relationship does not.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/cross-channel-identity/",
        "https://connectbyjbrh.com/docs/relationships/identities/",
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/research/one-person-many-channels/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-person-matched/"
      ]
    },
    {
      "id": "W0120",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/cross-channel-handover/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/cross-channel-handover/index.md",
      "title": "Continuing on a different channel",
      "description": "Continuing a conversation on a different channel: what history carries over, what has to be re-established, and the identity check that decides both.",
      "summary": "History carries over when the new channel's address resolves to the same Person, because everything durable is stored against the person rather than against a conversation. What does not carry is the conversation itself: a call is not a thread, and the new exchange starts as its own record on a shared timeline. Identity resolution is the hinge the whole handover turns on.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "sms",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/cross-channel-identity/",
        "https://connectbyjbrh.com/docs/workflows/cross-channel-continuity/",
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/workflows/dnc-across-channels/",
        "https://connectbyjbrh.com/research/one-person-many-channels/",
        "https://connectbyjbrh.com/docs/workflows/channel-configuration/"
      ]
    },
    {
      "id": "W0113",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/customer-360-assembly/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/customer-360-assembly/index.md",
      "title": "Assembling a Customer 360, end to end",
      "description": "Every store a Customer 360 reads to build one person's whole history, and why the cost of assembling it is counted in database statements.",
      "summary": "A Customer 360 is a read, not a report: it resolves one Person, gathers every identity that points at them, and pulls their conversations, calls, deals, demos, cases, onboarding, follow-ups and memory into one view. No provider is called and nothing is written. The engineering question is not whether it works but how many database statements it costs.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/relationships/relationship-story/",
        "https://connectbyjbrh.com/docs/workflows/timeline-assembly/",
        "https://connectbyjbrh.com/docs/workflows/identity-merge-decision/",
        "https://connectbyjbrh.com/research/n-plus-one-that-grows/"
      ]
    },
    {
      "id": "W0130",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/data-grid-edit/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/data-grid-edit/index.md",
      "title": "Editing a record in the grid, end to end",
      "description": "One cell, changed: what the grid sends, which service decides, what comes back into the row, and the audit entry that survives the browser tab.",
      "summary": "Typing into a cell sends one change to the service that owns that record. The grid paints your value immediately so the sheet stays usable, then replaces it with whatever the service stored — which is not always what you typed, because a service may normalise a value as well as accept it. The stored record is the answer, and the row shows it within the same interaction.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/inline-edit/",
        "https://connectbyjbrh.com/docs/files-data/data-grid/",
        "https://connectbyjbrh.com/docs/files-data/data-sorting-grouping/",
        "https://connectbyjbrh.com/docs/files-data/saved-views/",
        "https://connectbyjbrh.com/docs/workflows/bulk-edit/",
        "https://connectbyjbrh.com/docs/troubleshooting/grid-edit-refused/"
      ]
    },
    {
      "id": "W0070",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/data-import/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/data-import/index.md",
      "title": "Importing records, end to end",
      "description": "Bringing records in from a spreadsheet: how a file becomes validated rows, how duplicates are matched, and what happens to rows that do not qualify.",
      "summary": "An import is read, validated and then applied one record at a time through the service that owns that record type. The file is never written straight into a table. Rows that fail validation and rows that match something already held are both reported rather than silently dropped, and the count that arrives is usually smaller than the count in the file, for reasons the report names.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/data-import-export/",
        "https://connectbyjbrh.com/docs/files-data/data-duplicates/",
        "https://connectbyjbrh.com/docs/troubleshooting/import-rows-dropped/",
        "https://connectbyjbrh.com/docs/workflows/bulk-edit/",
        "https://connectbyjbrh.com/docs/files-data/supported-formats/",
        "https://connectbyjbrh.com/docs/prospects/"
      ]
    },
    {
      "id": "W0152",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/data-request/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/data-request/index.md",
      "title": "Answering a customer's data request",
      "description": "What Connect can produce when somebody asks for their data: which records, in what format, from where — and the limits, including what sits outside a workspace by design.",
      "summary": "Everything a workspace holds about one person is reachable from that person's own record and exportable from the record sheets as CSV. What cannot be produced is anything outside the workspace — including website enquiries addressed to the operator, which deliberately belong to no workspace. Whether a request must be answered at all stays a decision for the business.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/workflows/complaint-escalation/"
      ]
    },
    {
      "id": "W0108",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/deep-research-flow/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/deep-research-flow/index.md",
      "title": "Running deep research, end to end",
      "description": "When a second, deeper research pass is run on one prospect, what decides that it is worth paying for, what it produces, and where the output is attached.",
      "summary": "A deeper pass runs where it could change a decision and not where it would only add detail. It is triggered by an undecided qualification or by a person asking for one prospect, it produces claims that each carry a source, and everything it finds attaches to that prospect's record — not to the workspace's Knowledge, which is a different thing entirely.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/deep-research/",
        "https://connectbyjbrh.com/docs/prospects/public-source-research/",
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/prospects/prospect-costs/",
        "https://connectbyjbrh.com/docs/prospects/prospect-freshness/",
        "https://connectbyjbrh.com/docs/troubleshooting/prospect-allowance/",
        "https://connectbyjbrh.com/docs/workflows/prospect-qualification-flow/",
        "https://connectbyjbrh.com/research/research-cost-routing/"
      ]
    },
    {
      "id": "W0116",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/demo-request/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/demo-request/index.md",
      "title": "Handling a demo request, end to end",
      "description": "From a customer asking to see the product to a dated commitment somebody will actually keep: the record, the confirmation, the reminder and the outcome.",
      "summary": "A demo request becomes two things: a demo record attached to the person and, usually, an opportunity; and a dated follow-up carrying the reason it exists. The confirmation to the customer goes out under the channel's autonomy rule. Connect writes no external calendar entry — the commitment is the record plus the message you send, and the follow-up is what makes anybody act on it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/opportunities/",
        "https://connectbyjbrh.com/docs/follow-ups/creating/",
        "https://connectbyjbrh.com/docs/follow-ups/reason/",
        "https://connectbyjbrh.com/docs/follow-ups/task-channel/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/sales/stage-rules/",
        "https://connectbyjbrh.com/docs/workflows/won-deal-handover/",
        "https://connectbyjbrh.com/docs/relationships/merging/"
      ]
    },
    {
      "id": "W0047",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/dlt-registration/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/dlt-registration/index.md",
      "title": "Preparing for DLT, end to end",
      "description": "Preparing for DLT in India: what a business gathers, in what order the three registrations must be obtained, and what Connect stores once they are granted.",
      "summary": "Registration runs outside Connect, with the telecom operators, in a fixed order: the entity first, then a header under it, then a template under that. Connect's part begins only at the end, when the granted values are recorded at `#/dlt` so messages can be composed against them. Nothing on that screen applies for anything, and no registration removes the separate problem that the live carrier carries no SMS.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/dlt/",
        "https://connectbyjbrh.com/docs/sms/sms-outbound-status/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/troubleshooting/sms-not-sending/",
        "https://connectbyjbrh.com/docs/workflows/channel-configuration/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "W0122",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/dnc-across-channels/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/dnc-across-channels/index.md",
      "title": "A do-not-contact reaching every channel",
      "description": "One do-not-contact directive that reaches email, WhatsApp, SMS, phone and prospect outreach: where it is stored, why it holds, and what the audit trail shows.",
      "summary": "A do-not-contact directive is one memory row against the contact, carrying `block:<channel>` in its tag list. `directives()` reads only tags, which is why the refusal holds on every channel and in every future conversation rather than living in one channel's settings. Every attempt to reach that person afterwards ends in a refusal recorded with its reason, not in silence.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "sms",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/stop/",
        "https://connectbyjbrh.com/docs/sms/sms-suppression/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/workflows/sms-stop/",
        "https://connectbyjbrh.com/docs/email/dnc/",
        "https://connectbyjbrh.com/docs/workflows/cross-channel-handover/"
      ]
    },
    {
      "id": "W0143",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/docs-publication/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/docs-publication/index.md",
      "title": "Publishing a documentation change",
      "description": "How a documentation change reaches the public site: one source, the gate, generated HTML and Markdown, the manifests, the sitemaps, and IndexNow last of all.",
      "summary": "A page is written once in the documentation source and generated into everything else: HTML, a Markdown twin, the machine manifests, the sitemap set and the discovery files. The gate runs before any of it is committed. The generated tree is committed alongside the source, because production serves static files, and IndexNow is told last — after the live pages have been checked.",
      "status": "available",
      "audiences": [
        "developer",
        "owner"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/docs-verification/",
        "https://connectbyjbrh.com/docs/workflows/indexnow-submission/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/developers/markdown-mirrors/",
        "https://connectbyjbrh.com/research/documentation-as-a-build/",
        "https://connectbyjbrh.com/developers/changelog-feed/"
      ]
    },
    {
      "id": "W0144",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/docs-verification/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/docs-verification/index.md",
      "title": "Verifying published documentation",
      "description": "Every check run before and after a documentation change ships: the gate, the link graph, structured data, the built tree, and the fetch-as-a-crawler probe.",
      "summary": "Verification happens twice. Before publication the gate runs over the registry — shape, claims, links, search intent — and refuses anything malformed. After the deploy the checks move to the live tree: built HTML and its Markdown twin, structured data that agrees with the visible page, sitemaps that match the corpus, and a fetch as each target crawler. Only then is anything submitted.",
      "status": "available",
      "audiences": [
        "developer",
        "owner"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/docs-publication/",
        "https://connectbyjbrh.com/docs/workflows/indexnow-submission/",
        "https://connectbyjbrh.com/docs/workflows/crawler-access/",
        "https://connectbyjbrh.com/research/measuring-ai-visibility/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/research/probes-that-cry-wolf/"
      ]
    },
    {
      "id": "W0098",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/draft-regeneration/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/draft-regeneration/index.md",
      "title": "Regenerating a draft, end to end",
      "description": "Asking Connect to write a reply again: what is thrown away, what survives untouched, what the second attempt is given that the first was not, and when to stop.",
      "summary": "Regenerating discards the draft text and nothing else. The thread, its mailbox, the person, the guidance and the memory all survive, and the second attempt is written against the thread as it stands now — including messages that arrived after the first draft. If nothing has changed and nothing new has been said, expect a similar answer rather than a better one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/regenerate-draft/",
        "https://connectbyjbrh.com/docs/email/edit-draft/",
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/workflows/email-reply-approval/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/"
      ]
    },
    {
      "id": "W0027",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/duplicate-merge/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/duplicate-merge/index.md",
      "title": "Merging duplicate people, end to end",
      "description": "From a duplicate proposal to one merged record: every stage, the human decision in the middle, and how to verify the result afterwards.",
      "summary": "A pair is proposed or found, a person reads both records and accepts, and `merge_people` folds them into one — carrying identities, stages, follow-ups, deals, demos, cases and onboarding across. No provider takes part, nothing is sent, and the customer sees nothing. The only irreversible step is the one a human takes deliberately.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/duplicates/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/relationships/merge-safety/",
        "https://connectbyjbrh.com/docs/troubleshooting/duplicate-not-detected/",
        "https://connectbyjbrh.com/docs/workflows/identity-merge-decision/",
        "https://connectbyjbrh.com/docs/relationships/timeline/"
      ]
    },
    {
      "id": "W0016",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/email-follow-up-execution/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/email-follow-up-execution/index.md",
      "title": "An email follow-up, end to end",
      "description": "A dated commitment becoming a sent email: where the follow-up came from, which gates it passes, and why a retry cannot send it twice.",
      "summary": "A follow-up is a dated commitment with a reason attached to a person. When it falls due, the drain writes the message and puts it through the same gates as any other outbound email: compliance, autonomy, allowance, then `outbound.py`. The commitment is one record with one outcome, which is what stops a retry sending it twice.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/email-follow-up/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/workflows/email-reply-approval/",
        "https://connectbyjbrh.com/docs/email/sending/",
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/workflows/quota-refusal/",
        "https://connectbyjbrh.com/docs/workflows/email-to-opportunity/"
      ]
    },
    {
      "id": "W0012",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/email-reply-approval/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/email-reply-approval/index.md",
      "title": "Drafting and approving a reply, end to end",
      "description": "From an arriving message to a sent reply, with the autonomy gate in the middle: what is drafted, what is held, who releases it, what proves it went.",
      "summary": "Connect drafts a reply on every thread it is allowed to answer, then asks one question before sending: what does autonomy say at the narrowest scope that has a rule? `autonomous` sends through `outbound.py`; `ask_before_send` puts the finished reply in Needs You; `draft_only` writes it and stops. A send is reported as sent only once the provider acknowledges it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/draft-generation/",
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/docs/email/approve-reject/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/workflows/inbound-email/",
        "https://connectbyjbrh.com/docs/troubleshooting/draft-never-sent/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "W0020",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/email-to-opportunity/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/email-to-opportunity/index.md",
      "title": "From an email to an opportunity",
      "description": "The reply that turns into a deal: which records change, in what order, and what keeps the pipeline honest about where the evidence came from.",
      "summary": "A reply becomes a deal when somebody — a person or the Assistant — creates an opportunity from the thread. The message stays where it is; what changes is the person's lifecycle stage, a new pipeline record, and a timeline entry that links the two. The thread remains the evidence, which is what makes the deal explainable later.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/",
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/workflows/email-reply-approval/",
        "https://connectbyjbrh.com/docs/prospects/prospect-to-opportunity/",
        "https://connectbyjbrh.com/research/evidence-for-next-action/"
      ]
    },
    {
      "id": "W0087",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/entitlement-vs-runtime/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/entitlement-vs-runtime/index.md",
      "title": "Entitlement and runtime choice, end to end",
      "description": "Two separate gates decide whether Connect acts: what the plan permits, and what a person has switched on. Both must agree, and they fail differently.",
      "summary": "A capability runs only when the plan permits it and a person has switched it on. The two are independent: an entitlement without a switch is a capability sitting idle by choice, and a switch without an entitlement is a refusal with a commercial reason rather than a fault. Reading which of the two is stopping you is most of the diagnosis.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/entitlements/",
        "https://connectbyjbrh.com/docs/account/usage/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/workflows/plan-lapse/",
        "https://connectbyjbrh.com/docs/troubleshooting/allowance-reached/"
      ]
    },
    {
      "id": "W0064",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/escalation/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/escalation/index.md",
      "title": "Escalating to a person, end to end",
      "description": "What happens when Connect decides it should not answer: how the refusal becomes a person's decision, and how that decision gets into future work.",
      "summary": "Connect escalates when it cannot answer safely: the knowledge is missing, the question is outside what it may decide, or a gate refuses the action. The refusal becomes an item in Needs You naming what it could not settle, a person decides, and the decision is recorded. Getting the answer back into future work is a separate, deliberate step — a decision alone teaches nothing.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/explicit-gates/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/phone/supervisor/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/research/callback-promises/"
      ]
    },
    {
      "id": "W0036",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/execute-follow-up/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/execute-follow-up/index.md",
      "title": "Executing a follow-up, end to end",
      "description": "From due to placed, held or refused: the drain's rate, every gate in order, the outcome written back, and the lateness rule that ends it.",
      "summary": "A row falls due, the drain takes it — two per tick on the phone channel — and runs it through the same gates as any outbound action on that channel. One of three outcomes is written back: placed, awaiting approval, or refused with a reason. More than twenty-four hours late and it is closed as `missed:` instead of rung.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/execution/",
        "https://connectbyjbrh.com/docs/follow-ups/approval/",
        "https://connectbyjbrh.com/docs/follow-ups/stale/",
        "https://connectbyjbrh.com/docs/workflows/create-follow-up/",
        "https://connectbyjbrh.com/docs/workflows/phone-follow-up-execution/",
        "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-executed/"
      ]
    },
    {
      "id": "W0129",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/file-version-chain/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/file-version-chain/index.md",
      "title": "Producing a new version of a file",
      "description": "Changing a file produces a new version rather than overwriting one: what each version carries, how it links back to a record, and what the chain proves later.",
      "summary": "Connect never edits a file in place. A change reads the current version, produces a new one, links it to whatever the old version was linked to, and records who asked and why. The previous version stays exactly as it was. That is what makes a document Connect touched safe to send: you can always show what it looked like before, and what instruction produced the difference.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/files-data/modify-file/",
        "https://connectbyjbrh.com/docs/files-data/create-file/",
        "https://connectbyjbrh.com/docs/files-data/linking-files/",
        "https://connectbyjbrh.com/docs/files-data/file-audit/",
        "https://connectbyjbrh.com/docs/workflows/modify-document/"
      ]
    },
    {
      "id": "W0026",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/first-contact-to-person/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/first-contact-to-person/index.md",
      "title": "From first contact to a person record",
      "description": "A stranger writes or rings on any channel and becomes a canonical person: every stage, what changes, what can fail, and what happens on the second channel.",
      "summary": "An address nobody has seen before arrives on a channel. The provider adapter stores it, the bridge copies it into canonical records, `by_handle` finds no identity, and a Person is created with that address attached. Everything after that — triage, grounding, the reply, the timeline entry — happens against the new record rather than against an address.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email",
        "whatsapp",
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/people/",
        "https://connectbyjbrh.com/docs/relationships/identities/",
        "https://connectbyjbrh.com/docs/relationships/cross-channel-identity/",
        "https://connectbyjbrh.com/docs/workflows/duplicate-merge/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "W0004",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/first-phone-setup/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/first-phone-setup/index.md",
      "title": "Connecting a phone line, end to end",
      "description": "Connecting a number to Connect: the line record, the carrier link, and the four verifications that separate a configured line from an answering one.",
      "summary": "A working line is four things, not one: a number the carrier will route, an application that posts to a reachable public URL, a `channel_routes` row that says what the line is for and who may use it, and a real call proving all three. Configuration that has never carried a call is a guess. The last step is dialling the number yourself and reading both call logs side by side.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/realtime-engine-enablement/",
        "https://connectbyjbrh.com/docs/workflows/inbound-phone-call/",
        "https://connectbyjbrh.com/docs/troubleshooting/carrier-verification-failed/",
        "https://connectbyjbrh.com/docs/troubleshooting/phone-line-not-ringing/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "W0148",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/first-response/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/first-response/index.md",
      "title": "First response to a new contact",
      "description": "How Connect decides whether to answer a new contact immediately, draft and wait, or refuse — and what the person on the other end experiences while that is decided.",
      "summary": "Four things decide it, in order: whether the channel is on at all, what the autonomy rule at the narrowest applicable scope says, whether that person may be contacted, and whether the allowance is spent. A call is answered or refused in the moment; on email and messaging a reply can be written and held. Nothing counts as sent without the provider's acknowledgement.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/workflows/inbound-email/",
        "https://connectbyjbrh.com/docs/workflows/inbound-phone-call/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/workflows/out-of-scope-request/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "W0071",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/first-sign-in/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/first-sign-in/index.md",
      "title": "Signing in for the first time, end to end",
      "description": "From the Google consent screen to the first working screen: what a session is, how one workspace is resolved, and what a first sign-in does not do.",
      "summary": "A first sign-in is three things in order: Google confirms who you are, Connect binds that identity to a person on the platform, and the session that results resolves to exactly one workspace. There is no password step, because there is no password. The workspace comes from your membership and from nowhere else — never from a link, a header or anything typed into a browser.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/google-sign-in/",
        "https://connectbyjbrh.com/docs/account/sessions/",
        "https://connectbyjbrh.com/docs/account/workspace-resolution/",
        "https://connectbyjbrh.com/docs/troubleshooting/cannot-sign-in/",
        "https://connectbyjbrh.com/docs/workflows/workspace-setup/",
        "https://connectbyjbrh.com/docs/getting-started/first-hour/"
      ]
    },
    {
      "id": "W0037",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/follow-up-approval/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/follow-up-approval/index.md",
      "title": "Approving a follow-up, end to end",
      "description": "How a follow-up Connect may not execute on its own reaches a person, what the approver is allowed to change, and what runs after the yes.",
      "summary": "A follow-up that autonomy will not let Connect execute is neither abandoned nor quietly sent: the drain records `awaiting approval` against it and puts the commitment, its reason and the drafted message into Needs You. A person approves, edits or cancels. Approval then runs the same execution path an autonomous follow-up would have taken, with the approver's edits as the text and the approver's name on the decision.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/approval/",
        "https://connectbyjbrh.com/docs/follow-ups/execution/",
        "https://connectbyjbrh.com/docs/workflows/execute-follow-up/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-executed/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "W0093",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/gmail-history-catchup/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/gmail-history-catchup/index.md",
      "title": "Catching up after a Gmail history gap",
      "description": "When Gmail can no longer serve the history a mailbox was reading from: what a gap is, what Connect re-fetches instead, and why order and duplicates are handled first.",
      "summary": "Gmail sync reads changes since a stored history point rather than re-listing the mailbox. When Gmail can no longer serve from that point, the incremental request is refused and Connect falls back to listing recent messages directly. Everything re-fetched is matched against what is already held, so a catch-up closes the gap without duplicating a thread, and the stored point only moves once the messages behind it are recorded.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/gmail-history-sync/",
        "https://connectbyjbrh.com/docs/email/inbox-sync/",
        "https://connectbyjbrh.com/docs/workflows/burst-ingest/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/research/cursor-loss/"
      ]
    },
    {
      "id": "W0100",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/gmail-writeback-flow/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/gmail-writeback-flow/index.md",
      "title": "What Connect changes in your Gmail after a reply",
      "description": "The step that reaches back into Gmail after a reply: what it writes, why it runs last, why its failure is allowed to pass, and which state flows which way.",
      "summary": "Write-back is the only step in which Connect changes anything inside your Gmail account: it marks the thread read and applies the label you configured, after the reply has been acknowledged. It is one-way and it is non-blocking — a mailbox that cannot label is still a mailbox that can answer customers, so a labelling failure never holds a reply.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/gmail-writeback/",
        "https://connectbyjbrh.com/docs/troubleshooting/gmail-labels-missing/",
        "https://connectbyjbrh.com/docs/email/gmail-scopes/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/"
      ]
    },
    {
      "id": "W0080",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/google-sign-in/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/google-sign-in/index.md",
      "title": "Google sign-in, end to end",
      "description": "From the Google consent screen to a working session: what Google proves, what Connect binds it to, and the mismatch it refuses rather than resolves.",
      "summary": "Google is the only way in. The consent screen authenticates the person, Google returns an assertion Connect verifies with Google rather than with the browser, and that assertion's stable subject identifier — not the email address on it — is what binds to a person here. A session follows, resolved to exactly one workspace. There is no password to be wrong.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/google-sign-in/",
        "https://connectbyjbrh.com/docs/workflows/identity-binding/",
        "https://connectbyjbrh.com/docs/workflows/session-establishment/",
        "https://connectbyjbrh.com/docs/troubleshooting/cannot-sign-in/",
        "https://connectbyjbrh.com/docs/email/gmail-scopes/"
      ]
    },
    {
      "id": "W0058",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/grounded-answer/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/grounded-answer/index.md",
      "title": "Producing a grounded answer, end to end",
      "description": "A customer question turned into a defensible reply: scopes, retrieval, the sufficiency gate, drafting under labelled context, and the citations kept.",
      "summary": "A question is classified, scoped, and answered from material that was checked for authority before anything was written. The check happens first: if nothing carries the standing to answer, no draft is produced and a person is asked. When it passes, the model receives three labelled blocks, and the citations that supported the reply are kept with it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/retrieval/",
        "https://connectbyjbrh.com/docs/knowledge/unsupported-claims/",
        "https://connectbyjbrh.com/docs/workflows/knowledge-audit/",
        "https://connectbyjbrh.com/docs/workflows/retrieval-for-a-reply/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/email/send-evidence/"
      ]
    },
    {
      "id": "W0082",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/identity-binding/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/identity-binding/index.md",
      "title": "Binding a Google identity to a person, end to end",
      "description": "How a Google account becomes a person in Connect: binding on the first non-empty subject, adopting a row that predates them, and refusing a later mismatch.",
      "summary": "A person record is bound to one Google account by that account's permanent subject identifier, written on the first sign-in that presents a non-empty one. A row created before any subject existed is adopted at that moment rather than duplicated. After binding, an address presented with a different subject is refused rather than quietly re-pointed at a new account.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/identity-binding/",
        "https://connectbyjbrh.com/docs/workflows/google-sign-in/",
        "https://connectbyjbrh.com/docs/workflows/adding-a-colleague/",
        "https://connectbyjbrh.com/research/invisible-not-missing/",
        "https://connectbyjbrh.com/docs/troubleshooting/cannot-sign-in/"
      ]
    },
    {
      "id": "W0111",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/identity-merge-decision/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/identity-merge-decision/index.md",
      "title": "Deciding whether two records are one person",
      "description": "From the signals that suggest two records are one person to the human decision and the merge itself, with what survives on both sides.",
      "summary": "Connect proposes; a person decides. Duplicate detection puts forward candidates with the evidence for each, and `merge_people` runs only when somebody says yes — because joining two humans' histories wrongly costs far more than carrying a duplicate for another week. The merge preserves identities, stages, follow-ups, deals, demos, cases and onboarding from both records.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/duplicates/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/relationships/merge-safety/",
        "https://connectbyjbrh.com/docs/workflows/duplicate-merge/",
        "https://connectbyjbrh.com/docs/troubleshooting/too-many-follow-ups/",
        "https://connectbyjbrh.com/research/one-person-many-channels/"
      ]
    },
    {
      "id": "W0094",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/imap-cursor-advance/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/imap-cursor-advance/index.md",
      "title": "Advancing an IMAP cursor safely",
      "description": "The rule that decides when an IMAP read position may move: what must be recorded first, what refusal holds it, and how advancing early loses mail for good.",
      "summary": "An IMAP mailbox is read from a cursor: the position past which mail has already been taken in. It moves only after the messages behind it exist as canonical records — never after they were merely fetched, and never at all when the daily allowance refuses the work. That refusal deliberately holds the cursor, because a cursor that moves past unprocessed mail never comes back for it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/imap-cursor/",
        "https://connectbyjbrh.com/docs/email/connect-imap-smtp/",
        "https://connectbyjbrh.com/docs/workflows/quota-refusal/",
        "https://connectbyjbrh.com/docs/email/quiet-mailbox/",
        "https://connectbyjbrh.com/research/cursor-loss/"
      ]
    },
    {
      "id": "W0011",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/inbound-email/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/inbound-email/index.md",
      "title": "Inbound email, end to end",
      "description": "Every stage between a message landing at the provider and Connect acting on it: fetch, bridge, thread, triage, and where mail can be lost.",
      "summary": "A message is fetched by the mailbox's provider adapter into the `tenant_*` tables, copied into the canonical `threads` and `messages` by the bridge, attached to a person, given a priority, and only then read by the engine. The read cursor moves after the copy has been written, never before, which is why an allowance refusal holds work instead of losing it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/inbox-sync/",
        "https://connectbyjbrh.com/docs/email/message-canonicalisation/",
        "https://connectbyjbrh.com/docs/workflows/email-reply-approval/",
        "https://connectbyjbrh.com/docs/workflows/quota-refusal/",
        "https://connectbyjbrh.com/docs/troubleshooting/mail-not-arriving/",
        "https://connectbyjbrh.com/docs/email/triage/"
      ]
    },
    {
      "id": "W0001",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/inbound-phone-call/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/inbound-phone-call/index.md",
      "title": "Inbound phone call, end to end",
      "description": "A call arriving on a Connect number, stage by stage: what the caller hears, what is written, which provider acts, and what fails where.",
      "summary": "A call reaches the carrier, the carrier calls Connect, and the handler enters the owning workspace before it reads a single setting. The line is resolved, a `calls` row is opened, the voice answers under that line's persona and rules, and the ending is attributed, costed and turned into a summary, a lead and a follow-up. Each stage can fail on its own, and each has its own recovery.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/outbound-phone-call/",
        "https://connectbyjbrh.com/docs/workflows/call-to-relationship/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-answered-in-silence/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/"
      ]
    },
    {
      "id": "W0078",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/incident-response/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/incident-response/index.md",
      "title": "Responding to a suspected access problem, end to end",
      "description": "What to do when access to a workspace looks wrong: contain first, establish scope from evidence, then rotate — in that order, with what each step proves.",
      "summary": "Work in one order: stop the access, establish what was actually reachable, then rotate what could have been observed. The evidence is the decision record, the health verdicts and the record of permission changes — all of which survive the incident. Guessing at scope before reading them is how a small problem gets treated as a large one and a large one as small.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/isolation-verification/",
        "https://connectbyjbrh.com/docs/workflows/credential-rotation/",
        "https://connectbyjbrh.com/docs/security/audit-access/",
        "https://connectbyjbrh.com/docs/troubleshooting/403-on-a-screen/",
        "https://connectbyjbrh.com/docs/account/sessions/"
      ]
    },
    {
      "id": "W0160",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/incident-review/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/incident-review/index.md",
      "title": "Reviewing an incident, end to end",
      "description": "After something goes wrong: which records to open and in what order, the questions that decide whether it is fixed, and what belongs in the write-up.",
      "summary": "Start from the records rather than from memory. Connect keeps three of itself — `activity`, the story a person reads; `ops_events`, the diagnostic trail; and the audit trail, which answers who did this, in what capacity, to what, and whether it worked. Everything else in a review is the two questions those records exist to settle: what completed, and what did not.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/docs/troubleshooting/audit-entry-missing/",
        "https://connectbyjbrh.com/research/probes-that-cry-wolf/",
        "https://connectbyjbrh.com/research/silent-failure/",
        "https://connectbyjbrh.com/docs/workflows/service-interruption/",
        "https://connectbyjbrh.com/docs/workflows/regression-check/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "W0147",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/indexnow-submission/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/indexnow-submission/index.md",
      "title": "Submitting changed URLs to IndexNow",
      "description": "Submitting changed URLs to IndexNow: how the changed set is derived, the three rules the tool enforces, the response codes, and why submission runs last.",
      "summary": "After a deploy has been verified, the URLs that actually changed are posted to IndexNow as one JSON request. Three rules are enforced by the tool rather than left to whoever runs it: only changed URLs, never a non-public one, and nothing at all without a key that resolves. The response codes are specific enough to act on.",
      "status": "available",
      "audiences": [
        "developer",
        "owner"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/docs-publication/",
        "https://connectbyjbrh.com/docs/workflows/docs-verification/",
        "https://connectbyjbrh.com/docs/workflows/crawler-access/",
        "https://connectbyjbrh.com/docs/protocols/",
        "https://connectbyjbrh.com/research/documentation-as-a-build/",
        "https://connectbyjbrh.com/developers/machine-manifests/"
      ]
    },
    {
      "id": "W0076",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/isolation-verification/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/isolation-verification/index.md",
      "title": "Proving a workspace is isolated, end to end",
      "description": "A layer-by-layer check that one workspace cannot reach another's records, what each of the three layers catches, and what each of them cannot see.",
      "summary": "Isolation is enforced three times over, by three unrelated mechanisms: an allowlist in front of the application, a workspace filter inside every query the application builds, and row-level security inside the database. Verifying it means checking each layer on its own terms, because each one catches a class of mistake the other two are blind to.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/security/rls/",
        "https://connectbyjbrh.com/docs/troubleshooting/data-not-visible/",
        "https://connectbyjbrh.com/docs/workflows/workspace-resolution-flow/"
      ]
    },
    {
      "id": "W0107",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/keeping-a-prospect-without-email/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/keeping-a-prospect-without-email/index.md",
      "title": "Keeping a good prospect you cannot email",
      "description": "An organisation fits your criteria and publishes no address. What stays on the record, what Connect proposes instead, and the four ways it can become reachable later.",
      "summary": "Nothing is thrown away and nothing is invented. The prospect keeps its research, its evidence and its qualification, and is marked as researched rather than contactable. Connect proposes a different next action — a call where a number is published, or work for a person — and the record waits for one of four things to make it reachable.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/prospect-no-email/",
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/docs/prospects/contactability/",
        "https://connectbyjbrh.com/docs/workflows/contact-discovery/",
        "https://connectbyjbrh.com/docs/follow-ups/task-channel/",
        "https://connectbyjbrh.com/docs/follow-ups/channel-choice/",
        "https://connectbyjbrh.com/docs/prospects/prospect-freshness/",
        "https://connectbyjbrh.com/docs/prospects/prospect-upload/"
      ]
    },
    {
      "id": "W0060",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/knowledge-audit/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/knowledge-audit/index.md",
      "title": "Auditing what an answer was based on",
      "description": "Taking one sentence in a sent reply and following it back to the passage, the authority and the person who allowed it to be said.",
      "summary": "Every reply keeps the record of what it was grounded in: the score, the titles matched, which of them carried authority, any commitment topics detected and the citations for the passages used. Auditing means reading those, resolving each citation back to a source and section, and comparing the cited text with the sentence in question. Nothing is reconstructed afterwards.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/grounded-answer/",
        "https://connectbyjbrh.com/docs/knowledge/retrieval/",
        "https://connectbyjbrh.com/docs/knowledge/owner-authority/",
        "https://connectbyjbrh.com/docs/memory/provenance/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-answer-from-knowledge/",
        "https://connectbyjbrh.com/docs/phone/transcript/"
      ]
    },
    {
      "id": "W0127",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/knowledge-ingest/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/knowledge-ingest/index.md",
      "title": "Ingesting a Knowledge source, end to end",
      "description": "What happens between adding a document and an answer being grounded in it: reading the file, refusing dangerous ones, extraction, and when it becomes usable.",
      "summary": "A file added to Knowledge is read with the standard library where its format allows, refused where its structure is dangerous, and turned into text and facts a reply can be grounded in. There is no vector database and no training step: the source becomes available for retrieval, and the next answer that needs it uses it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/knowledge/extraction/",
        "https://connectbyjbrh.com/docs/knowledge/indexing/",
        "https://connectbyjbrh.com/docs/workflows/add-knowledge/",
        "https://connectbyjbrh.com/docs/files-data/safe-parsing/",
        "https://connectbyjbrh.com/docs/knowledge/prompt-injection/",
        "https://connectbyjbrh.com/docs/workflows/retrieval-for-a-reply/",
        "https://connectbyjbrh.com/research/grounding-without-a-vector-database/"
      ]
    },
    {
      "id": "W0075",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/lapse-and-recovery/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/lapse-and-recovery/index.md",
      "title": "A lapsed plan and its recovery, end to end",
      "description": "The whole arc of a lapse: what stopped, what queued rather than failed, and the order in which work resumes once the workspace is live again.",
      "summary": "Recovery is not a restore. Nothing was archived during the lapse, so nothing is unpacked: the workspace becomes live, and the next engine pass does what it always does — fetch, then think, then act — on exactly the work that was waiting. The one thing worth doing first is reading the held queue, because drafts written before the lapse are answers to older messages.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/lapsed-plan/",
        "https://connectbyjbrh.com/docs/troubleshooting/plan-lapsed/",
        "https://connectbyjbrh.com/docs/workflows/plan-change/",
        "https://connectbyjbrh.com/docs/account/usage/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/troubleshooting/mailbox-disconnected/"
      ]
    },
    {
      "id": "W0112",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/lifecycle-progression/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/lifecycle-progression/index.md",
      "title": "Moving a relationship through its lifecycle",
      "description": "Every lifecycle stage change: what triggers one, how the requested word is normalised, what the move records, and the things it deliberately leaves alone.",
      "summary": "A stage is a fact recorded about a person, changed by `move_stage` and by nothing else. Something happens that makes the current stage untrue, somebody moves it, the word is normalised against the workspace's own vocabulary, and the change is written with who made it. Deals, cases, follow-ups and autonomy are all untouched by the move.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/",
        "https://connectbyjbrh.com/docs/relationships/stage-normalisation/",
        "https://connectbyjbrh.com/docs/support/post-sale/",
        "https://connectbyjbrh.com/docs/sales/stage-rules/",
        "https://connectbyjbrh.com/docs/workflows/identity-merge-decision/",
        "https://connectbyjbrh.com/docs/sales/next-best-action/"
      ]
    },
    {
      "id": "W0025",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/list-import/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/list-import/index.md",
      "title": "Importing a prospect list, end to end",
      "description": "An import followed from the file to usable prospects: what each stage does to a row, what is merged, what is refused, and what the summary is for.",
      "summary": "An import is a bulk version of creating one prospect, and every row goes through the same checks a discovered candidate does. The file is read, rows are resolved against what you already know, survivors become prospect records, and research fills in what your spreadsheet could not prove. The summary at the end is the only convenient moment to act on what failed.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/prospect-upload/",
        "https://connectbyjbrh.com/docs/prospects/prospect-identity/",
        "https://connectbyjbrh.com/docs/prospects/contact-evidence/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/docs/prospects/prospect-counts/",
        "https://connectbyjbrh.com/docs/workflows/prospect-research/"
      ]
    },
    {
      "id": "W0155",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/mailbox-health-review/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/mailbox-health-review/index.md",
      "title": "Reviewing mailbox health as a routine",
      "description": "A routine check of every mailbox: why connected is not health, the states worth watching, the pattern that hides a mailbox entirely, and the action for each.",
      "summary": "Check three things per mailbox: that it is authorised, that mail is actually arriving, and that sends are being acknowledged. Connected proves only the first. A mailbox that authenticates and returns nothing is quiet, which is a signal rather than an error — and the count of mailboxes on the screen is itself worth checking against what you believe you connected.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/email/quiet-mailbox/",
        "https://connectbyjbrh.com/docs/troubleshooting/mailbox-disconnected/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
        "https://connectbyjbrh.com/research/cursor-loss/",
        "https://connectbyjbrh.com/research/invisible-not-missing/"
      ]
    },
    {
      "id": "W0015",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/mailbox-repair/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/mailbox-repair/index.md",
      "title": "Repairing a broken mailbox, end to end",
      "description": "Detecting that a mailbox has stopped working, finding which half broke, reconnecting without creating a second row, and proving the repair held.",
      "summary": "A broken mailbox is repaired in place: you reconnect the row that already exists rather than adding a new one, which keeps its role, its signature, its autonomy and its history. Detection comes from health verdicts and a last-sync time that has stopped moving, and the repair is only finished once a sync and a send have both been proved again.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/mailbox-disconnect/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/troubleshooting/mailbox-disconnected/",
        "https://connectbyjbrh.com/docs/troubleshooting/reconnect-required/",
        "https://connectbyjbrh.com/docs/workflows/primary-mailbox-repair/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
        "https://connectbyjbrh.com/research/invisible-not-missing/"
      ]
    },
    {
      "id": "W0091",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/mailbox-role-assignment/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/mailbox-role-assignment/index.md",
      "title": "Assigning a mailbox role, end to end",
      "description": "Giving a mailbox a role, from the click to the first message it re-routes: what is stored, what routing changes, and which conversations are deliberately untouched.",
      "summary": "A role names the kind of work a mailbox is for, and Connect reads it when it chooses where a new conversation should start. Assigning one is a settings change with no provider call behind it: nothing moves at Gmail, Graph or your IMAP server. It takes effect for threads created after the change, and every conversation already running keeps the mailbox it was bound to.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/mailbox-roles/",
        "https://connectbyjbrh.com/docs/email/primary-mailbox/",
        "https://connectbyjbrh.com/docs/workflows/primary-mailbox-repair/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-mailbox-sent/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/"
      ]
    },
    {
      "id": "W0139",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/mcp-public-search/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/mcp-public-search/index.md",
      "title": "An AI client searching the public documentation",
      "description": "The unauthenticated MCP path: which documentation tools any AI client may call without a key, what they return, and the limits that make them safe to publish.",
      "summary": "Ten documentation tools are open to any MCP client with no credential at all. They search and fetch the published corpus — pages, capabilities, workflows, glossary, protocols, product status and the changelog — and they touch no workspace, so there is nothing to scope and nothing to meter. What a client gets back is the same text a reader sees.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/mcp-public-tools/",
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/docs-search-api/",
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/docs/workflows/mcp-tool-call/",
        "https://connectbyjbrh.com/developers/markdown-mirrors/"
      ]
    },
    {
      "id": "W0138",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/mcp-tool-call/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/mcp-tool-call/index.md",
      "title": "An AI client calling a Connect MCP tool",
      "description": "How an AI client discovers a Connect workspace tool, authenticates with an integration key, and has the call scoped, gated and recorded like any other action.",
      "summary": "The client posts JSON-RPC to one endpoint, names a tool and its arguments, and receives a result. A workspace tool needs an integration key, and that key fixes the single workspace the call runs in. From there the call goes through the same domain service a person's click would, so autonomy, suppression, allowances and the audit trail all apply unchanged.",
      "status": "available",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/mcp-server/",
        "https://connectbyjbrh.com/developers/mcp-workspace-tools/",
        "https://connectbyjbrh.com/developers/mcp-authentication/",
        "https://connectbyjbrh.com/developers/mcp-errors/",
        "https://connectbyjbrh.com/developers/integration-keys/",
        "https://connectbyjbrh.com/docs/workflows/mcp-public-search/",
        "https://connectbyjbrh.com/docs/workflows/"
      ]
    },
    {
      "id": "W0053",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/memory-correction/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/memory-correction/index.md",
      "title": "Correcting what Connect knows, end to end",
      "description": "From a reply that was wrong to a corrected memory to changed behaviour: every stage, what changes at each, and the three places a correction fails to stick.",
      "summary": "Correcting Connect is three moves, not one: stop the wrong message, write the lesson at the right tier, then prove it on the next piece of work. Fixing the message alone changes nothing durable — rejecting a draft is a decision about one reply. The lesson is the memory row, and the proof is the next reply reading differently.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/creating-memory/",
        "https://connectbyjbrh.com/docs/memory/editing/",
        "https://connectbyjbrh.com/docs/memory/superseding/",
        "https://connectbyjbrh.com/docs/troubleshooting/memory-not-applied/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/"
      ]
    },
    {
      "id": "W0054",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/memory-from-call-workflow/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/memory-from-call-workflow/index.md",
      "title": "A fact learned on a call, end to end",
      "description": "Following one spoken fact from the moment it is said, through the checks that decide whether to believe it, to the email where it is used a week later.",
      "summary": "A fact said on the phone becomes contact memory at the end of the conversation, through `voice.end_call`, and is read on every channel from the next piece of work onwards. Between being spoken and being stored it passes a summariser floor, a name guard and — for a number, an address or a code — a read-back check. Anything that fails one of those does not become a fact.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/memory-from-call/",
        "https://connectbyjbrh.com/docs/memory/person-memory/",
        "https://connectbyjbrh.com/docs/memory/memory-in-channels/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/one-person-many-channels/",
        "https://connectbyjbrh.com/docs/relationships/"
      ]
    },
    {
      "id": "W0056",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/memory-review/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/memory-review/index.md",
      "title": "Reviewing everything Connect knows about a person",
      "description": "The audit anyone can run on one person's record: the four tiers, the tags, the identities behind them, and the decisions that follow from what you find.",
      "summary": "Everything Connect holds about one person is readable in one sitting: four memory tiers in the viewer, the tags on each row, the identities that resolve to them, and the conversations on their timeline. The review is worth running when somebody asks what you hold, when behaviour towards an account has drifted, and before anyone deletes anything in bulk.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/viewing/",
        "https://connectbyjbrh.com/docs/memory/person-memory/",
        "https://connectbyjbrh.com/docs/memory/deleting/",
        "https://connectbyjbrh.com/docs/memory/provenance/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "W0126",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/memory-supersede/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/memory-supersede/index.md",
      "title": "Superseding a memory, end to end",
      "description": "Replacing something Connect believes without losing the record of what it used to believe: the new version, the kept history, and how each option reads later.",
      "summary": "Superseding writes the current version of a memory at the same tier and retires the earlier one, so behaviour changes immediately while the record of what was believed before survives. That is the difference from editing, which changes the words in place, and from deleting, which removes the statement entirely. Pick by what you will need to explain in six months.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/superseding/",
        "https://connectbyjbrh.com/docs/memory/editing/",
        "https://connectbyjbrh.com/docs/memory/deleting/",
        "https://connectbyjbrh.com/docs/memory/provenance/",
        "https://connectbyjbrh.com/docs/workflows/memory-write/",
        "https://connectbyjbrh.com/docs/workflows/memory-correction/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-memory/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/"
      ]
    },
    {
      "id": "W0125",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/memory-write/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/memory-write/index.md",
      "title": "Writing a memory, end to end",
      "description": "How something worth remembering becomes a stored memory: the trigger, the tier it lands on, what the row carries, and the first reply that changes because of it.",
      "summary": "A memory is written when a person says so, or when Connect proposes something durable from a conversation and it is kept. The write picks one of four tiers — workspace, channel, endpoint or contact — and that choice is the whole decision, because tiers resolve narrowest-first. The next piece of work on that scope reads it; nothing already sent is revisited.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/tiers/",
        "https://connectbyjbrh.com/docs/memory/creating-memory/",
        "https://connectbyjbrh.com/docs/memory/provenance/",
        "https://connectbyjbrh.com/docs/memory/directives/",
        "https://connectbyjbrh.com/docs/workflows/memory-supersede/",
        "https://connectbyjbrh.com/docs/memory/viewing/",
        "https://connectbyjbrh.com/docs/compare/knowledge-vs-memory/",
        "https://connectbyjbrh.com/docs/memory/memory-in-channels/"
      ]
    },
    {
      "id": "W0157",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/model-change/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/model-change/index.md",
      "title": "Changing the model, end to end",
      "description": "Moving Connect to a different model: what to check first, what changes on the wire during the switch, and which numbers prove afterwards that it was worth doing.",
      "summary": "Changing the model changes three things at once — latency, cost and which features exist — and only the first is obvious. The default, Gemini 3.1 Flash Live, reaches first audio in 0.6 s against 1.2–2.2 s for 2.5 native audio, and pays for it by refusing affective dialog and holding an immutable session, so no mid-call note or supervisor guidance can reach it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/docs/phone/realtime-engine/",
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/docs/troubleshooting/model-session-failed/",
        "https://connectbyjbrh.com/research/model-limited-findings/",
        "https://connectbyjbrh.com/docs/workflows/prompt-change/",
        "https://connectbyjbrh.com/docs/workflows/provider-change/"
      ]
    },
    {
      "id": "W0068",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/modify-document/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/modify-document/index.md",
      "title": "Changing a document, end to end",
      "description": "Changing a stored document from end to end: which version is read, what the proposal shows, what the new version records, and what the old one keeps.",
      "summary": "You name a file and say what should be different. Connect reads that exact version, prepares what will differ, and shows you the result before anything exists. On confirmation `modify_file` writes the next version in the chain with provenance naming the request, the previous version stays byte for byte as it was, and the decision log records who allowed the change.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/modify-file/",
        "https://connectbyjbrh.com/docs/files-data/file-versions/",
        "https://connectbyjbrh.com/docs/files-data/file-audit/",
        "https://connectbyjbrh.com/docs/workflows/create-document/",
        "https://connectbyjbrh.com/docs/workflows/file-version-chain/",
        "https://connectbyjbrh.com/research/undo-for-agents/"
      ]
    },
    {
      "id": "W0032",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/move-opportunity/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/move-opportunity/index.md",
      "title": "Moving a deal from stage to stage, end to end",
      "description": "Every stage change on an opportunity: what is checked before it, what is written after it, and the side effects a move sets off downstream.",
      "summary": "A move is a claim about the deal, so it is checked before it is written. `move` evaluates the stage rules, either declines with the specific thing that is missing or writes the new stage, audits the change, and raises whatever the new stage implies — usually a dated commitment with a reason attached.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/stage-rules/",
        "https://connectbyjbrh.com/docs/sales/pipeline/",
        "https://connectbyjbrh.com/docs/workflows/create-opportunity/",
        "https://connectbyjbrh.com/docs/sales/won-and-lost/",
        "https://connectbyjbrh.com/docs/troubleshooting/stage-move-refused/",
        "https://connectbyjbrh.com/docs/sales/next-best-action/"
      ]
    },
    {
      "id": "W0063",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/needs-you-triage/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/needs-you-triage/index.md",
      "title": "Working the Needs You queue, end to end",
      "description": "One full pass through Needs You: how the list is ordered, what each kind of item wants from you, and what an empty queue does and does not prove.",
      "summary": "Needs You is the single list of things only a person can settle: held actions, questions Connect could not answer, and operational problems such as a mailbox that stopped fetching or a phone line that is unwell. It is ranked by what the delay costs rather than by arrival time, every item names the decision it wants, and each one drains by itself once its cause is gone.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you-ranking/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you-kinds/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/workflows/approval-decision/",
        "https://connectbyjbrh.com/docs/troubleshooting/needs-you-empty/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "W0039",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/onboarding-workflow/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/onboarding-workflow/index.md",
      "title": "Onboarding, end to end",
      "description": "Onboarding from the won deal to steady state: the stages, who does what between them, and the failures that leave a new customer waiting.",
      "summary": "Onboarding begins on the relationship that already holds the deal, not on a new record. The workspace's own steps are tracked against the person; Connect chases what is owed, answers from Knowledge and the existing history, records what happened, and stops where a decision belongs to somebody. Steady state is reached when the steps are done and only ordinary work remains.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/onboarding/",
        "https://connectbyjbrh.com/docs/support/post-sale/",
        "https://connectbyjbrh.com/docs/workflows/won-deal-handover/",
        "https://connectbyjbrh.com/docs/follow-ups/task-channel/",
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "W0149",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/out-of-scope-request/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/out-of-scope-request/index.md",
      "title": "Handling a request Connect cannot fulfil",
      "description": "What happens when somebody asks for something Connect must not answer: how it is recognised, how it is refused, who it reaches, and what the customer is told.",
      "summary": "Connect refuses rather than improvises. A price, a delivery commitment, a warranty or a service level that the workspace's own knowledge does not support is not invented — the request is declined in the conversation, escalated to a person, and recorded as a decision. The refusal is the designed behaviour, not a gap in coverage.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/complaint-escalation/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/follow-ups/"
      ]
    },
    {
      "id": "W0002",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/outbound-phone-call/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/outbound-phone-call/index.md",
      "title": "Outbound phone call, end to end",
      "description": "Placing a call: the reason it exists, the gates it passes, the dial itself, and what is written whether or not anybody answers.",
      "summary": "An outbound call starts as a reason — a follow-up falling due, an instruction, a person pressing dial — and then passes the same gates a message would: memory blocks, consent, autonomy, hours, budget. Only then is a dial handed to the provider. Everything after that is timing and evidence: did the leg join, did it ring, did anyone speak, and what does the record say when it did not.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/inbound-phone-call/",
        "https://connectbyjbrh.com/docs/workflows/phone-follow-up-execution/",
        "https://connectbyjbrh.com/docs/troubleshooting/call-never-rang/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/docs/sms/"
      ]
    },
    {
      "id": "W0017",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/outreach-sequence/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/outreach-sequence/index.md",
      "title": "An outreach sequence, end to end",
      "description": "Cold outreach from first contact to the reply that stops it, with every compliance gate named and the point where a stranger becomes a conversation.",
      "summary": "Outreach starts from a prospect with a contact address that came from evidence, passes a compliance check before anything is written, and stops the moment a reply arrives. The reply is then handled on the ordinary conversation path, not the outreach one: the two paths have different gates and are deliberately never merged.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/outreach-email/",
        "https://connectbyjbrh.com/docs/prospects/first-outreach/",
        "https://connectbyjbrh.com/docs/prospects/compliance-check/",
        "https://connectbyjbrh.com/docs/prospects/cold-sequence-stop/",
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/workflows/unsubscribe-workflow/",
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/"
      ]
    },
    {
      "id": "W0084",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/owner-tenant-routing/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/owner-tenant-routing/index.md",
      "title": "Routing a request for the Owner or a customer",
      "description": "One implementation, two doors: how a request is rewritten for a customer, checked against an allowlist, and refused in the two ways that both fail closed.",
      "summary": "A customer's browser rewrites each path to its customer equivalent before the request leaves; an allowlist in front of the application then decides whether that session may call it. Both refuse rather than guess — an unrecognised path is blocked, and a recognised but unpermitted one is denied. The behaviour behind both doors is one shared implementation.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/customer-facade/",
        "https://connectbyjbrh.com/research/closed-by-default-facade/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/docs/troubleshooting/403-on-a-screen/",
        "https://connectbyjbrh.com/docs/account/owner-vs-tenant/"
      ]
    },
    {
      "id": "W0135",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/payment-verification/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/payment-verification/index.md",
      "title": "Verifying a customer payment, end to end",
      "description": "How a customer payment is verified and a plan activated: deterministic evidence, a fail-closed match, and why this flow sits outside every workspace.",
      "summary": "No model decides whether money moved. A payment notice arriving in a dedicated platform mailbox is matched against exactly one pending expectation on reference, amount and currency, from a trusted sender with an aligned authentication pass. Anything that does not match all of it is held for a person to look at. This is operator work, and it deliberately lives outside every customer workspace.",
      "status": "available_owner",
      "audiences": [
        "owner"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/plan/",
        "https://connectbyjbrh.com/docs/account/entitlements/",
        "https://connectbyjbrh.com/docs/account/owner-vs-tenant/",
        "https://connectbyjbrh.com/docs/workflows/plan-change/",
        "https://connectbyjbrh.com/docs/security/authorization/",
        "https://connectbyjbrh.com/docs/workflows/workspace-creation/"
      ]
    },
    {
      "id": "W0003",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/phone-follow-up-execution/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/phone-follow-up-execution/index.md",
      "title": "A promised call-back, end to end",
      "description": "A call-back promised out loud becomes a dated commitment and then a ring: how the time is read, when it is refused, and when it is too late to place.",
      "summary": "The voice says it will ring back. That sentence only becomes a commitment if the time in it can be tied to something the caller actually said or agreed to; otherwise the tool answers **NOT recorded** and the model cannot claim a booking. A recorded promise gets a due time in the line's timezone, a channel, and a drain that places it — or gives up honestly when it is too late.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/outbound-phone-call/",
        "https://connectbyjbrh.com/docs/troubleshooting/follow-up-not-booked/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/research/callback-promises/",
        "https://connectbyjbrh.com/docs/troubleshooting/duplicate-follow-up/"
      ]
    },
    {
      "id": "W0074",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/plan-change/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/plan-change/index.md",
      "title": "Changing plan, end to end",
      "description": "What a plan change alters the moment it lands, what it deliberately leaves alone, and why a lowered ceiling never removes anything you already have.",
      "summary": "A plan change rewrites one record: the entitlement held against the workspace. It takes effect at the next piece of metered work rather than at a restart or a fresh sign-in, so what you notice first is usually a send that now goes through, or one that now does not. Runtime is untouched — a workspace sitting in Draft only stays in Draft only on any plan.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/plan/",
        "https://connectbyjbrh.com/docs/account/entitlements/",
        "https://connectbyjbrh.com/docs/account/usage/",
        "https://connectbyjbrh.com/docs/workflows/lapse-and-recovery/",
        "https://connectbyjbrh.com/docs/troubleshooting/allowance-reached/",
        "https://connectbyjbrh.com/docs/autonomy/spend-context/"
      ]
    },
    {
      "id": "W0088",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/plan-lapse/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/plan-lapse/index.md",
      "title": "A plan lapsing, end to end",
      "description": "What a lapsed plan actually stops: which work is refused, which is held, why the mail cursor stays where it is, and what returns on settlement.",
      "summary": "A lapse stops spending, not access. Sends and mail ingestion refuse with a plan reason; the work that was refused is held rather than discarded; and everything already stored stays readable and searchable. No feature is removed, no screen disappears and no record is deleted. Settling the plan releases the same queue that was waiting, so nothing has to be recreated by hand afterwards.",
      "status": "available",
      "audiences": [
        "customer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/lapsed-plan/",
        "https://connectbyjbrh.com/docs/account/plan/",
        "https://connectbyjbrh.com/docs/workflows/lapse-and-recovery/",
        "https://connectbyjbrh.com/docs/troubleshooting/plan-lapsed/",
        "https://connectbyjbrh.com/docs/workflows/allowance-enforcement/",
        "https://connectbyjbrh.com/research/cursor-loss/"
      ]
    },
    {
      "id": "W0092",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/primary-mailbox-repair/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/primary-mailbox-repair/index.md",
      "title": "Repairing a workspace with no primary mailbox",
      "description": "A workspace whose primary mailbox is missing: how the gap shows itself, the two repairs, and why one of them cannot run from a browser request at all.",
      "summary": "A workspace with no primary mailbox has no fallback sender, so anything Connect starts rather than answers has nowhere to leave from. If a mailbox is visible, the repair is to give one the role. If the mailbox has become invisible — a row with an empty workspace stamp — no screen can fix it: the database policy refuses that write, and the repair runs as the schema owner during migration.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/primary-mailbox/",
        "https://connectbyjbrh.com/docs/workflows/mailbox-repair/",
        "https://connectbyjbrh.com/docs/workflows/mailbox-role-assignment/",
        "https://connectbyjbrh.com/research/invisible-not-missing/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/"
      ]
    },
    {
      "id": "W0097",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/priority-assignment/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/priority-assignment/index.md",
      "title": "Assigning priority to a thread, end to end",
      "description": "How a conversation gets its priority, what happens when a person overrides it, and why that correction changes what Connect works on rather than how a list is sorted.",
      "summary": "Triage assigns a priority to a thread as it is classified, and the engine reads that value when it chooses its next piece of work. Overriding it is therefore not a display preference: a raised thread is worked sooner and a lowered one is worked later. What priority never changes is permission — an approval, a suppression or a spent allowance still holds regardless of it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/triage/",
        "https://connectbyjbrh.com/docs/email/guidance/",
        "https://connectbyjbrh.com/docs/workflows/burst-ingest/",
        "https://connectbyjbrh.com/docs/email/held-drafts/",
        "https://connectbyjbrh.com/research/structured-business-memory/"
      ]
    },
    {
      "id": "W0156",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/prompt-change/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/prompt-change/index.md",
      "title": "Changing what the agent is told",
      "description": "Changing the words Connect is given: the six layers a prompt lives in, what extra characters cost on a live call, how to measure it and how to undo it.",
      "summary": "A prompt change lands in one of six layers, and which layer you edit decides who it reaches and how fast it can be undone. On a live call the cost is measurable rather than theoretical: instructions of 7,500 characters gave a first token in 1.2–1.8 seconds, 9,600 characters gave 2.3–3.4. Change one layer, place a test call, read the turn timings, keep the old text.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/speaking-guide/",
        "https://connectbyjbrh.com/docs/phone/voice-lab/",
        "https://connectbyjbrh.com/docs/phone/model-limits/",
        "https://connectbyjbrh.com/docs/workflows/voice-tuning-cycle/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/workflows/regression-check/"
      ]
    },
    {
      "id": "W0021",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/prospect-discovery/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/prospect-discovery/index.md",
      "title": "Discovering prospects, end to end",
      "description": "One discovery run followed from the brief to a qualified list: every stage, every gate that can stop it, and what exists afterwards.",
      "summary": "A discovery run turns a written description of who you want to reach into researched organisations with evidence behind every claim. It reads public sources, discards the businesses you already know, scores what remains against your brief, and stops. Nothing is sent by discovery, and no address is created that a source did not show.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/docs/prospects/discovery-criteria/",
        "https://connectbyjbrh.com/docs/prospects/candidate-collection/",
        "https://connectbyjbrh.com/docs/troubleshooting/no-prospects-found/",
        "https://connectbyjbrh.com/docs/workflows/prospect-research/",
        "https://connectbyjbrh.com/docs/workflows/"
      ]
    },
    {
      "id": "W0104",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/prospect-evidence-capture/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/prospect-evidence-capture/index.md",
      "title": "Capturing evidence for a prospect, end to end",
      "description": "How one fact about a business travels from a public source to a stored piece of evidence to the claim it supports — and what stops it on the way.",
      "summary": "Evidence capture is the step that decides what a prospect record is allowed to say. A source is read, a statement is extracted, the statement and its source are stored together by `prospect_evidence`, and only then may a claim appear on the record. A statement that arrives without a source is discarded at this point rather than kept with a caveat.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/prospects/public-source-research/",
        "https://connectbyjbrh.com/docs/prospects/prospect-freshness/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/",
        "https://connectbyjbrh.com/docs/workflows/prospect-research/",
        "https://connectbyjbrh.com/docs/prospects/fit-reason/"
      ]
    },
    {
      "id": "W0023",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/prospect-outreach/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/prospect-outreach/index.md",
      "title": "First outreach to a prospect, end to end",
      "description": "The first message to a prospect, followed from readiness through the compliance check, the draft, approval and the send that only counts with provider evidence.",
      "summary": "First outreach is the point where prospecting stops reading and starts writing to a real person. Five gates stand between a qualified prospect and a sent message: a ready sender, a passed compliance check, a grounded draft, the channel's autonomy rule, and the daily allowance. The send is only 'sent' once the provider says so.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/first-outreach/",
        "https://connectbyjbrh.com/docs/prospects/sender-readiness/",
        "https://connectbyjbrh.com/docs/prospects/compliance-check/",
        "https://connectbyjbrh.com/docs/troubleshooting/outreach-blocked/",
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "W0105",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/prospect-qualification-flow/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/prospect-qualification-flow/index.md",
      "title": "Qualifying a prospect, end to end",
      "description": "How evidence gathered about an organisation becomes a score, how the score becomes a decision, and what happens when a person disagrees with it.",
      "summary": "Qualification turns evidence into a decision in three moves: claims that carry a source are scored against your criteria, the score sorts prospects into worth approaching, not worth approaching and not yet decided, and a person can overrule any of it. Contactability is judged separately, so a prospect can be well qualified and still not emailable.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/qualification/",
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/prospects/fit-reason/",
        "https://connectbyjbrh.com/docs/prospects/discovery-criteria/",
        "https://connectbyjbrh.com/docs/prospects/contactability/",
        "https://connectbyjbrh.com/docs/workflows/deep-research-flow/",
        "https://connectbyjbrh.com/docs/prospects/prospect-identity/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/"
      ]
    },
    {
      "id": "W0024",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/prospect-reply-handling/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/prospect-reply-handling/index.md",
      "title": "Handling a prospect's reply, end to end",
      "description": "What happens between a prospect's reply landing and the record it changes: classification, the stop rules, and when a relationship is created.",
      "summary": "A reply to cold outreach is an ordinary inbound message that carries an unusual amount of meaning. It is canonicalised like any other mail, matched back to the prospect, classified, and then either stops the sequence, creates a relationship, or does both. Anything that reads as a refusal stops the sequence immediately, before any reply is drafted.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/prospect-reply/",
        "https://connectbyjbrh.com/docs/prospects/cold-sequence-stop/",
        "https://connectbyjbrh.com/docs/workflows/reply-classification/",
        "https://connectbyjbrh.com/docs/email/unsubscribe/",
        "https://connectbyjbrh.com/docs/relationships/identities/",
        "https://connectbyjbrh.com/docs/workflows/prospect-to-client/"
      ]
    },
    {
      "id": "W0022",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/prospect-research/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/prospect-research/index.md",
      "title": "Researching one prospect, end to end",
      "description": "One candidate followed through research: what is read, how a claim earns its place on the record, and what happens when nothing can be proved.",
      "summary": "Research takes one candidate — a name, usually with a location — and turns it into a record of claims, each stored with the source it came from. Anything that cannot be sourced is dropped rather than softened. The pass ends with a score, a written fit reason, and a contactability state that may well be 'researched, no address'.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/public-source-research/",
        "https://connectbyjbrh.com/docs/prospects/evidence/",
        "https://connectbyjbrh.com/docs/prospects/deep-research/",
        "https://connectbyjbrh.com/docs/workflows/prospect-evidence-capture/",
        "https://connectbyjbrh.com/docs/prospects/no-guessed-email/",
        "https://connectbyjbrh.com/docs/workflows/prospect-discovery/"
      ]
    },
    {
      "id": "W0028",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/prospect-to-client/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/prospect-to-client/index.md",
      "title": "From prospect to client, end to end",
      "description": "One relationship followed from a discovered name to a paying client, naming every record that is created, changed or left behind on the way.",
      "summary": "The arc from a name on a list to a client crosses six kinds of record, and none of them replaces the one before it. The prospect keeps its research, the Person and Company hold the relationship, the Opportunity holds the deal, and the lifecycle stage is the single field that says where the whole thing stands. Nothing is deleted as it progresses.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/prospect-to-opportunity/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/workflows/prospect-reply-handling/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "W0158",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/provider-change/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/provider-change/index.md",
      "title": "Changing a provider, end to end",
      "description": "Swapping the carrier, the mail provider or the messaging provider underneath Connect: which layer changes, what has to be re-proved, and what may never be assumed.",
      "summary": "Only the adapter layer changes. `voice_carriers.py` is the one place a provider's own words appear; `telephony.py` knows what a line is and asks `telephony.can(provider, capability)` rather than branching on a name; everything above names no provider at all. The work is not writing the adapter — it is re-proving the six things that have silently broken before.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/carrier-routing/",
        "https://connectbyjbrh.com/docs/phone/line-configuration/",
        "https://connectbyjbrh.com/research/provider-independent-telephony/",
        "https://connectbyjbrh.com/docs/email/connect-imap-smtp/",
        "https://connectbyjbrh.com/docs/workflows/model-change/",
        "https://connectbyjbrh.com/docs/workflows/regression-check/",
        "https://connectbyjbrh.com/docs/troubleshooting/phone-line-not-ringing/"
      ]
    },
    {
      "id": "W0141",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/public-api-call/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/public-api-call/index.md",
      "title": "A developer calling the public API",
      "description": "A developer calling Connect over HTTP: how a key is issued and scoped, what one request looks like, how errors are shaped, and what a rate limit means.",
      "summary": "A machine caller presents an integration key rather than a session cookie. The key is issued inside one workspace, carries an explicit scope set, and is stored only as a digest — the plaintext is shown once at issue and never again. Every request is filtered to that workspace, and a key cannot widen its own scope or reach the operator's surface.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/public-api/",
        "https://connectbyjbrh.com/developers/api-authentication/",
        "https://connectbyjbrh.com/developers/api-errors/",
        "https://connectbyjbrh.com/developers/api-rate-limits/",
        "https://connectbyjbrh.com/developers/api-idempotency/",
        "https://connectbyjbrh.com/developers/integration-keys/",
        "https://connectbyjbrh.com/developers/openapi-description/"
      ]
    },
    {
      "id": "W0134",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/quota-breaker/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/quota-breaker/index.md",
      "title": "A provider quota breaker opening and closing",
      "description": "What a provider breaker does when a model account starts refusing: which work is skipped, which is still attempted anyway, and how the breaker closes.",
      "summary": "When a model provider refuses for quota or a rejected key, a breaker opens for that provider. Scheduled work asks first and is skipped; work a person is waiting on — a caller on the line, a reply being drafted in front of you — is attempted anyway. The breaker closes on the first call that gets through, or by itself a quarter of an hour after it opened.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/model-unavailable/",
        "https://connectbyjbrh.com/docs/workflows/budget-guard/",
        "https://connectbyjbrh.com/docs/troubleshooting/provider-outage/",
        "https://connectbyjbrh.com/docs/phone/voice-budget/",
        "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-happening/"
      ]
    },
    {
      "id": "W0019",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/quota-refusal/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/quota-refusal/index.md",
      "title": "Hitting the daily allowance, end to end",
      "description": "What Connect does when the day's allowance is spent: what is held, what is refused, why the read cursor stays where it is, and how work resumes.",
      "summary": "When the daily allowance is spent, work is held rather than dropped and the read cursor deliberately does not advance. Needs You shows the refusal, nothing is deleted, and processing resumes from exactly the message it stopped at. Advancing a cursor on a refusal is how a mail agent loses messages permanently, so the refusal is written to be lossless.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/email/inbox-sync/",
        "https://connectbyjbrh.com/docs/workflows/inbound-email/",
        "https://connectbyjbrh.com/docs/email/burst-handling/",
        "https://connectbyjbrh.com/docs/workflows/burst-ingest/",
        "https://connectbyjbrh.com/research/cursor-loss/",
        "https://connectbyjbrh.com/docs/troubleshooting/mail-not-arriving/"
      ]
    },
    {
      "id": "W0005",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/realtime-engine-enablement/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/realtime-engine-enablement/index.md",
      "title": "Turning on the realtime engine, end to end",
      "description": "Switching a workspace to the speech-to-speech engine: the trunk, the dispatch rule, the worker and the console steps that have no API at all.",
      "summary": "Setting `voice.engine = \"realtime\"` is the smallest part. The call has to arrive somewhere else entirely: the number is linked at the carrier to an inbound trunk pointed at the LiveKit project's SIP host, a dispatch rule spawns the `connect-voice` worker on the room, and the worker must be running, warmed and authenticated before the first caller. Three of those steps are console-only.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/first-phone-setup/",
        "https://connectbyjbrh.com/docs/troubleshooting/phone-worker-unavailable/",
        "https://connectbyjbrh.com/docs/troubleshooting/capacity-full/",
        "https://connectbyjbrh.com/docs/workflows/inbound-phone-call/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/"
      ]
    },
    {
      "id": "W0153",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/regression-check/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/regression-check/index.md",
      "title": "Proving a change did not break anything",
      "description": "Proving a change did not break anything: the verification ladder, which rung proves what, and the two audiences every screen change has to be checked as.",
      "summary": "Pick the cheapest check that would fail if the change were wrong, run it, and stop there. Escalate a rung only when the change's reach demands it, and run the full set once, near the end. A new assertion is trusted only after it has been watched to fail, and any change to a screen or a route is checked as both audiences.",
      "status": "available",
      "audiences": [
        "developer",
        "owner"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/false-passing-tests/",
        "https://connectbyjbrh.com/research/probes-that-cry-wolf/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/research/invisible-ui-defects/",
        "https://connectbyjbrh.com/docs/workflows/docs-verification/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "W0110",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/reply-classification/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/reply-classification/index.md",
      "title": "Classifying a prospect's reply, end to end",
      "description": "What Connect does with an answer to cold outreach: the classes it sorts replies into, what each one stops or starts, and which ones a person must confirm.",
      "summary": "A reply is classified so that the right thing stops or starts: a refusal stops the sequence and is recorded as suppression, interest becomes an opportunity, a later date becomes a dated follow-up, and an automatic message is not mistaken for either. Stops are honoured immediately; anything that would start commercial work goes past a person.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/prospect-reply/",
        "https://connectbyjbrh.com/docs/workflows/prospect-reply-handling/",
        "https://connectbyjbrh.com/docs/prospects/cold-sequence-stop/",
        "https://connectbyjbrh.com/docs/prospects/prospect-to-opportunity/",
        "https://connectbyjbrh.com/docs/prospects/compliance-check/",
        "https://connectbyjbrh.com/docs/follow-ups/creating/",
        "https://connectbyjbrh.com/docs/autonomy/needs-you/",
        "https://connectbyjbrh.com/docs/workflows/commercial-decision/"
      ]
    },
    {
      "id": "W0059",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/resolve-conflict/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/resolve-conflict/index.md",
      "title": "Resolving conflicting Knowledge, end to end",
      "description": "From a contradiction being detected to a source that answers again: what is compared, what is refused, and the decision only a person can take.",
      "summary": "A contradiction parks the newer source in review and leaves the incumbent answering. Clearing it means reading both recorded claims, deciding whether they are genuinely incompatible, and changing one of the documents — activation is refused while the conflict stands, so there is no route that acknowledges the problem without fixing it.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/source-conflict/",
        "https://connectbyjbrh.com/docs/knowledge/owner-authority/",
        "https://connectbyjbrh.com/docs/knowledge/facts/",
        "https://connectbyjbrh.com/docs/knowledge/sources/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-answer-from-knowledge/"
      ]
    },
    {
      "id": "W0128",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/retrieval-for-a-reply/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/retrieval-for-a-reply/index.md",
      "title": "Retrieving Knowledge for one reply",
      "description": "How much of your Knowledge actually reaches one answer: how the question is formed, what the budget allows, how material is chosen, and how to see the choice.",
      "summary": "Only a small, chosen part of your Knowledge reaches any single reply. The question is formed from the conversation rather than from its last line, material is selected by retrieval over the sources you supplied, and a budget caps what is carried — on a live call, roughly two thousand characters and about four facts. What was selected can be inspected before anything is sent.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/retrieval/",
        "https://connectbyjbrh.com/docs/knowledge/retrieval-test/",
        "https://connectbyjbrh.com/docs/workflows/grounded-answer/",
        "https://connectbyjbrh.com/docs/knowledge/facts/",
        "https://connectbyjbrh.com/docs/troubleshooting/wrong-answer-from-knowledge/",
        "https://connectbyjbrh.com/docs/memory/memory-in-channels/",
        "https://connectbyjbrh.com/docs/knowledge/unsupported-claims/",
        "https://connectbyjbrh.com/research/grounding-without-a-vector-database/"
      ]
    },
    {
      "id": "W0086",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/runtime-toggle/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/runtime-toggle/index.md",
      "title": "Turning Connect on or off at runtime",
      "description": "What the runtime switch actually stops, what finishes anyway, what happens to work that was scheduled, and what the people on the other end experience.",
      "summary": "The switch stops Connect taking new work. Anything already handed to a provider finishes there — a sent message is not recalled — and nothing is deleted. What changes is that scheduled work stops firing, and the people writing in receive no reply at all rather than a slower one, because nothing announces that Connect is off.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/connect-on-off/",
        "https://connectbyjbrh.com/docs/workflows/stopping-connect/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-happening/"
      ]
    },
    {
      "id": "W0159",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/scaling-up/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/scaling-up/index.md",
      "title": "Handling more volume, end to end",
      "description": "What binds first when volume rises — worker capacity, plan allowance, model quota, query cost — and the order in which to change them without guessing.",
      "summary": "Four limits bind, and rarely the one people expect. Worker capacity refuses calls at a load of 0.85 per core; the plan's daily allowance holds sends; the model quota opens a breaker on a 429; and query cost grows with the business rather than with traffic. Measure statements before adding anything, because the fourth limit is the one that looks like all the others.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone",
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/worker-capacity/",
        "https://connectbyjbrh.com/docs/phone/voice-budget/",
        "https://connectbyjbrh.com/research/n-plus-one-that-grows/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/",
        "https://connectbyjbrh.com/docs/troubleshooting/capacity-full/",
        "https://connectbyjbrh.com/docs/troubleshooting/slow-screen/",
        "https://connectbyjbrh.com/docs/workflows/incident-review/"
      ]
    },
    {
      "id": "W0099",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/send-with-evidence/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/send-with-evidence/index.md",
      "title": "Sending with provider evidence, end to end",
      "description": "Every state a message passes through between the decision to send and the provider's acknowledgement, including the third state that is neither sent nor failed.",
      "summary": "A message is reported as sent only when the provider has acknowledged it. Before that it is attempting; if it never reached the provider it is a clean failure that can be retried; and if it reached the provider but the acknowledgement was lost, it is *uncertain* — shown as uncertain rather than guessed either way, because re-sending on a maybe is how a customer gets the same reply twice.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/send-evidence/",
        "https://connectbyjbrh.com/docs/email/sending/",
        "https://connectbyjbrh.com/docs/troubleshooting/uncertain-send/",
        "https://connectbyjbrh.com/docs/troubleshooting/send-failed/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/"
      ]
    },
    {
      "id": "W0109",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/sender-readiness-check/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/sender-readiness-check/index.md",
      "title": "The readiness check before outreach",
      "description": "Every gate an outreach message passes before it leaves, in the order they are evaluated, and what a refusal at each one looks like from the screen.",
      "summary": "Outreach passes a series of gates, ordered so that the ones which stop everything are asked before the ones that cost work. Channel and runtime first, then whether this is even a prospect, then compliance, then whether there is an evidenced address, then the sending mailbox, then the allowance, then autonomy. Only after all of those does anything reach a provider.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/sender-readiness/",
        "https://connectbyjbrh.com/docs/prospects/compliance-check/",
        "https://connectbyjbrh.com/docs/workflows/prospect-outreach/",
        "https://connectbyjbrh.com/docs/prospects/first-outreach/",
        "https://connectbyjbrh.com/docs/troubleshooting/outreach-blocked/",
        "https://connectbyjbrh.com/docs/troubleshooting/prospect-allowance/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/sms/"
      ]
    },
    {
      "id": "W0151",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/service-interruption/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/service-interruption/index.md",
      "title": "Communicating during an interruption",
      "description": "What Connect says to customers during an interruption, what it keeps internal, who is told first, and why a cause and a restoration time are held back.",
      "summary": "Say what is affected, in the business's own name, without a cause and without a restoration time nobody can honour. Connect keeps its own failures visible internally — line health and mailbox health both escalate into the queue — while what reaches a customer stays plain: no internal detail, no provider error text, no speculation.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/docs/email/mailbox-health/",
        "https://connectbyjbrh.com/docs/phone/phone-health/",
        "https://connectbyjbrh.com/docs/workflows/mailbox-health-review/",
        "https://connectbyjbrh.com/docs/workflows/complaint-escalation/",
        "https://connectbyjbrh.com/developers/status-manifest/"
      ]
    },
    {
      "id": "W0081",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/session-establishment/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/session-establishment/index.md",
      "title": "Establishing a session, end to end",
      "description": "What a session actually is in Connect: what the server keeps, what the browser holds, what it resolves to, and what can be ended from which side.",
      "summary": "A session is a server-side record with an opaque reference in a cookie the page's own scripts cannot read. It carries one identity and resolves to exactly one workspace, and every request is answered inside that resolution. Because the authority is the record rather than the cookie, the server can end a session without the browser's cooperation.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/sessions/",
        "https://connectbyjbrh.com/docs/account/session-replacement/",
        "https://connectbyjbrh.com/docs/workflows/google-sign-in/",
        "https://connectbyjbrh.com/docs/workflows/workspace-resolution-flow/",
        "https://connectbyjbrh.com/docs/troubleshooting/session-expired/"
      ]
    },
    {
      "id": "W0089",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/sign-out-replacement/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/sign-out-replacement/index.md",
      "title": "Signing out and replacing a session",
      "description": "The two ways a session ends on one browser — signing out, and signing in as somebody else — and why neither of them touches your other devices.",
      "summary": "Signing out revokes this browser's session and clears its cookie. Signing in as a different person on the same browser does the same thing to the session that browser was holding, before the new one is issued. Neither ends a session anywhere else. Ending your other devices is a separate control, and it deliberately never ends the session you are pressing it with.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/sessions/",
        "https://connectbyjbrh.com/docs/account/session-replacement/",
        "https://connectbyjbrh.com/docs/workflows/account-security-review/",
        "https://connectbyjbrh.com/docs/troubleshooting/session-expired/",
        "https://connectbyjbrh.com/docs/account/google-sign-in/"
      ]
    },
    {
      "id": "W0045",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/sms-inbound/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/sms-inbound/index.md",
      "title": "An inbound SMS, end to end",
      "description": "An inbound text message followed from the provider webhook to the person it belongs to and the decision about answering it, with what can fail at each stage.",
      "summary": "A customer texts the business number. The provider posts it, Connect verifies the post, resolves the workspace, deduplicates on the provider's identifier, attaches the message to a Person and lets the agent loop reason about it. The flow then stops short of where email's continues: on the live carrier there is no SMS reply, so the decision that comes out is work on another channel, or an item for a person.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/inbound-sms/",
        "https://connectbyjbrh.com/docs/workflows/sms-stop/",
        "https://connectbyjbrh.com/docs/sms/sms-dedupe/",
        "https://connectbyjbrh.com/docs/sms/sms-relationship/",
        "https://connectbyjbrh.com/docs/workflows/whatsapp-inbound/",
        "https://connectbyjbrh.com/docs/workflows/cross-channel-handover/"
      ]
    },
    {
      "id": "W0046",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/sms-stop/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/sms-stop/index.md",
      "title": "An SMS STOP, end to end",
      "description": "A stop request followed from the word in the message to the suppression, the audit entry and the confirmation, including what is deliberately skipped.",
      "summary": "The opt-out word is recognised at ingest, before any reasoning. A suppression is written against the person, a memory row tagged `block:sms` records the directive durably, and the audit trail records the refusal as a decision. Everything after that is skipped on purpose: no draft, no approval queue, no sales judgement about whether the customer really meant it.",
      "status": "foundation",
      "audiences": [
        "both"
      ],
      "channels": [
        "sms"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sms/stop/",
        "https://connectbyjbrh.com/docs/sms/sms-suppression/",
        "https://connectbyjbrh.com/docs/workflows/sms-inbound/",
        "https://connectbyjbrh.com/docs/workflows/dnc-across-channels/",
        "https://connectbyjbrh.com/docs/workflows/whatsapp-optout/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "W0065",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/stopping-connect/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/stopping-connect/index.md",
      "title": "Stopping Connect, end to end",
      "description": "The runtime switch end to end: what stops the moment you use it, what was already handed to a provider, and what is waiting when you switch back on.",
      "summary": "The runtime switch stops Connect picking up new work, and changes nothing else. Every autonomy mode, mailbox, line and standing instruction stays exactly as it was, so switching back on resumes the configuration you already had. What has already been handed to a provider is beyond recall: the switch governs what happens next, not what has happened.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/connect-on-off/",
        "https://connectbyjbrh.com/docs/workflows/runtime-toggle/",
        "https://connectbyjbrh.com/docs/autonomy/modes/",
        "https://connectbyjbrh.com/docs/autonomy/audit-trail/",
        "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-sending/",
        "https://connectbyjbrh.com/docs/troubleshooting/nothing-is-happening/",
        "https://connectbyjbrh.com/research/derived-control-state/"
      ]
    },
    {
      "id": "W0038",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/support-case/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/support-case/index.md",
      "title": "A support case, end to end",
      "description": "A customer problem from the message that raises it to the resolution and the memory it leaves: every stage, what changes, and what can fail at each.",
      "summary": "A problem arrives on whatever channel the customer uses, resolves to a Person, and — when somebody opens one — becomes a case on that relationship. The reply is grounded in the history already attached to them, held or sent according to autonomy, and evidenced by the provider. Resolution writes an outcome that the next case will be answered from.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/cases/",
        "https://connectbyjbrh.com/docs/support/case-context/",
        "https://connectbyjbrh.com/docs/support/resolving/",
        "https://connectbyjbrh.com/docs/troubleshooting/case-not-created/",
        "https://connectbyjbrh.com/docs/workflows/client-to-support/",
        "https://connectbyjbrh.com/docs/relationships/timeline/"
      ]
    },
    {
      "id": "W0101",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/suppression-application/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/suppression-application/index.md",
      "title": "Applying a suppression, end to end",
      "description": "What happens when an address or a person is suppressed: where the entry is recorded, which gate reads it, what refuses afterwards, and who is allowed to clear it.",
      "summary": "A suppression is recorded once and read by the single compliance check that runs before any outreach, so it takes effect everywhere at once rather than channel by channel. Refusals are recorded with the suppression's origin. A do-not-contact entry is the strongest form, is not cleared casually, and the Connect Assistant cannot clear one at all.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/email/dnc/",
        "https://connectbyjbrh.com/docs/workflows/unsubscribe-workflow/",
        "https://connectbyjbrh.com/docs/troubleshooting/suppressed-recipient/",
        "https://connectbyjbrh.com/research/authority-separation/"
      ]
    },
    {
      "id": "W0096",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/thread-creation/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/thread-creation/index.md",
      "title": "Creating a conversation thread, end to end",
      "description": "From one arriving message to a conversation with a person and a company attached: what is matched, what is created, and what is decided once and kept.",
      "summary": "An arriving message is matched to an existing conversation or starts a new one, and the sender is resolved to a person — an existing one wherever the evidence supports it — who may in turn be linked to a company. Two things are decided at this moment and then kept: which mailbox the conversation belongs to, and which person it is about.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/threads/",
        "https://connectbyjbrh.com/docs/email/contact-resolution/",
        "https://connectbyjbrh.com/docs/email/message-canonicalisation/",
        "https://connectbyjbrh.com/docs/troubleshooting/duplicate-threads/",
        "https://connectbyjbrh.com/research/one-person-many-channels/"
      ]
    },
    {
      "id": "W0114",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/timeline-assembly/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/timeline-assembly/index.md",
      "title": "Building the timeline, end to end",
      "description": "How a person's timeline is put together from the records that own each event, why it is ordered by when things happened, and what it leaves out on purpose.",
      "summary": "A timeline is assembled when you open it, not stored. Connect reads the canonical records that own each event — conversations, calls, follow-ups, deals, cases — narrows them to one person through their identities, and orders them by when each thing happened rather than when Connect learned of it. What is missing is usually excluded on purpose or attached to a second record.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/timeline/",
        "https://connectbyjbrh.com/docs/relationships/customer-360/",
        "https://connectbyjbrh.com/docs/workflows/customer-360-assembly/",
        "https://connectbyjbrh.com/docs/relationships/identities/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/troubleshooting/missing-timeline-entry/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/email/held-drafts/"
      ]
    },
    {
      "id": "W0124",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/tool-call-execution/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/tool-call-execution/index.md",
      "title": "Executing one Assistant tool call, end to end",
      "description": "One Assistant tool call from argument to audit entry: what validates the arguments, which service does the work, the gates it passes, and what is recorded.",
      "summary": "A tool call is not the Assistant doing something directly. Arguments are checked, then the call is handed to the service that owns the record, which applies the same validation and the same rules it applies to a person on that record's own screen. Two further gates sit above it: the Assistant's authority is narrower than yours, and anything leaving the workspace still meets the channel's autonomy rule.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/assistant-tools/",
        "https://connectbyjbrh.com/docs/assistant/executing-actions/",
        "https://connectbyjbrh.com/docs/assistant/assistant-authority/",
        "https://connectbyjbrh.com/docs/workflows/assistant-action/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/agent-tools-call-services/"
      ]
    },
    {
      "id": "W0018",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/unsubscribe-workflow/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/unsubscribe-workflow/index.md",
      "title": "An unsubscribe request, end to end",
      "description": "What happens between somebody asking to be left alone and the record that proves it: the suppression, its scope, and the one entry nobody clears casually.",
      "summary": "An unsubscribe arrives either as a click on the link in an outreach message or as a reply asking to stop. Both end in the same place: a suppression against that address, checked before any future outreach, with the decision recorded. Nothing about it is best-effort — the check happens in one place, before a message is written rather than after.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/unsubscribe/",
        "https://connectbyjbrh.com/docs/email/suppression-list/",
        "https://connectbyjbrh.com/docs/email/dnc/",
        "https://connectbyjbrh.com/docs/workflows/suppression-application/",
        "https://connectbyjbrh.com/docs/troubleshooting/suppressed-recipient/",
        "https://connectbyjbrh.com/docs/workflows/complaint-handling/",
        "https://connectbyjbrh.com/docs/workflows/outreach-sequence/"
      ]
    },
    {
      "id": "W0066",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/upload-and-answer/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/upload-and-answer/index.md",
      "title": "Uploading a file and answering from it, end to end",
      "description": "The whole path from dropping a file into Connect to reading an answer grounded in it: validation, safe parsing, extraction, grounding and the citation.",
      "summary": "You drop a file and ask a question about it. Between those two moments Connect checks what the file actually is, refuses it if parsing it would be unsafe, stores it in your workspace, reads what it can out of it, answers from that reading, and names the file in the answer. Every step can refuse, and each refusal says which step it was.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/upload/",
        "https://connectbyjbrh.com/docs/files-data/answer-from-file/",
        "https://connectbyjbrh.com/docs/files-data/safe-parsing/",
        "https://connectbyjbrh.com/docs/files-data/mime-validation/",
        "https://connectbyjbrh.com/docs/troubleshooting/file-rejected/",
        "https://connectbyjbrh.com/research/files-through-one-service/"
      ]
    },
    {
      "id": "W0131",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/usage-metering/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/usage-metering/index.md",
      "title": "Metering usage, end to end",
      "description": "How Connect counts what a workspace uses: which dimensions exist, when each is reserved or merely tracked, and what the daily ledger is actually for.",
      "summary": "Every limit Connect claims is declared in one registry that says how it is enforced and where. Daily dimensions are reserved before any provider is called, so a refusal happens before anything leaves the building; resource dimensions are ceilings on how many of a thing may exist. Some dimensions are counted and never used to refuse, and the registry says which.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/usage/",
        "https://connectbyjbrh.com/docs/account/entitlements/",
        "https://connectbyjbrh.com/docs/workflows/allowance-enforcement/",
        "https://connectbyjbrh.com/docs/email/daily-allowance/",
        "https://connectbyjbrh.com/docs/phone/voice-cost/",
        "https://connectbyjbrh.com/docs/workflows/budget-guard/"
      ]
    },
    {
      "id": "W0009",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/voice-tuning-cycle/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/voice-tuning-cycle/index.md",
      "title": "Tuning the voice, end to end",
      "description": "Changing how the voice sounds and behaves, then proving the change: the two kinds of control, the test call, the review, and the findings no setting can fix.",
      "summary": "Tuning is a loop with evidence in it: draft settings in the Voice Lab, place a test call, read the review of that call, apply what it recommends. The Lab is built on one honesty — the realtime engine is speech-to-speech, so there is no synthesiser with a pitch dial. Every control is either a session parameter or a line of instruction, and each one says which it is.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/inbound-phone-call/",
        "https://connectbyjbrh.com/docs/troubleshooting/voice-cut-the-caller/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/research/model-limited-findings/"
      ]
    },
    {
      "id": "W0142",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/webhook-delivery/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/webhook-delivery/index.md",
      "title": "Delivering an outbound webhook",
      "description": "The outbound webhook interface Connect publishes: the signed envelope, at-least-once delivery, the retry and pause rules — and why nothing is being delivered yet.",
      "summary": "Connect publishes a full outbound webhook contract — one channel, one signed envelope, at-least-once delivery — but the delivery side is not yet implemented, so no workspace is sending events today. Read this as the shape a receiver has to be built to honour, not as something to subscribe to. Until it runs, take events from the application itself or by polling.",
      "status": "not_yet",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/webhooks-outbound/",
        "https://connectbyjbrh.com/developers/webhook-signatures/",
        "https://connectbyjbrh.com/developers/asyncapi-events/",
        "https://connectbyjbrh.com/developers/webhooks-vs-polling/",
        "https://connectbyjbrh.com/docs/workflows/public-api-call/",
        "https://connectbyjbrh.com/docs/protocols/"
      ]
    },
    {
      "id": "W0040",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/website-enquiry/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/website-enquiry/index.md",
      "title": "A website enquiry, end to end",
      "description": "A public-site enquiry from the submitted form to an answered person, and the stage where having no workspace decides everything that follows.",
      "summary": "Someone with no account submits a form on the JBRH site. There is no session and no workspace to resolve, so the submission is stored on the control plane rather than inside a tenant. The operator answers it from JBRH's own workspace, and only if it becomes a real relationship does a Person get created — in that workspace, not in anybody else's.",
      "status": "available_owner",
      "audiences": [
        "owner",
        "customer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/support/website-enquiries/",
        "https://connectbyjbrh.com/docs/troubleshooting/enquiry-not-visible/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/research/invisible-not-missing/",
        "https://connectbyjbrh.com/docs/support/"
      ]
    },
    {
      "id": "W0042",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/whatsapp-follow-up-execution/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/whatsapp-follow-up-execution/index.md",
      "title": "A WhatsApp follow-up, end to end",
      "description": "A scheduled WhatsApp follow-up from due to sent: the composition, the autonomy and consent checks, the window, and the template fallback when Meta refuses.",
      "summary": "When a WhatsApp follow-up falls due, the engine tick composes a message from the reason recorded on it and hands it to `whatsapp.dispatch`. Inside the 24-hour window that message goes as written; outside it, only the approved template the workspace nominated. A refusal is recorded with its reason and the commitment stays visible rather than vanishing.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/whatsapp-follow-up/",
        "https://connectbyjbrh.com/docs/whatsapp/replying/",
        "https://connectbyjbrh.com/docs/whatsapp/whatsapp-limits/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/docs/workflows/whatsapp-inbound/",
        "https://connectbyjbrh.com/research/callback-promises/"
      ]
    },
    {
      "id": "W0041",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/whatsapp-inbound/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/whatsapp-inbound/index.md",
      "title": "An inbound WhatsApp message, end to end",
      "description": "One inbound WhatsApp message followed the whole way: Meta's signed webhook, the stored record, the draft, the autonomy decision and the timeline entry.",
      "summary": "A customer writes; Meta posts to Connect's one webhook URL; the signature is checked against the account's app secret, the sender is resolved to a Person, and the message is stored. `whatsapp_engine` grounds an answer and hands it to `whatsapp.dispatch`, which asks the autonomy policy whether to send it, queue it for approval, or hold it as a draft.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/whatsapp/inbound-webhook/",
        "https://connectbyjbrh.com/docs/whatsapp/replying/",
        "https://connectbyjbrh.com/docs/whatsapp/person-resolution/",
        "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-not-receiving/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
        "https://connectbyjbrh.com/docs/workflows/"
      ]
    },
    {
      "id": "W0044",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/whatsapp-optout/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/whatsapp-optout/index.md",
      "title": "A WhatsApp opt-out, end to end",
      "description": "A WhatsApp opt-out followed end to end: the STOP word, the three records it writes, what changes for every pending message, and the START that reverses it.",
      "summary": "A customer writes **STOP** on its own. Connect marks the conversation opted out, withdraws consent on that person's WhatsApp route, and writes a memory block that every send path already consults. Anything pending for them is refused from that moment, and the decision is in the audit trail. Inbound messages keep arriving.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/opt-out/",
        "https://connectbyjbrh.com/docs/whatsapp/replying/",
        "https://connectbyjbrh.com/docs/workflows/dnc-across-channels/",
        "https://connectbyjbrh.com/docs/sms/stop/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "W0043",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/whatsapp-setup-workflow/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/whatsapp-setup-workflow/index.md",
      "title": "Connecting WhatsApp, end to end",
      "description": "Connecting WhatsApp from a Meta credential set to a first verified inbound message, the QR alternative, and the checkpoint that proves each half of the chain.",
      "summary": "Setup runs from a Meta credential set — phone number ID, WhatsApp Business account ID, access token, app secret — through a webhook handshake and a Verify that asks Meta about the number, to an autonomy decision, and ends with one real message from a phone in your hand. That message proves the inbound chain; the reply that follows proves the outbound one.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "whatsapp"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/whatsapp/channel-setup/",
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/troubleshooting/whatsapp-not-receiving/",
        "https://connectbyjbrh.com/docs/workflows/channel-configuration/",
        "https://connectbyjbrh.com/docs/workflows/channel-verification/",
        "https://connectbyjbrh.com/docs/whatsapp/whatsapp-owner-tenant/"
      ]
    },
    {
      "id": "W0117",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/won-deal-handover/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/won-deal-handover/index.md",
      "title": "Handing a won deal to onboarding",
      "description": "What happens when an opportunity is won: which records carry over untouched, what is newly created, and the two mistakes that split a customer in half.",
      "summary": "Nothing is copied. The same person and company records continue, with their identities, conversations, timeline and memory intact; winning changes the opportunity's state and the person's lifecycle stage. What is created is new work — onboarding actions and dated follow-ups — and a change in how Connect treats them afterwards, including stopping any prospecting aimed at them.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/close-deal/",
        "https://connectbyjbrh.com/docs/sales/won-and-lost/",
        "https://connectbyjbrh.com/docs/relationships/lifecycle-stages/",
        "https://connectbyjbrh.com/docs/workflows/lifecycle-progression/",
        "https://connectbyjbrh.com/docs/support/onboarding/",
        "https://connectbyjbrh.com/docs/workflows/onboarding-workflow/",
        "https://connectbyjbrh.com/docs/relationships/merging/",
        "https://connectbyjbrh.com/docs/workflows/demo-request/"
      ]
    },
    {
      "id": "W0085",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/workspace-admin-permission/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/workspace-admin-permission/index.md",
      "title": "Granting a permission, end to end",
      "description": "Granting or removing a permission in a workspace: who may do it, when the change takes effect, what it does not widen, and the record it leaves.",
      "summary": "An administrator changes what a member may do, the change is a record rather than something carried in a session, and the next request reads it — so nobody has to sign out and back in. It leaves an entry naming who changed what and when. A permission widens what a person may do; it never widens what Connect may do on its own.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/workspace-admin/",
        "https://connectbyjbrh.com/docs/autonomy/permissions/",
        "https://connectbyjbrh.com/docs/workflows/adding-a-colleague/",
        "https://connectbyjbrh.com/docs/troubleshooting/permission-denied/",
        "https://connectbyjbrh.com/docs/security/authorization/"
      ]
    },
    {
      "id": "W0136",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/workspace-creation/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/workspace-creation/index.md",
      "title": "Creating a customer workspace, end to end",
      "description": "From a first Google sign-in to a workspace that can actually receive mail: what is created, what is not, and the three things still missing afterwards.",
      "summary": "A workspace is created by signing in, not by filling in a form. The first Google sign-in from an address with no existing membership creates three rows together: the workspace, your membership as its administrator, and its entitlement with a starting plan. Nothing can arrive yet — a workspace with no connected mailbox and no claimed number has no way in.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/first-sign-in/",
        "https://connectbyjbrh.com/docs/workflows/workspace-setup/",
        "https://connectbyjbrh.com/docs/account/workspace-resolution/",
        "https://connectbyjbrh.com/docs/account/entitlements/",
        "https://connectbyjbrh.com/docs/workflows/workspace-deletion/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/"
      ]
    },
    {
      "id": "W0137",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/workspace-deletion/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/workspace-deletion/index.md",
      "title": "Removing a workspace, end to end",
      "description": "What removing a workspace actually does: how access ends, which records stay outside it by design, and which parts of it can never be undone.",
      "summary": "Removal is layered, and there is no single button that performs it. Access ends first: a workspace that is not active resolves no session, so every screen closes at once. Provider connections are revoked separately at each provider. Erasure of the stored records is an operator action taken outside the application's screens, deliberately, so that nothing performs it by accident.",
      "status": "available_owner",
      "audiences": [
        "owner"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/workflows/workspace-creation/",
        "https://connectbyjbrh.com/docs/security/data-retention/",
        "https://connectbyjbrh.com/docs/security/workspace-isolation/",
        "https://connectbyjbrh.com/docs/account/workspace-admin/",
        "https://connectbyjbrh.com/research/workspace-stamp/",
        "https://connectbyjbrh.com/docs/security/credential-sealing/"
      ]
    },
    {
      "id": "W0083",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/workspace-resolution-flow/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/workspace-resolution-flow/index.md",
      "title": "Resolving which workspace a request belongs to",
      "description": "How a request is tied to exactly one workspace before any handler runs, and the three independent places that resolution is enforced afterwards.",
      "summary": "Resolution happens once, in the middleware, before any router sees the request: the session names one workspace and the request is answered inside it or not at all. Enforcement then happens three more times — an allowlist in front of the application, a filter on every query it builds, and a policy inside the database on the statement it receives.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/account/workspace-resolution/",
        "https://connectbyjbrh.com/docs/workflows/isolation-verification/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/security/multi-tenancy/",
        "https://connectbyjbrh.com/docs/workflows/owner-tenant-routing/"
      ]
    },
    {
      "id": "W0072",
      "kind": "workflow",
      "url": "https://connectbyjbrh.com/docs/workflows/workspace-setup/",
      "markdown": "https://connectbyjbrh.com/docs/workflows/workspace-setup/index.md",
      "title": "Setting up a workspace, end to end",
      "description": "Taking a workspace from empty to working: the business profile, the channels, what Connect is allowed to say, and what it may do unsupervised.",
      "summary": "Four things turn an empty workspace into a working one, and the order matters. Tell Connect who the business is, connect at least one channel, give it something to be right from, then decide what it may do without asking. Skip the third and it answers from general knowledge; skip the fourth and it either does nothing or does more than you meant.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/getting-started/first-hour/",
        "https://connectbyjbrh.com/docs/getting-started/first-week/",
        "https://connectbyjbrh.com/docs/workflows/first-sign-in/",
        "https://connectbyjbrh.com/docs/workflows/first-phone-setup/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/autonomy/modes/"
      ]
    },
    {
      "id": "R0031",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/",
      "markdown": "https://connectbyjbrh.com/research/index.md",
      "title": "Engineering notes",
      "description": "Engineering notes from building and operating Connect: each one states its method, what was measured, the numbers that came out, and what it cannot tell you.",
      "summary": "These are working notes, not essays. Each page names a method, gives the measurement it produced, and says where the measurement stops. They cover voice latency, isolation, query cost, counting bugs, tests that passed while proving nothing, and the defects a browser shows that a source file hides. None names a customer, and none reports a number nobody measured.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/docs/technology/",
        "https://connectbyjbrh.com/developers/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/research/n-plus-one-that-grows/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/"
      ]
    },
    {
      "id": "R0016",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/agent-tools-call-services/",
      "markdown": "https://connectbyjbrh.com/research/agent-tools-call-services/index.md",
      "title": "Why an agent's tools should call domain services",
      "description": "The shortcut where an agent tool writes rows directly, the rules that shortcut silently skips, and the shape that keeps one implementation for people and agents.",
      "summary": "A tool that writes to the database directly is quicker to build and removes every rule the domain service carries — autonomy, suppression, the daily allowance, the audit entry and the scope filters. Connect's 66 Assistant tools call the same services a person's click calls, and the voice worker holds no business logic at all: it reports what happened and the engine decides what it means.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/research/authority-separation/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/research/grid-over-services/"
      ]
    },
    {
      "id": "R0023",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/approval-without-blocking/",
      "markdown": "https://connectbyjbrh.com/research/approval-without-blocking/index.md",
      "title": "Human approval without blocking low-risk work",
      "description": "Approval set as a rule per channel and scope rather than per message, a queue that drains itself, and the trade each of the four modes actually makes.",
      "summary": "The unit of approval is a rule, not a message. `autonomy.py` decides per channel across four scopes — contact, endpoint, channel, workspace, narrowest first — so low-risk work runs and only the categories a business chose to hold ever reach a person. Needs You is ranked rather than chronological, and every entry drains by itself once its cause clears.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/authority-separation/",
        "https://connectbyjbrh.com/research/derived-control-state/",
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "R0024",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/authority-separation/",
      "markdown": "https://connectbyjbrh.com/research/authority-separation/index.md",
      "title": "Separating the agent's authority from the person's",
      "description": "The agent's rights are a strict subset of the person's. What is deliberately absent from the tool set, the three places it matters, and where it thins out.",
      "summary": "Connect's Assistant holds fewer rights than the person using it. Some actions are not in the 66-tool set at all — pricing authority, clearing a do-not-contact entry — so no amount of persuasion reaches them. The three places this earns its keep are commercial terms, compliance and identity, and each is a place where a wrong action is expensive and hard to undo.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/research/agent-tools-call-services/",
        "https://connectbyjbrh.com/research/approval-without-blocking/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/",
        "https://connectbyjbrh.com/docs/autonomy/"
      ]
    },
    {
      "id": "R0045",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/background-threads/",
      "markdown": "https://connectbyjbrh.com/research/background-threads/index.md",
      "title": "A background thread that outlives its task",
      "description": "Cancelling the coroutine that awaits a worker thread does not stop the thread. What the orphan did at shutdown, and the cooperative stop that replaced it.",
      "summary": "`asyncio.to_thread` cannot be cancelled. Cancelling the task that awaits it ends the coroutine and leaves the worker running, detached and unreachable. At shutdown that orphan asked the connection pool for a connection while everything else was tearing down, waited out the pool timeout and raised — so the fix is to ask the thread to stop and then wait for it, with a bound.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/single-thinker/",
        "https://connectbyjbrh.com/research/stale-credentials/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/probes-that-cry-wolf/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/"
      ]
    },
    {
      "id": "R0002",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/barge-in-without-cutting-the-greeting/",
      "markdown": "https://connectbyjbrh.com/research/barge-in-without-cutting-the-greeting/index.md",
      "title": "Barge-in without cutting the greeting in half",
      "description": "Letting a caller interrupt a voice agent without a cough killing the opening: the protected greeting, the sensitivity setting and the two-second rule.",
      "summary": "Interruption and a clean opening pull against each other, so Connect separates them rather than compromising. The greeting is synthesised before pickup and played with the caller's audio muted; interruption handling applies to everything after it. Speech detection is then deliberately sensitive, so a one-word answer starts a turn, and a voice still talking two seconds after the caller spoke over it is recorded as an ignored interruption.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/research/silent-failure/",
        "https://connectbyjbrh.com/research/model-limited-findings/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/"
      ]
    },
    {
      "id": "R0046",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/boot-time-migrations/",
      "markdown": "https://connectbyjbrh.com/research/boot-time-migrations/index.md",
      "title": "Migrations that run on every boot",
      "description": "Schema changes applied on every start, with no migration framework: what idempotent has to mean, and the properties a reflection API cannot see.",
      "summary": "Connect migrates its schema on every boot, from the mapped models, with no migration framework: `migrate.py` compares what the models declare against what the database has and adds what is missing. It is additive only and never drops or rewrites data. The price of that is exact — every step must survive being run again, and against two instances booting at once.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/workspace-stamp/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/research/false-passing-tests/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/n-plus-one-that-grows/"
      ]
    },
    {
      "id": "R0003",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/callback-promises/",
      "markdown": "https://connectbyjbrh.com/research/callback-promises/index.md",
      "title": "Preventing a voice agent from promising a call-back it cannot keep",
      "description": "How a voice agent came to promise call-backs nothing had booked, the time-word rule that refuses the record, and the finding that measures the residue.",
      "summary": "A model will say *someone will ring you at four* whether or not anything was recorded. Connect refuses the record rather than trusting the sentence: `record_event` rejects a time that shares no time word with the caller's most recent time-bearing line, unless the caller agreed to a time the voice said aloud. The tool answers **NOT recorded**, so the model cannot report a booking it does not hold.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/follow-ups/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/silent-failure/"
      ]
    },
    {
      "id": "R0030",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/closed-by-default-facade/",
      "markdown": "https://connectbyjbrh.com/research/closed-by-default-facade/index.md",
      "title": "A tenant facade that fails closed",
      "description": "An unmapped API path is refused rather than guessed, in the browser and again on the server. What that costs per feature, and the enumerated test that keeps it honest.",
      "summary": "A customer session never calls an operator path directly. `tenantAdapt` rewrites the path it recognises and turns everything else into a blocked request that answers 403, and `customer_safe` in the middleware refuses any `/api/*` the session is not permitted to call. Both fail closed, so a new capability is unreachable for a tenant until somebody makes it reachable on purpose.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/invisible-ui-defects/",
        "https://connectbyjbrh.com/docs/account/",
        "https://connectbyjbrh.com/research/false-passing-tests/"
      ]
    },
    {
      "id": "R0036",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/counting-past-the-limit/",
      "markdown": "https://connectbyjbrh.com/research/counting-past-the-limit/index.md",
      "title": "Headline numbers that stop at the page size",
      "description": "When a list limit becomes a total, a workspace of 540 is told it has 500 and a category of 40 reads as 0. Two measured cases and the way to find more.",
      "summary": "A slice taken for a list — the newest 500 rows, the newest 400 threads — becomes a lie the moment anything counts it. Two measured cases: a workspace with 540 contacts was told it had 500 organisations when it had 530, and 0 already contacted when it had 40; a workspace with 430 conversations saw a Closed tab reading 0 and page five empty.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/n-plus-one-that-grows/",
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/research/false-passing-tests/",
        "https://connectbyjbrh.com/research/invisible-not-missing/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/"
      ]
    },
    {
      "id": "R0034",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/cursor-loss/",
      "markdown": "https://connectbyjbrh.com/research/cursor-loss/index.md",
      "title": "How a mail cursor loses messages, and how to stop it",
      "description": "A read position advanced on a refusal skips mail permanently and silently. The rule that prevents it, the ordering it depends on, and how to check.",
      "summary": "A mail agent reads forward through a mailbox and remembers where it got to. If that position advances on any exit path rather than only on a completed one, a refusal marks messages as done that nothing ever looked at — and the provider will not offer them again. The rule here is that a refusal holds work and leaves the read position exactly where it was.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/",
        "https://connectbyjbrh.com/research/approval-without-blocking/",
        "https://connectbyjbrh.com/research/invisible-not-missing/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "R0025",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/derived-control-state/",
      "markdown": "https://connectbyjbrh.com/research/derived-control-state/index.md",
      "title": "Deriving control state from the log instead of storing it",
      "description": "Pause, take over and release end in a state no single row describes. Why the live call's control state is folded from its guidance log instead of stored.",
      "summary": "A colleague steering a live call can pause Connect, take the conversation over, and hand it back. Stored as flags, that sequence produces combinations nothing can interpret and a release that does not know what it is releasing to. `supervisor.py` stores none of it: the control state is derived from the guidance log, which is ordered, append-only and already the thing being written for other reasons.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
        "https://connectbyjbrh.com/research/authority-separation/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "R0047",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/documentation-as-a-build/",
      "markdown": "https://connectbyjbrh.com/research/documentation-as-a-build/index.md",
      "title": "Treating documentation as a build artefact",
      "description": "Documentation compiled from one capability registry into HTML, manifests and machine descriptions, with a gate that fails closed on everything it can measure.",
      "summary": "This manual is compiled, not written into a CMS. One registry holds what may be claimed and with what status; the plan owns every canonical URL; the prose is data rather than code; and a gate refuses the build on a broken link, a thin page, a duplicate search intent or a capability described as working when the registry says it is not.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/machine-manifests/",
        "https://connectbyjbrh.com/research/writing-for-people-and-machines/",
        "https://connectbyjbrh.com/research/status-vocabulary/",
        "https://connectbyjbrh.com/docs/workflows/",
        "https://connectbyjbrh.com/research/false-passing-tests/"
      ]
    },
    {
      "id": "R0009",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/evidence-first-prospecting/",
      "markdown": "https://connectbyjbrh.com/research/evidence-first-prospecting/index.md",
      "title": "Evidence-first prospecting without guessed emails",
      "description": "Attaching a source to every claim and never generating an address: what the method costs in volume, what it buys, and where the honest gaps are.",
      "summary": "Two rules do most of the work. A claim with nothing behind it never reaches the prospect record, and Connect never guesses an email address — a prospect with no discoverable one is kept as researched with a different next action instead. The cost is volume, paid deliberately. What it buys is a list that is still defensible when somebody reads it six months later.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [
        "email"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/",
        "https://connectbyjbrh.com/research/research-cost-routing/",
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/research/evidence-for-next-action/"
      ]
    },
    {
      "id": "R0015",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/evidence-for-next-action/",
      "markdown": "https://connectbyjbrh.com/research/evidence-for-next-action/index.md",
      "title": "Making a next-best-action defensible",
      "description": "What a recommended next action has to carry before it is worth following: the record, the evidence, the rule behind it, and the act it enables.",
      "summary": "A recommendation with nothing behind it is a guess wearing a confident interface. What makes `next_best_action` usable is not ranking quality but attribution: which record it concerns, what evidence supports it, which rule produced it, and what a person can do about it in one move. A suggestion missing any of the four is noise on a screen somebody has to clear.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/assistant/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/agent-tools-call-services/"
      ]
    },
    {
      "id": "R0037",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/false-passing-tests/",
      "markdown": "https://connectbyjbrh.com/research/false-passing-tests/index.md",
      "title": "Five ways a test suite has passed while proving nothing",
      "description": "Five suites that ran green while proving nothing: a rule asserted in prose, a policy never exercised, a clock on the wrong source, and a field that did not exist.",
      "summary": "Each of these ran green for months. The common shape is that the assertion and the risk were about different things — a rule restated instead of enumerated, a database policy the ORM path never touched, latency read from the wrong timestamps, a metric taken from a field the SDK does not report, and a fixture smaller than the limit the code was capping at.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/probes-that-cry-wolf/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/research/n-plus-one-that-grows/"
      ]
    },
    {
      "id": "R0026",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/files-through-one-service/",
      "markdown": "https://connectbyjbrh.com/research/files-through-one-service/index.md",
      "title": "One file service for two audiences",
      "description": "A second file implementation for the second audience drifts within a release. The single-service shape used here, what it refuses at the door, and its limits.",
      "summary": "Files attach by button, drop or paste and go through one service both audiences share — `file_workspace` over `media_assets`, a table that was already workspace-scoped and under row-level security, so nothing new had to be governed. Both routers call the same body; each adds only its route. Reading and writing are separate, and a change is a new version with provenance and an audit entry.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/research/grid-over-services/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/",
        "https://connectbyjbrh.com/docs/assistant/"
      ]
    },
    {
      "id": "R0041",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/focus-rings-that-computed-to-none/",
      "markdown": "https://connectbyjbrh.com/research/focus-rings-that-computed-to-none/index.md",
      "title": "A focus ring that was defined, valid-looking and computed to nothing",
      "description": "A keyboard focus ring can be present in the source, valid to a linter, and still compute to nothing in the browser. What to measure instead of reading.",
      "summary": "A focus ring is only real if it computes. Connect's styling is 56 ordered layers behind one `@import` index, so a rule that reads correctly in the file it lives in can be beaten by a same-named custom property defined in a layer loaded later, or by a theme block whose selector outranks `:root`. The check that settles it is `getComputedStyle` on the real element while it really holds focus.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/invisible-ui-defects/",
        "https://connectbyjbrh.com/research/false-passing-tests/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/docs/technology/",
        "https://connectbyjbrh.com/research/writing-for-people-and-machines/"
      ]
    },
    {
      "id": "R0027",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/grid-over-services/",
      "markdown": "https://connectbyjbrh.com/research/grid-over-services/index.md",
      "title": "A spreadsheet view that is not a second database",
      "description": "A spreadsheet over 13 record sheets where every edit still goes through the service that owns the record. What the constraint costs, and what it prevents.",
      "summary": "`#/data` is an Excel-like grid over 13 sheets — companies, people, leads, prospects, follow-ups, deals, conversations, calls, cases, onboarding, knowledge, files and memory. It looks like direct table access and is not: every change goes through the service that owns the record, so business rules, scoping and the audit trail apply to a bulk edit exactly as they do to a screen.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/research/files-through-one-service/",
        "https://connectbyjbrh.com/research/agent-tools-call-services/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/authority-separation/",
        "https://connectbyjbrh.com/docs/follow-ups/"
      ]
    },
    {
      "id": "R0021",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/grounding-without-a-vector-database/",
      "markdown": "https://connectbyjbrh.com/research/grounding-without-a-vector-database/index.md",
      "title": "Grounding an answer without pretending to have a vector database",
      "description": "How an answer is grounded in a workspace's own Knowledge and Facts without an embedding index, why selection by relation holds at this size, and where it stops.",
      "summary": "Connect grounds an answer in the Knowledge a workspace supplied and the Facts extracted from it, selected by relation — this workspace, this channel, this endpoint, this contact — rather than by embedding similarity. No vector store is deployed. What reaches the model is a budgeted block: four facts and 2,000 characters of knowledge, 700 of memory, 600 for the contact. The budget is the design, and the limit is paraphrase.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/research/structured-business-memory/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/"
      ]
    },
    {
      "id": "R0004",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
      "markdown": "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/index.md",
      "title": "Idempotency for retried telephony webhooks",
      "description": "Why a carrier retries a webhook, what a duplicate delivery does to a live call, and the partial unique index that makes a replay harmless.",
      "summary": "A carrier cannot tell a lost response from a slow one, so it retries, and every telephony webhook is delivered at least once and sometimes more. Connect stores each normalised provider event exactly once in `call_events`, with the signature nonce under a partial unique index; the second delivery collides and is discarded. What is retried outbound is then decided by what a request means, not by whether it failed.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/api-idempotency/",
        "https://connectbyjbrh.com/research/provider-independent-telephony/",
        "https://connectbyjbrh.com/research/silent-failure/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/developers/webhook-signatures/"
      ]
    },
    {
      "id": "R0029",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/invisible-not-missing/",
      "markdown": "https://connectbyjbrh.com/research/invisible-not-missing/index.md",
      "title": "A row with no workspace stamp is invisible, not missing",
      "description": "Missing, deleted and invisible are three different incidents with three different repairs. The one-minute triage that tells them apart before anyone reaches for a backup.",
      "summary": "A record that is not on the screen has not necessarily gone anywhere. In a workspace-scoped system the commonest cause is a predicate that excludes it — most often a stamp of `''`, which matches no scope and no row-level security policy. The signature is an asymmetry: every list omits the row, and every action by id on it still works. That distinction decides the repair.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/workspace-stamp/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/research/counting-past-the-limit/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/docs/security/"
      ]
    },
    {
      "id": "R0040",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/invisible-ui-defects/",
      "markdown": "https://connectbyjbrh.com/research/invisible-ui-defects/index.md",
      "title": "Defects that are invisible in the source and obvious in a browser",
      "description": "Three defects a source review could not have seen: an overlay covering a control, a remembered size hiding one, and a capability nothing on screen called.",
      "summary": "Some interface defects are not in the code. They are in what two correct components do when composed, in state a browser remembered from an earlier visit, or in the absence of anything calling a function that works perfectly. Three of those are recorded here, each with a check that takes about thirty seconds and finds it every time.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/focus-rings-that-computed-to-none/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/research/closed-by-default-facade/",
        "https://connectbyjbrh.com/research/false-passing-tests/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "R0033",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
      "markdown": "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/index.md",
      "title": "Why 'connected' is not enough to prove mailbox health",
      "description": "Authentication proves a credential, not a working mailbox. The signals that matter, the quiet mailbox that looks fine, and the setter that keeps a token alive.",
      "summary": "\"Connected\" means a credential worked. It does not mean mail is arriving, the read position is moving, sends are being accepted, or the row is even visible on the screen that lists it. A mailbox that authenticates and returns nothing is a **quiet mailbox** — reported as a health verdict rather than an error, because most quiet mailboxes are correct and a few are not.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/research/cursor-loss/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/",
        "https://connectbyjbrh.com/research/invisible-not-missing/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "R0050",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/measuring-ai-visibility/",
      "markdown": "https://connectbyjbrh.com/research/measuring-ai-visibility/index.md",
      "title": "Measuring whether AI systems can actually read your site",
      "description": "Crawl, citation and referral are three different measurements with three different kinds of evidence. Only the first is visible in a server log.",
      "summary": "\"Are AI systems reading the site\" is three questions wearing one coat. Was the page fetched by a named agent, was it used in an answer, and did a person arrive here because of that answer — crawl, citation and referral. Only crawl is observable from your own server, and reporting the three as one number is how a site talks itself into believing the other two.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/developers/crawler-policy/",
        "https://connectbyjbrh.com/developers/bot-verification/",
        "https://connectbyjbrh.com/developers/llms-txt-here/",
        "https://connectbyjbrh.com/research/writing-for-people-and-machines/",
        "https://connectbyjbrh.com/docs/workflows/"
      ]
    },
    {
      "id": "R0001",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/measuring-voice-latency/",
      "markdown": "https://connectbyjbrh.com/research/measuring-voice-latency/index.md",
      "title": "Measuring conversational latency correctly",
      "description": "Why a transcript row is the wrong clock for a voice agent, what to time instead, and what moving the measurement did to the numbers.",
      "summary": "A voice agent's response time has to be timed on the audio wire: from the moment the caller's speech state ends to the moment the agent's speech state begins. Timing transcript rows instead reports milliseconds for replies the caller waited seconds for, because a transcript row is written when a sentence is complete rather than when it started. Moving the clock changed the reported figures by whole seconds.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/research/barge-in-without-cutting-the-greeting/",
        "https://connectbyjbrh.com/research/model-limited-findings/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/"
      ]
    },
    {
      "id": "R0020",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/memory-correction-that-sticks/",
      "markdown": "https://connectbyjbrh.com/research/memory-correction-that-sticks/index.md",
      "title": "Making a correction actually change behaviour",
      "description": "A correction that is stored and never read looks exactly like one that worked. Where that happens, why, and what makes a correction change behaviour.",
      "summary": "A correction changes behaviour only if it lands on the field the decision actually reads. The clearest case: a block written into the body of a memory row is stored, displayed and ignored, because `directives()` reads only the tag list. The row exists, the screen shows it, somebody believes the problem is handled — and the next message goes out anyway.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/research/relationship-memory/",
        "https://connectbyjbrh.com/research/structured-business-memory/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/evidence-for-next-action/"
      ]
    },
    {
      "id": "R0007",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/model-limited-findings/",
      "markdown": "https://connectbyjbrh.com/research/model-limited-findings/index.md",
      "title": "Findings a setting cannot fix",
      "description": "Three voice behaviours prompting could not reach, the measurement that settled each one, and how a quality score should count a fault no control can fix.",
      "summary": "Some faults in a spoken conversation cannot be reached by any control an operator holds. Three were measured here and rolled back rather than left in: a respect-word cadence rule, murmur handling, and a host-spoken acknowledgement that cut the caller off and stalled the model for 22 seconds. Each is still counted and marked model-limited, so the same prompt characters are not spent twice.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/barge-in-without-cutting-the-greeting/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/"
      ]
    },
    {
      "id": "R0035",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/n-plus-one-that-grows/",
      "markdown": "https://connectbyjbrh.com/research/n-plus-one-that-grows/index.md",
      "title": "The query cost that grows with the business",
      "description": "Query cost measured in statements rather than seconds, with four before-and-after figures: 5,574 to 3, 83 to 11, 89 to 17 and 133 to 15.",
      "summary": "A threshold in seconds measures the machine that ran the test. Counting statements measures the code, and the finding is the growth curve rather than the absolute number. Four surfaces were measured that way: a customer list at 5,574 statements became 3; two thread lists at 83 and 89 became 11 and 17; a home screen at 133 became 15, and all three are now flat with page size.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/counting-past-the-limit/",
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/false-passing-tests/",
        "https://connectbyjbrh.com/docs/product/",
        "https://connectbyjbrh.com/research/grid-over-services/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "R0012",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/one-person-many-channels/",
      "markdown": "https://connectbyjbrh.com/research/one-person-many-channels/index.md",
      "title": "Why the machine proposes a merge and a person disposes",
      "description": "One human reachable by phone, email and WhatsApp: the identity model, what a merge preserves, and why a machine proposes while a person disposes.",
      "summary": "A **Person** is the canonical human, an **Identity** is one address on one channel, and a Person may hold many. That split is what lets a WhatsApp message, an email thread and an inbound call land on the same record without any of them being the record. Merging two Persons stays a human decision, because it is the least reversible operation a relationship store has.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/relationship-memory/",
        "https://connectbyjbrh.com/research/prospect-identity-resolution/",
        "https://connectbyjbrh.com/docs/whatsapp/",
        "https://connectbyjbrh.com/docs/memory/"
      ]
    },
    {
      "id": "R0038",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/probes-that-cry-wolf/",
      "markdown": "https://connectbyjbrh.com/research/probes-that-cry-wolf/index.md",
      "title": "A probe that fires on a correct release is worse than no probe",
      "description": "A release probe reported 235 backend files changed for a release that changed no code. Why the comparison was wrong, and what a release check should compare.",
      "summary": "On 8 September 2026 a release script asserted that a whole subtree was byte-for-byte what it replaced, and reported 235 backend files different for a release that changed no Python at all. The comparison had walked `__pycache__`: the build that had been serving for two hours had written bytecode the freshly unpacked one had not. The assertion was sound; the set of files was not.",
      "status": "available",
      "audiences": [
        "developer",
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/false-passing-tests/",
        "https://connectbyjbrh.com/research/stale-credentials/",
        "https://connectbyjbrh.com/research/boot-time-migrations/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/documentation-as-a-build/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "R0022",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/",
      "markdown": "https://connectbyjbrh.com/research/prompt-injection-in-business-mail/index.md",
      "title": "Prompt injection arrives as ordinary business mail",
      "description": "Received text is data, never instruction. The realistic attack on a mail-reading agent, the boundary that contains it, and the part that stays unproven.",
      "summary": "Everything Connect reads — an enquiry, a WhatsApp message, a transcribed sentence, an uploaded file — is data. Containment is not a filter that recognises attacks; it is that every action worth attacking is gated where the text cannot reach it: autonomy modes, one send boundary that reports nothing as sent without provider evidence, an assistant whose rights are narrower than its user's, and a compliance check no model output clears.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/authority-separation/",
        "https://connectbyjbrh.com/research/approval-without-blocking/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/",
        "https://connectbyjbrh.com/docs/files-data/"
      ]
    },
    {
      "id": "R0006",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
      "markdown": "https://connectbyjbrh.com/research/prompt-size-and-first-token/index.md",
      "title": "What every character of a prompt costs on a live call",
      "description": "The measured relationship between instruction size and time to first token on a live call, and the character budgets that came out of it.",
      "summary": "Instruction size is recorded on every realtime session, and the two measured points are far apart: **7,500 characters** of instructions gave a **1.2–1.8 s** first token, **9,600** gave **2.3–3.4 s**. On a call, a second of prompt is a second of silence in front of every reply. The budgets that followed cap knowledge, memory and the contact block by characters rather than by how useful each addition feels.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/research/structured-business-memory/",
        "https://connectbyjbrh.com/research/model-limited-findings/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "R0010",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/prospect-identity-resolution/",
      "markdown": "https://connectbyjbrh.com/research/prospect-identity-resolution/index.md",
      "title": "Telling a new prospect from an existing customer",
      "description": "Deciding whether a discovered organisation or person is already somebody you know, and the two opposite ways that decision goes wrong.",
      "summary": "Before anything is written to a prospect, `prospect_identity_resolution` asks whether it is already a relationship. Getting it wrong in one direction sends a cold opening to an existing customer; getting it wrong in the other suppresses a genuine prospect that happens to share an address. Identity is one address on one channel, a person may hold several, and a proposed duplicate is never merged without a person.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/relationships/",
        "https://connectbyjbrh.com/research/one-person-many-channels/",
        "https://connectbyjbrh.com/research/evidence-first-prospecting/",
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/research/research-cost-routing/"
      ]
    },
    {
      "id": "R0032",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/provider-evidence-for-sent/",
      "markdown": "https://connectbyjbrh.com/research/provider-evidence-for-sent/index.md",
      "title": "Why 'sent' must require provider evidence",
      "description": "A message is sent when the provider says so and not before. The three states, why the uncertain one must stay uncertain, and how it is resolved.",
      "summary": "`outbound.py` is the single send boundary, shared by the engine and by a person, and it reports a message as **sent** only once the provider has acknowledged it. Everything else is **failed** or **uncertain** — a real third state, displayed as itself rather than resolved by optimism, because re-sending on a maybe is how a customer receives the same reply twice.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/research/cursor-loss/",
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "R0008",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/provider-independent-telephony/",
      "markdown": "https://connectbyjbrh.com/research/provider-independent-telephony/index.md",
      "title": "Designing telephony that does not name its provider",
      "description": "Three layers, one capability table, and the six production defects that came from putting code on the wrong side of the boundary.",
      "summary": "Telephony code that names its provider cannot later remove that provider. Connect keeps one carrier's own words in a single adapter, keeps the meaning of a call in a core that differs between providers only through a capability table, and lets nothing above either name a provider at all — a rule asserted by test rather than trusted. Six production defects came from crossings of that boundary, and every one was silent.",
      "status": "available",
      "audiences": [
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/idempotent-telephony-webhooks/",
        "https://connectbyjbrh.com/research/silent-failure/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/technology/"
      ]
    },
    {
      "id": "R0013",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/relationship-memory/",
      "markdown": "https://connectbyjbrh.com/research/relationship-memory/index.md",
      "title": "Relationship memory versus chat history",
      "description": "What a transcript cannot answer about a customer, what a tiered memory store answers instead, and what each of the two costs to keep and to read.",
      "summary": "A conversation history records what was said. A relationship memory records what is true. The difference appears the first time somebody needs an answer the conversation never phrased — who signs off, which site deliveries go to, why this account is handled carefully. A history can only be re-read at length, every time; a memory row is resolved to the work in hand, budgeted, and can be corrected or forgotten.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/research/structured-business-memory/",
        "https://connectbyjbrh.com/research/one-person-many-channels/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "R0011",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/research-cost-routing/",
      "markdown": "https://connectbyjbrh.com/research/research-cost-routing/index.md",
      "title": "Spending research budget where it changes a decision",
      "description": "Running a deeper research pass only where it could change a decision, the same rule applied to model spend on live calls, and what is actually measured.",
      "summary": "A deeper pass is worth running only where its result could change what happens next. `prospect_cost_router` applies that test before spending, so a candidate already ruled out on cheap evidence is not researched further, while one whose fate turns on a single unknown is. The same principle governs model spend on calls: a budget check before dialling, and a breaker that skips scheduled work while still answering a live caller.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/evidence-first-prospecting/",
        "https://connectbyjbrh.com/docs/prospects/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/"
      ]
    },
    {
      "id": "R0014",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/safe-refusals-in-sales/",
      "markdown": "https://connectbyjbrh.com/research/safe-refusals-in-sales/index.md",
      "title": "Why a sales agent should refuse to answer",
      "description": "The commercial questions no agent should answer alone, why refusing is the correct outcome, and the escalation that keeps a deal moving anyway.",
      "summary": "A price, a delivery commitment or a warranty that Knowledge does not support is refused and passed to a person rather than improvised. `safe_sales` treats that refusal as the correct outcome rather than a gap to close, because an invented commercial term binds a business to something nobody agreed. On the realtime voice path the rule can only live in the instructions, so a breach is detected rather than prevented.",
      "status": "available",
      "audiences": [
        "both"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/sales/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/research/authority-separation/",
        "https://connectbyjbrh.com/docs/knowledge/",
        "https://connectbyjbrh.com/research/evidence-for-next-action/"
      ]
    },
    {
      "id": "R0005",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/silent-failure/",
      "markdown": "https://connectbyjbrh.com/research/silent-failure/index.md",
      "title": "When a call is answered in silence",
      "description": "Five inbound calls were answered in silence and filed as callers hanging up before speaking. The cause, and the event that now tells the two apart.",
      "summary": "A call that connects and then plays nothing leaves the same trace as a caller who hung up immediately. On 2026-09-07 five inbound calls sat silent and were recorded as abandonment. The cause was a greeting the process could not synthesise. The call now ends deliberately, posts `engine_error {at: greeting}`, and is written down as something that was never a conversation.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [
        "phone"
      ],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/barge-in-without-cutting-the-greeting/",
        "https://connectbyjbrh.com/research/measuring-voice-latency/",
        "https://connectbyjbrh.com/docs/phone/",
        "https://connectbyjbrh.com/docs/troubleshooting/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/"
      ]
    },
    {
      "id": "R0044",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/single-thinker/",
      "markdown": "https://connectbyjbrh.com/research/single-thinker/index.md",
      "title": "Why only one loop may think",
      "description": "One function turns an inbound message into a decision, and one caller reaches it. Why that boundary exists, what a second loop costs, and where it is enforced.",
      "summary": "Exactly one function decides what to do about an inbound message — `runner.process_message` — and exactly one caller reaches it, `runner.think_pending`. Every other loop in the application fetches, bridges or drains, then stops. That boundary is what makes a per-workspace lock and a plan allowance mean anything: both are applied once, in one place, and no second loop can route around them.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/background-threads/",
        "https://connectbyjbrh.com/research/agent-tools-call-services/",
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "R0042",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/stale-credentials/",
      "markdown": "https://connectbyjbrh.com/research/stale-credentials/index.md",
      "title": "A copy of a password somebody else rotates",
      "description": "A database password copied into an environment file kept working until somebody else rotated it, then failed at the next restart and read as a bad deploy.",
      "summary": "A credential you copy is a credential you have to keep. Connect's database password is not in `.env` at all: RDS owns the master credential and rotates it into Secrets Manager, `MAYA_MAIL_DB_SECRET_ARN` names the secret, and boot reads the value from there. Before that change, a stale copy made the *next* restart authenticate as nobody — long after the rotation, with a deploy in between to take the blame.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/research/probes-that-cry-wolf/",
        "https://connectbyjbrh.com/research/boot-time-migrations/",
        "https://connectbyjbrh.com/docs/account/"
      ]
    },
    {
      "id": "R0049",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/status-vocabulary/",
      "markdown": "https://connectbyjbrh.com/research/status-vocabulary/index.md",
      "title": "A four-word vocabulary for capability status",
      "description": "Four words describe every capability in this manual, one of them takes a qualifier, and nothing else is permitted. What each forbids, and what the discipline costs.",
      "summary": "Every capability in this corpus is described by one of four words — available, foundation, not yet, reference — with a single qualifier on the first for things that are deliberately the operator's rather than a customer's. The distinction the vocabulary exists to protect is the one a manual is most tempted to blur: code existing is not a capability you can use.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/documentation-as-a-build/",
        "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
        "https://connectbyjbrh.com/docs/technology/",
        "https://connectbyjbrh.com/docs/sms/",
        "https://connectbyjbrh.com/docs/phone/"
      ]
    },
    {
      "id": "R0019",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/structured-business-memory/",
      "markdown": "https://connectbyjbrh.com/research/structured-business-memory/index.md",
      "title": "Structured business memory instead of a longer prompt",
      "description": "Why a bigger context window is not a memory, what a four-tier store gives that a longer prompt cannot, and the measured cost of choosing the prompt.",
      "summary": "A longer prompt is not a memory. It is the same information re-sent on every turn, paid for in seconds before each reply and in a context re-billed each time, and it ends when the session does. A tiered store keeps what is true at the level it applies to, resolves only what the work in hand needs, and can be corrected by the person who noticed it was wrong.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/memory/",
        "https://connectbyjbrh.com/research/relationship-memory/",
        "https://connectbyjbrh.com/research/prompt-size-and-first-token/",
        "https://connectbyjbrh.com/research/memory-correction-that-sticks/",
        "https://connectbyjbrh.com/docs/knowledge/"
      ]
    },
    {
      "id": "R0028",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/three-layers-of-isolation/",
      "markdown": "https://connectbyjbrh.com/research/three-layers-of-isolation/index.md",
      "title": "Three independent layers of tenant isolation",
      "description": "An allowlist, an ORM kernel and PostgreSQL row-level security. What each catches that the other two miss, the gaps all three share, and the cost.",
      "summary": "Workspace isolation is enforced three times on the way to the data: the `customer_safe` allowlist in the middleware, the SQLAlchemy workspace kernel, and row-level security forced in PostgreSQL. They are not redundancy for its own sake — each catches a class of mistake the others structurally cannot see, and one real defect was caught only by the third.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/research/invisible-not-missing/",
        "https://connectbyjbrh.com/research/closed-by-default-facade/",
        "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
        "https://connectbyjbrh.com/research/false-passing-tests/",
        "https://connectbyjbrh.com/docs/account/"
      ]
    },
    {
      "id": "R0039",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/two-audiences-one-implementation/",
      "markdown": "https://connectbyjbrh.com/research/two-audiences-one-implementation/index.md",
      "title": "One implementation, two audiences",
      "description": "One feature set over one body of code, the seam that keeps it that way, and what a reduced copy for the second audience costs before anybody notices.",
      "summary": "Connect serves an operator's own workspace and its customers' workspaces from one implementation. Every capability is available to both, over the same code; the difference is commercial, not functional — a customer's use is bounded by their plan's allowances. Behaviour lives in a module both routers call, and each router adds only its route. Parity is then enumerated from the running application rather than asserted.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/closed-by-default-facade/",
        "https://connectbyjbrh.com/research/invisible-ui-defects/",
        "https://connectbyjbrh.com/research/files-through-one-service/",
        "https://connectbyjbrh.com/research/mailbox-health-beyond-connected/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/docs/product/"
      ]
    },
    {
      "id": "R0017",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/uncertainty-is-an-answer/",
      "markdown": "https://connectbyjbrh.com/research/uncertainty-is-an-answer/index.md",
      "title": "Why uncertainty is a valid answer from a business agent",
      "description": "The cost of a confident wrong answer, the places Connect reports not-knowing instead, and what turns uncertainty from an evasion into something actionable.",
      "summary": "**Uncertain** is a real state rather than a polite failure. A message is reported as sent only once the provider has acknowledged it; between the attempt and that acknowledgement it is uncertain, and it is shown as uncertain rather than guessed either way — because re-sending on a maybe is how a customer receives the same reply twice.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/safe-refusals-in-sales/",
        "https://connectbyjbrh.com/research/provider-evidence-for-sent/",
        "https://connectbyjbrh.com/docs/email/",
        "https://connectbyjbrh.com/research/evidence-for-next-action/",
        "https://connectbyjbrh.com/docs/troubleshooting/"
      ]
    },
    {
      "id": "R0018",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/undo-for-agents/",
      "markdown": "https://connectbyjbrh.com/research/undo-for-agents/index.md",
      "title": "Designing undo for agent actions",
      "description": "Reversible, compensable and irreversible: why an agent needs that taxonomy before it needs an undo button, and what Connect offers at each level.",
      "summary": "There is no single undo control in Connect, and the reason is structural: agent actions do not share one reversal. Some can be withdrawn with nothing left behind, some can only be answered by a second action, and some cannot be taken back at all. Sorting an action into those three before designing the interface is what stops a button promising more than it can do.",
      "status": "foundation",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/docs/autonomy/",
        "https://connectbyjbrh.com/research/derived-control-state/",
        "https://connectbyjbrh.com/research/authority-separation/",
        "https://connectbyjbrh.com/docs/files-data/",
        "https://connectbyjbrh.com/research/approval-without-blocking/"
      ]
    },
    {
      "id": "R0043",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/workspace-stamp/",
      "markdown": "https://connectbyjbrh.com/research/workspace-stamp/index.md",
      "title": "Data that is invisible rather than missing",
      "description": "A row stamped with an empty workspace id is invisible to every list and openable by id. The asymmetry is the diagnosis, and the repair belongs at boot.",
      "summary": "An empty workspace stamp does not delete a row; it hides it. `''` matches no scope and no row-level security policy, so every *list* omits the row in silence while every *by-id* action on it still works. That asymmetry is the diagnosis — a record you can open from a link and cannot find in the list it belongs to — and it is also why the repair cannot be a write from a request.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/invisible-not-missing/",
        "https://connectbyjbrh.com/research/three-layers-of-isolation/",
        "https://connectbyjbrh.com/research/boot-time-migrations/",
        "https://connectbyjbrh.com/docs/security/",
        "https://connectbyjbrh.com/docs/email/"
      ]
    },
    {
      "id": "R0048",
      "kind": "research",
      "url": "https://connectbyjbrh.com/research/writing-for-people-and-machines/",
      "markdown": "https://connectbyjbrh.com/research/writing-for-people-and-machines/index.md",
      "title": "Writing documentation that both a person and a retrieval system can use",
      "description": "One text has to serve a person reading and a retrieval system quoting. Answer-first structure, naming entities every time, and keeping facts out of pictures.",
      "summary": "There is no second, machine-only copy of a page here — a retrieval system reads the words a person reads. Three habits serve both: put the answer in the first paragraph and let it stand alone, name each thing by its one canonical name rather than by a pronoun, and keep every fact in text where a picture cannot hide it.",
      "status": "available",
      "audiences": [
        "both",
        "developer"
      ],
      "channels": [],
      "updated": "2026-09-10",
      "related": [
        "https://connectbyjbrh.com/research/measuring-ai-visibility/",
        "https://connectbyjbrh.com/research/documentation-as-a-build/",
        "https://connectbyjbrh.com/developers/markdown-mirrors/",
        "https://connectbyjbrh.com/docs/glossary/",
        "https://connectbyjbrh.com/research/status-vocabulary/"
      ]
    }
  ]
}
