* feat(issues): show agent runs inline with comment replies
* fix(issues): unify run comment projection and preserve disclosure focus
* refactor(issues): replace nested run cards with inline status rows
* fix(issues): align thread roots with reply content
* style(issues): remove thread toggle background
* style(issues): group reaction picker with comment actions
* feat(issues): show readable issue references in run summaries
* style(issues): move completed run logs into comment headers
* style(issues): balance comment block vertical spacing
* style(issues): shimmer live agent progress text
* style(issues): unify comment action hover feedback
* style(issues): reveal comment actions on block hover
* fix(issues): move published reply activity into the header
* fix(issues): settle comment UI as soon as replies are published
* fix(issues): reveal comment log buttons on hover
* fix(issues): defer run placement until trigger comments arrive
* fix(issues): isolate agent comment queues by thread
* fix(issues): display pending runs in execution order
* fix(ci): align integration tests with thread-scoped queues
* fix(issues): fit run actions to narrow comment columns
* fix(issues): stop blaming permission for an unresolved mention target (MUL-5548)
A well-formed but wrong agent mention UUID comes back as
`invocation_not_allowed`, and the UI rendered that as "You don't have
permission to use this target". The server never claimed a permission
cause: `invocation_not_allowed` is deliberately ambiguous so a blocked
reason cannot confirm that a private agent in another workspace exists
(dispatch/reason.go). The copy turned a typo into an access-control
investigation — GH #6181 hit exactly this on a squad handoff.
- Reword the blocked-trigger labels in all four locales to name both
possibilities instead of asserting permission, and record in
blocked-trigger-copy.ts why a label must not narrow the wire code.
- Report a mention id that is not a valid UUID at all
(`mention://agent/-`) as `target_unavailable`, matching the squad
branch beside it and the autopilot admission path. A non-UUID names no
entity in any workspace, so it conceals nothing and must not be blamed
on invoke permission.
The well-formed-but-unresolved case is unchanged and still shares
`invocation_not_allowed` with a private agent — the enumeration boundary
this issue asked us to move stays exactly where it is.
Also refresh the multica-mentioning skill: the mention path gates on
`canInvokeAgent`, not `canAccessPrivateAgent` (split in MUL-3963), and
the skill now tells agents to check a mention UUID against the roster
before touching any visibility setting.
Co-authored-by: multica-agent <[email protected]>
* docs(skills): correct the mentioning skill's "silent no-op" framing (MUL-5548)
Review nit on #6190: the source map still titled its table "Guards that
make a valid mention a silent no-op", but a parsed mention is never
silently dropped — it is either blocked with a reason_code or folded into
a running task. Several rows in the same table also pointed at
comment.go:14xx line numbers that had drifted.
- Retitle to "Guards and outcomes for a parsed mention" and split the
outcome into its own column, so each row states the reason_code it
produces.
- Replace the drifted line numbers with stable search anchors, matching
the convention the newer rows in this file already use.
- Correct two rows that were wrong, not just stale: archived / no-runtime
targets are blocked (target_unavailable, runtime_offline), and an
already-pending target is a coalesce/defer fold, not a skip.
- Apply the same correction to SKILL.md, where the frontmatter and the
"What does NOT happen" section told agents an already-pending mention
was dropped. It is folded into the running task and still gets read —
worth being exact about, since believing otherwise invites a re-post.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Bohan-J <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* fix(comment): @all no longer swallows an explicit @agent mention (MUL-5411)
computeCommentAgentTriggers short-circuited on `util.HasMentionAll` before it
looked for explicit mentions, so a comment carrying both `@all` and an
`@agent` / `@squad` mention enqueued nothing at all — the named target never
ran. Evaluate the explicit-mention branch first; `@all` now only suppresses the
implicit routes (assignee / thread parent / conversation), which was its intent.
`all` is neither "agent" nor "squad", so it is still skipped inside
resolveMentionedAgentCommentTriggers and never enqueues a run of its own.
Tests: preview + create coverage for @all + @agent (mentioned agent only, no
assignee fallback), @all + @squad (leader wakes), @all + @member (still
suppressed), plus an end-to-end subtest in the @all suppression integration
test. Refreshed the builtin multica-mentioning skill and its source map, which
documented the old short-circuit and a function name that no longer exists.
Co-authored-by: multica-agent <[email protected]>
* fix(comment): malformed mention id no longer panics the trigger resolver
Review finding on PR #6048. MentionRe accepts any `[0-9a-fA-F-]+` id, so
`mention://agent/-` parses as a real mention, and resolveMentionedAgentCommentTriggers
handed it to parseUUID (util.MustParseUUID) — a panic on attacker-controlled
comment text. Preview returned a 500; on the create path the comment row was
already committed before the panic fired.
Parse both the agent and the squad mention id with the error-returning
util.ParseUUID (the convention routeFirstExplicitRootMentionOwner already
follows) and record a blocked outcome instead: agent → invocation_not_allowed,
squad → target_unavailable. Those are the same enumeration-safe codes a
well-formed id that owns no entity already produces, so a malformed id reveals
nothing new and never enqueues.
The panic predated the @all reordering on plain explicit mentions; the reorder
made it reachable for @all + malformed id too, so it is closed here.
Tests: table-driven preview + create regression for a bare `-` agent id, a
short hex agent id, a malformed squad id, and both @all combinations —
asserting no panic, no trigger, and the exact blocked outcome. Verified the
tests fail with the panic before the fix.
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Eve <[email protected]>
Co-authored-by: multica-agent <[email protected]>
* Add comment trigger preview suppression
Co-authored-by: multica-agent <[email protected]>
* Use TanStack Query for trigger preview
Co-authored-by: multica-agent <[email protected]>
* Test note comments skip create triggers
Co-authored-by: multica-agent <[email protected]>
* feat(issues): redesign comment trigger chips as avatar chips
Single agent renders as avatar + presence dot + full sentence; several
agents collapse to an overlapping stack + active count, mirroring the
header working chip. Per-agent skip moves into a click-opened popover
(hover layers stay read-only tooltips); suppression reads as brightness,
not a ban glyph. Loading and preview errors render nothing.
Also: share one tooltip body across chip and popover rows, invalidate
cached previews after a comment lands (the enqueued task changes the
dedup answer), move the preview query key into issueKeys, and drop the
now-unconsumed status field from useCommentTriggerPreview.
Co-Authored-By: Claude Fable 5 <[email protected]>
* refactor(server): drop comment trigger wrappers kept only for tests
enqueueMentionedAgentTasks and shouldEnqueueSquadLeaderOnComment had no
production callers after the compute/enqueue split — the comment path
goes through computeCommentAgentTriggers. Tests now exercise the compute
functions directly via package-local helpers, so the legacy adapters
cannot drift from the real path.
Co-Authored-By: Claude Fable 5 <[email protected]>
* docs(skills): sync mentioning/squads source maps with shared trigger computation
The squads source map still pointed the comment-trigger contract at the
pre-refactor call chain (comment.go:940 -> shouldEnqueueSquadLeaderOnComment),
and the mentioning skill referenced the deleted wrapper. Re-anchor both
to computeCommentAgentTriggers / computeAssignedSquadLeaderCommentTrigger
/ computeMentionedAgentCommentTriggers with current line numbers.
Co-Authored-By: Claude Fable 5 <[email protected]>
---------
Co-authored-by: multica-agent <[email protected]>
Co-authored-by: Claude Fable 5 <[email protected]>