fix(tile-ipc): allow cmd:execute:* as infra topic for commands capability
The tile capability allowlist was silently dropping `cmd:execute:
{name}:result:{ts}:{rand}` publishes from tile command handlers
because the result topic pattern isn't in any tile's manifest
`pubsub.topics` array — and realistically can't be, since it's a
runtime-generated topic owned by the cmd system.
Symptom from manual testing: user dispatches a programmatic command
(e.g. "hello"), the tile's handler runs (window shows up), but the
cmd panel's spinner stays on screen until the 30s proxy-command
timeout. The result reply never reaches the panel because
`tile-ipc.ts::tile:pubsub:publish` rejects the topic for the
handler's tile.
Fix: treat any `cmd:execute:*` topic as infrastructure, alongside
the existing `cmd:register` / `cmd:register-batch` / `noun:*` set.
Gated on the tile having the `commands` capability so non-command
tiles can't spoof dispatch topics. This covers both the dispatch
direction (main → handler) and the reply direction (handler →
panel).
- `backend/electron/tile-ipc.ts` — extend `isInfraTopic` with a
`cmd:execute:` prefix check.
- `tests/desktop/cmd-execute-twice.spec.ts` — new Playwright repro
that publishes `cmd:execute:hello` three times and asserts each
gets a result back. Fires the dispatch directly on the pubsub
bus (bypassing the panel UI) so the test pins the round-trip,
not the panel close behavior. Waits for hello-world to be
running AND for `cmd:query-commands` to include `hello` before
firing — firing too early otherwise delivers to zero
subscribers.
Tests: 2249/2249 unit + 239/239 Playwright (219 desktop + 20
desktop-serial, includes the new repro).