Components

The messaging client

Talks to a chat platform: delegated auth, read and send, Markdown into the platform's markup. Knows nothing about vaults.

Talks to a chat platform: delegated auth, read and send, Markdown into the platform's markup. Knows nothing about vaults.

This component is on this page for a reason that is easy to miss: it knows nothing about any of the rest of it.

It does not know what a vault is. It has never heard of a manifest, a task ledger or a folder configuration. It signs in on the user’s behalf, reads the conversations that user already belongs to, sends a message, and converts Markdown into whatever markup the platform speaks.

Why that makes it its own component rather than part of the dashboard

Because the alternative was worse. Folding a chat client into the surface that uses it means every future caller either duplicates the integration or imports the dashboard to get at it. Keeping it ignorant keeps it reusable: it is a dependency of vault-aware code, not an instance of it.

It is also the boundary where the credential lives. Authentication is delegated — the user signs in themselves, and the token is held by the platform’s own mechanism rather than copied into a configuration file. A component that borrows an existing sign-in is a component that does not add a second thing to rotate.

This part is not published

It is a library and a command-line tool in a private repository. What transfers is the shape: keep the integration ignorant of your domain, delegate the sign-in, and let the translation between your format and theirs live in exactly one place.

Declared in the contract Not published

Kind
library plus CLI
Role
Talks to a chat platform: delegated auth, read and send messages, Markdown to the platform's markup
Reads
  • chats the signed-in user belongs to
Writes
  • <venture>/.teamschats/ — the archive, the one implementation today
  • <venture>/.teamschats/_fetch.json — the fetch record (CR-088)
  • chat messages
Depends on
  • an auth library
  • an HTTP library
Documentation belongs to
the component's own repo

Worth knowing. Knows nothing about vaults or manifests. A dependency of vault-aware code, not an instance of it — which is why it is its own component rather than part of the dashboard. ONE ROLE, SEVERAL IMPLEMENTATIONS (CR-081): the archive is a pattern, <venture>/.<provider>chats/, and .teamschats/ is one instance of it that does not move. A new channel names its provider in its folder (CR-068's rule, applied forward) instead of inventing a generic name. external_systems.chats stays generic: the config key names a class of system, the path names a writer. OPEN, deliberately: whether a personal channel (SMS, iMessage) sits per venture or per person — to be settled by a real case, not in advance

From ecosystem.yaml, contract 41 · core-skills 1.89.4 · read at build 2026-10-08