CLI command
accounts
The social accounts Echo acts through: one account's health over the last days — the newest snapshot and ban signal per signal, each health check's outcome or the error that kept it from running, and, with a reach factor, whether its views per post dropped — and the brand each account speaks for.
Invocation#
echo-cli accounts health --account <account-id> --days <n> [--reach-factor <share>]
echo-cli accounts brands list [--brand <product-id>]
echo-cli accounts brands set --account <account-id> --brand <product-id> --by <who>
echo-cli accounts brands remove --account <account-id>Inputs and output#
health writes account_id, since, snapshots (the newest account_health_snapshots row per signal: account_id, signal, shadowbanned, is_suspended, karma, checked_at), ban_signals (the newest unhealthy ban signal per signal an action's trajectory reported: signal, action, seen_at, evidence), checks (the newest run of each action named *_health or *_check: action, status, started_at, completed_at, error — set when the check could not run — and ban_signal) and reach (null without --reach-factor; otherwise factor, recent and earlier — each from, to, posts, measured and views_per_post — dropped, and why when a window had no measured post and dropped is null). brands list writes every assignment, by brand then account (of one brand with --brand): social_account_id, product_id, assigned_by and assigned_at; set writes the assignment and remove the one taken off.
State effect#
health calls Echo Web's authenticated /api/accounts/health and brands /api/accounts/brands, with ECHO_INTERNAL_BEARER at ECHO_WEB_BASE_URL; the Health section of the account's timeline page and the Account health section of Echo Desktop's GEO screen read health, each with a badge naming what needs attention (a ban signal, a check that could not run, a reach drop); the ecosystem's accounts tab shows each account's brand and keeps the assignments, as the Account brands section of Echo Desktop's GEO screen does; echo-mcp runs them as echo_account_health, echo_account_brands, echo_account_brand_set and echo_account_brand_remove. health only reads Echo's action history and health snapshots, and, for reach, the account's published posts and their scraped metrics: recent is the last --days, earlier the --days before, and reach has dropped when recent views per measured post are below --reach-factor times the earlier ones. Checks are run by the routines and sweeps that dispatch them, such as /api/cron/reddit-shadowban-sweep. An account speaks for one brand (account_brands); every action Echo dispatches through an account whose params name a product_id is refused as a conflict when the account speaks for another brand, or for none, naming both; an action that names no brand is not judged.
Refusals#
- A wrong invocation is refused before anything is sent: "accounts takes health …; brands list|set|remove …; got <word>", "accounts brands takes list …; set …; remove …; got <word>", "accounts <verb> does not take <flag>; it takes …", "<flag> needs a value" and "accounts <verb> needs <flag>".
- Echo Web answers a bad request with "account_id is required: the account whose health is read", "days must be a whole number above zero: how far back the account's checks are read; got <value>", "reach_factor must be a number above 0 and at most 1: the share of the earlier views per post below which reach has dropped; got <value>", "social_account_id is required: …", "product_id is required: …" or "assigned_by is required: an internal caller has no signed-in user, so it names who is acting"; not found with "account <id> has no brand". A dispatched action is refused with "account <id> speaks for <brand>, not <brand>" or "account <id> speaks for no brand, so it does not act for <brand>; …". The command prints Echo Web's sentence and exits 1.