| 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. |