A user install would give Echo nothing today, because every summon path is a gateway event and the commands declare no user-install context #792

Open
opened 2026-08-15 01:39:29 +00:00 by coilyco-ops · 0 comments
Member

Filed by Olaf (ops, claude seat). Kai asked how to install Echo as a user app. The link is trivial; the reason it would not work is not, so recording it rather than handing over a link that appears to succeed and then does nothing.

What a user install actually is

Discord's user install (integration_type=1) attaches the app to a person rather than a guild, so they can use it anywhere they go. It differs from a guild install in ways that matter here:

  • It grants only the applications.commands scope. There is no bot scope, and the permissions parameter is ignored, so none of the permission work on coilyco-bridge/deploy#519 applies to it.
  • The app receives no gateway message events. No message create, no mention, no DM event.
  • The only way in is an application command.

Why that is empty for Echo specifically

Every summon path the harness has is a gateway event. agent.go:196 registers onReady, onMessage, and onMessageEdit, and the access policy gates mentions and DMs. A user install delivers none of those, so a user-installed Echo would sit there inert.

The one path that could work is slash commands, and it is blocked twice:

  1. They are off. SIRENS_ECHO_DISCORD_COMMANDS defaults false at config.go:343 and neither lane sets it, so onInteraction is never even registered.
  2. They are declared guild-only. discordCommands() in commanddiscord.go:16 builds each ApplicationCommand with Name, Description, and Options and nothing else. With integration_types and contexts unset, Discord defaults a command to guild-install only. So even with the flag on and a user install completed, the commands would not appear for the installing user.

promptcommand.go has the same shape, so sirens-echo#127's prompts-as-commands work would inherit the same limitation.

Once the portal enables User Install under Installation Contexts, this is the form. It is correct and it is currently useless, per above:

https://discord.com/oauth2/authorize?client_id=1494729988799336548&integration_type=1&scope=applications.commands

Deep's is the same with 1534723490362429601. No permissions parameter belongs on either.

What it would take

  1. Enable User Install in the Developer Portal's Installation Contexts for the application.
  2. Set IntegrationTypes and Contexts on the commands discordCommands() builds, choosing deliberately between guild-only, user-only, and both.
  3. Turn SIRENS_ECHO_DISCORD_COMMANDS on, which sirens-echo#127 argues should not happen until the access policy models a command as a summon path.

The question this actually raises

A user-installed app follows the person into servers Coilyco does not run, and into their DMs with anyone. The access policy is written around guilds, channels, and accounts. A command invoked in a stranger's server is a context none of those three axes describe.

That is the same gap sirens-echo#127 opens for guild slash commands, widened: a guild command at least happens somewhere the policy can name. This one does not. Worth deciding whether user install is wanted at all before building toward it, because the answer may reasonably be no.

Acceptance, if it is wanted

  • A user-installed Echo responds to its commands for the installing user.
  • The access policy has an explicit answer for an invocation in an unmodelled guild or DM, including a default refusal.
  • The choice of contexts is recorded with its reasoning, the way the guardfile omissions are.
**Filed by Olaf (ops, claude seat).** Kai asked how to install Echo as a user app. The link is trivial; the reason it would not work is not, so recording it rather than handing over a link that appears to succeed and then does nothing. ## What a user install actually is Discord's user install (`integration_type=1`) attaches the app to a **person** rather than a guild, so they can use it anywhere they go. It differs from a guild install in ways that matter here: * It grants **only** the `applications.commands` scope. There is no `bot` scope, and the `permissions` parameter is ignored, so none of the permission work on `coilyco-bridge/deploy#519` applies to it. * The app receives **no gateway message events**. No message create, no mention, no DM event. * The only way in is an application command. ## Why that is empty for Echo specifically Every summon path the harness has is a gateway event. `agent.go:196` registers `onReady`, `onMessage`, and `onMessageEdit`, and the access policy gates mentions and DMs. A user install delivers none of those, so a user-installed Echo would sit there inert. The one path that could work is slash commands, and it is blocked twice: 1. **They are off.** `SIRENS_ECHO_DISCORD_COMMANDS` defaults false at `config.go:343` and neither lane sets it, so `onInteraction` is never even registered. 2. **They are declared guild-only.** `discordCommands()` in `commanddiscord.go:16` builds each `ApplicationCommand` with `Name`, `Description`, and `Options` and nothing else. With `integration_types` and `contexts` unset, Discord defaults a command to guild-install only. So even with the flag on and a user install completed, the commands would not appear for the installing user. `promptcommand.go` has the same shape, so `sirens-echo#127`'s prompts-as-commands work would inherit the same limitation. ## The link, for completeness Once the portal enables User Install under Installation Contexts, this is the form. It is correct and it is currently useless, per above: ```text https://discord.com/oauth2/authorize?client_id=1494729988799336548&integration_type=1&scope=applications.commands ``` Deep's is the same with `1534723490362429601`. No `permissions` parameter belongs on either. ## What it would take 1. Enable User Install in the Developer Portal's Installation Contexts for the application. 2. Set `IntegrationTypes` and `Contexts` on the commands `discordCommands()` builds, choosing deliberately between guild-only, user-only, and both. 3. Turn `SIRENS_ECHO_DISCORD_COMMANDS` on, which `sirens-echo#127` argues should not happen until the access policy models a command as a summon path. ## The question this actually raises **A user-installed app follows the person into servers Coilyco does not run, and into their DMs with anyone.** The access policy is written around guilds, channels, and accounts. A command invoked in a stranger's server is a context none of those three axes describe. That is the same gap `sirens-echo#127` opens for guild slash commands, widened: a guild command at least happens somewhere the policy can name. This one does not. Worth deciding whether user install is wanted at all before building toward it, because the answer may reasonably be no. ## Acceptance, if it is wanted * A user-installed Echo responds to its commands for the installing user. * The access policy has an explicit answer for an invocation in an unmodelled guild or DM, including a default refusal. * The choice of `contexts` is recorded with its reasoning, the way the guardfile omissions are.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-gaming/sirens-echo#792
No description provided.