feat(commands): publish the declared set, so a slash command exists #886
No reviewers
Labels
No labels
move-to-repo
coilyco-bridge-deploy
move-to-repo
coilyco-flight-deck-agent-compose
move-to-repo
coilyco-gaming-eco-app
move-to-repo
coilysiren-inbox
move-to-repo
unknown
🔒⚠️📦⚠️🔒 SANDBOXED 🔒⚠️📦⚠️🔒
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/sirens-echo!886
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/hs68-prompt-commands"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Building #127's remaining half turned up something bigger than the half: the registration Discord needs was missing for every command, not just prompts.
The finding
A slash command has three parts. This repository had two.
discordCommands()renders the declared set. Its only caller was a test.onInteractionis wired whenSIRENS_ECHO_DISCORD_COMMANDSis on.ApplicationCommandBulkOverwrite, or any other registration API.So
/echo,/job-status,/job-canceland/mcpswere unreachable even with the switch on. Discord shows a member no command nobody published, so the handler sat waiting for interactions that could not arrive. Declared, validated, tested, handled, and invisible.That reframes what #127 was blocked on. The issue reads as "prompt commands are not built"; the truth was that the command surface underneath them had never been published.
What this ships
Registration on
discord.ready, the first point the application id exists, behind the same default-false switch.Per guild, not globally. A global command appears in every guild the bot is in, including ones the access policy refuses. Those would be visible, invocable, and answered
not permitted here- advertising a summon path this deployment does not offer, which is the propertydocs/access-policy.reference.yamlexists to keep honest. A deployment admitting no guild registers nowhere and says so rather than falling back to global.A bulk overwrite, so the published set is exactly the declared set. A command removed from
JobCommands()disappears rather than lingering as an invocable ghost whose handler is gone.A guild that refuses does not stop the others. Logged as
discord.commands.failed, loop continues, first error returned at the end. A partial surface beats none, and swallowing it would be the silent-inert shape this repo keeps finding.Six tests: the whole declared set reaching every admitted guild by name rather than by count, the two refusals, partial failure, the deployment gate, and the admitted set coming from the access policy.
What this does not ship, and why it is a separate issue
Prompt promotion, filed as #884 with
consult.The pieces exist -
CommandFromPromptmaps the shape,MCPProvider.Promptfetches,seedFromPromptfolds it into a turn. Assembling them is not the hard part. The hard part is one nothing on #127 had named:An interaction must be answered in three seconds, and a model turn takes minutes.
respondToCommandanswers immediately. Every command that exists today fits -/job-statusreads a record,/echosubmits a job and returns an id. A prompt command is the first whose whole purpose is a model reply, and on #577's own numbers Echo's round 0 alone ranges 133.5s to 255.4s.Two shapes - defer the interaction for 15 minutes, or submit a job - and choosing between them is a product call about what a slash command should feel like. That is why #884 is
consultrather than something I should have picked while writing a PR.Also on #884: whether
prompts/list_changedre-registers (a Discord write on a server's schedule), Discord's command-count limit, and what the allowlist should actually contain. Nothing has named a promotable prompt yet.#127 stays open, since this does not close it. Filing the slice and closing that one rather than weakening the reference is the house rule.
just gatepasses.#127 stays open. This closes the registration slice, filed as #885, and the prompt half is #884.
closes #885