Not "what the Home payload returns" — what the system actually knows. Every line below is read out of channel-gates.ts, silence.ts, home.service.ts and Home.tsx. Where I previously told you something different, it is marked and corrected.
channel-gates.ts on instagram:dms: "off = the agent does not even decide (inbound DMs are still stored — receive is ungated)". So a Messages tile showing 0 because DMs are off — which is what I drew — is false. Messages arrive and are stored whatever the gate says. The gate decides whether the bot answers, not whether the count exists.whatsapp.agent, instagram.comments and instagram.moderation. The registry defines nine surfaces across three channels, each independently flippable.evaluateSilence counts hours in one of two modes — always (24/7) or business-hours (configurable days and window) — and sets silent = countedHours >= thresholdHours. In business-hours mode a channel quiet all weekend has hoursSince: 0 and is not silent, by design. A status that says "gone quiet" is making a claim about the operator's own configured working week.facebook:dms: "no webhook ingestion, no normalized inbound adapter, no sender. The gate + the channel profile exist so the PLAYGROUND can simulate a FB DM turn." A Facebook Messages tile can only ever read zero, and the reason is structural, not a setting.Nine independent inputs. A status line is a function of some subset; nothing else exists to read.
| Dimension | Values | Source of truth | What it actually means |
|---|---|---|---|
| Configured | true / false | connections row exists | A connection record for this provider exists at all. False = never set up. |
| Active | true / false | connections.isActive | The operator switched this connection off here. Nothing to do with Meta. |
| Last webhook event | date / null | webhook event log | The last time Meta delivered anything on this channel. Null = never, in the whole history. |
| Silence | silent: true / false / null hoursSince: number / null | silence.ts evaluateSilence | null means never heard from — unknowable, not healthy. Otherwise counted hours ≥ threshold, counted 24/7 or business-hours-only per config. |
| Muted | string / null | alerts.config | The operator declared this channel knowingly dead, in their own words. Defaults to the bare word "Muted" when no text was given. Independent of the live silence reading, on purpose. |
| Gates | off / shadow / live (WhatsApp: off / canary / live) | channelGates setting | Whether the agent acts on this surface. Never whether messages arrive. |
| Errors 24h | webhookErrors + failsafes | home.service errors() | Delivery failures and times the agent stood down. Two different things, currently summed. |
| Last inbound / outbound | date / null | message tables | Real traffic, as distinct from webhook chatter. A channel can get webhooks and no messages. |
| Quality & quota | rating · tier · used/limit | Meta, WhatsApp only | Exists for WhatsApp alone. No equivalent on Instagram or Facebook. |
The gate registry is not symmetrical. A status that offers the same four facts per channel is inventing three of them.
| Surface | Web chat | |||
|---|---|---|---|---|
| Reply to messages | off · canary · live canary = an allowlist of numbers | off · shadow · live send arm built dark | no pipeline at all playground simulation only | does not exist |
| Reply to comments | no comments | off · shadow · live | off · shadow · live | does not exist |
| Moderate comments | no comments | off · shadow · live defaults to shadow | off · shadow · live defaults to shadow | does not exist |
| Comment → open a DM | no comments | off · shadow · live | off, built dark token has no messaging scope | does not exist |
| Quality & sending limit | rating + daily quota | none | none | none |
| Receiving | always on, on every connected channel — no gate governs it | not connected | ||
Ordered by precedence. Every row states the condition, what may be claimed, and what it must not claim — the second column is the one that keeps a status honest.
| Condition | Can honestly say | Must NOT say | Why |
|---|---|---|---|
| Not configured | Not set up · Not connected | anything about traffic or gates | There is no connection to describe. Gate values may still be stored and are meaningless. |
| Muted | The operator's own words · and the real traffic figures | "silent" as a diagnosis | The ruling is that Home says WHY, not just silent. Muted survives a healthy blip on purpose. |
| Not active | Switched off by you | "Meta disabled this" | This flag is local. Conflating it with a Meta action misdirects the fix. |
silent === null | Nothing has ever arrived | healthy, or "gone quiet" | Unknowable, not OK. Never-heard-from is a different fact from stopped-hearing. |
silent === true | Nothing for N counted hours | "broken", or a bare hour count | N is counted under the operator's own business-hours config. The number is meaningless without the window. |
| All gates off | Receiving, answering nothing | "not working" or "off" | Receiving is ungated. Messages are still arriving and being stored. |
| Any gate shadow | Writing, holding it for you | "answering" | Shadow means propose-and-approve. Nothing reaches a customer. |
| WhatsApp canary | Answering a named few | "live" or "answering" | Canary is an allowlist. Everyone not on it gets nothing. |
| Any gate live | Answering, and on which surface | a blanket "answering" | Comments live with DMs off is not the same product as both live. One word cannot hold it. |
| Fact | On the Home payload | To get it |
|---|---|---|
| Connection, silence, mute, errors, last in/out | yes | nothing |
whatsapp, instagram:comments, :moderation | yes | nothing |
instagram:dms, instagram:comment_to_dm | no | read from the same resolved gates object already in scope |
| Facebook, entirely | no | a third member on the channel union + its four gates |
| Per-channel message counts today | only WhatsApp + Instagram | HomeToday.messages needs a Facebook key |
| Comments vs messages, counted apart | no | the tiles you picked need this split; today it is one number |
| A 14-point daily series per channel | no | new aggregation — this is what treatment C's sparkline needs |
| Quality & quota | separate endpoints | already fetched by the old Home, WhatsApp only |