Skip to content

M2-16 Slash commands

No Date Ruling Reason
D-M2-16-0 2026-10-22 Built on the old integration line (base int/m1-wave51 with M2-08 merged in) and ported to main after M2-08 landed: only the ticket's own commits were brought over. The commit that copied R-AZ-25 into the old base is dropped, because main already carries it; the additions to the German chapter files of the old base go to their English files on main; the migrations take the next free numbers on main, 00057 and 00058. The rules of the landing replace the integration branches; main is the reference.
D-M2-16-1 2026-10-21 Unique index of commands is NULLS NOT DISTINCT; the FK of runs.triggering_command_id starts NOT VALID (00057) and is validated in 00058. Instance commands have a NULL coalesce; upgrade.md M5. Spec gap for 03.
D-M2-16-2 2026-10-21 Definition rules of agents/domain/command.go (design note 3) with the cap command.autocomplete_max_choices on static choices and the size rule against sync.event_payload_max_bytes. Static choices share the suggestion list; an unannounceable change is not stored.
D-M2-16-3 2026-10-21 description is a plain string; the translation map waits for the owner. No map type in the contract (spec gap).
D-M2-16-4 2026-10-21 Taken name 409 conflict without reason; limit 400 validation_failed with the field code limit_reached; registrations serialize on the owner's principals row. 06 5 point 7; READ COMMITTED.
D-M2-16-5 2026-10-21 Audit details: change, scope, control, required_level, version; never name, description or options. SEC-AUD-5.
D-M2-16-6 2026-10-21 Identical PUT: 200, no write; DELETE of a removed command: 204, no write. 06 7.
D-M2-16-7 2026-10-21 Visibility of kind command as design note 8 b (07 4.3), replacing M1-28 D4 for it. 05 2.6, 04 7.2.
D-M2-16-8 2026-10-21 command.read also takes kind command (ActionResourceKinds); 05 names only channel. Design note 8 d; spec gap for 05.
D-M2-16-9 2026-10-21 Target rule of command.register as design note 8 c; an update checks the new scope only. 09 10.2.
D-M2-16-10 2026-10-21 Built-ins are not in listChannelCommands; the client lists 09 10.1. A built-in has no id, owner or version.
D-M2-16-11 2026-10-21 Most specific scope per owner and name wins (list and resolve); operator first, then name, owner, ID. Owner intent; no thread parameter (spec gap).
D-M2-16-12 2026-10-21 Without thread_id: main thread for control commands, for model commands only without auto_thread, else 400 /thread_id required. No message to start a thread from.
D-M2-16-13 2026-10-21 A command addresses its owner like a mention; the active-run rule is command.invoke's; check order of design note 10. 09 10.3 and 10.4.
D-M2-16-14 2026-10-21 Refusals: 404, 403 channel_read_only, else 403 agent_invocation_denied with the reason; an agent caller gets level_insufficient. 06 4 points 6 and 7.
D-M2-16-15 2026-10-21 invocation_id new per accepted invocation, not stored; accepted always true. 03 has no table for it.
D-M2-16-16 2026-10-21 Option value rules of design note 10 i (ValidateOptionValues). No account oracle; files in M3.
D-M2-16-17 2026-10-21 AgentInvocationPayload gets command_id, command_name, options for trigger_kind = command. 09 4.4, 4.5 point 6.
D-M2-16-18 2026-10-21 Delivery of command.invoked re-checks agent.invoke only, without run lock or jti; only a control grant may lack a run. 04 15.3 step 2, R-AZ-25.
D-M2-16-19 2026-10-21 New ports messaging.PrincipalRefs, identity.LockPrincipal, chat.TriggerChannel.MainThreadID (the same field M2-27 added on main); LockForMessageChange serves as thread lock; UpdateCommand carries Precondition; tests in internal/wire/serve_commands_test.go. 02 4.4; merged names win (D-W-100).
D-M2-16-20 2026-10-21 App commands are registered and read but neither listed nor resolved until M2-25 builds their execution; invoking one answers 404 like an unknown ID. A payload must be smaller than sync.event_payload_max_bytes, as the appender requires. Red team: an app command answered 500 and told an outsider that a channel exists.