Complete the Slack feedback cycle: read every thread and linked evidence, fix verified repo-owned issues, and reply in-thread with honest status, clarification questions, and release follow-up. Use when the user asks to address feedback and respond in the requested voice through the invoking user's connected Slack identity.
60
73%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
—
The risk profile of this skill
Fix and improve this skill with Tessl
tessl review fix ./.agents/skills/address-feedback-with-replies/SKILL.mdUse this workflow when the user wants feedback triaged, fixed, and answered in Slack in one pass. Reply only in the requested scope and keep replies as evidence-based as the code. Cluster identical symptoms under one Builder thread while replying in each in-scope report that needs a status.
This workflow is for clear bugs, not a general UX review. A clear bug has observable broken behavior such as a click or submit doing nothing, an action error, data loss or reversion, a wrong result, or a regression. Do not react, ask questions, reply, or change code for preferences, product ideas, copy or layout suggestions, praise, status updates, merge or review requests, bot forwards, duplicates, or other random messages. Design feedback, including Design clips and imported-design usability, routes to Sid and is not handled here. Content remains with Alice.
One exception: an :upvote: from the invoking identity promotes an otherwise
out-of-scope UX or feature request into scope - that reaction is the product
decision, so build the smallest version rather than asking which variant is
wanted. The upvote is the authorization — do not wait for a second sign-off.
It does not transfer ownership: an upvoted Design or Content item still gets
built, with Sid or Alice named in the recap row so the mapped owner is not
surprised by a change in their area. Naming them is a courtesy, not a gate.
Either workflow may complete an upvoted improvement and record the terminal
Shipped disposition. Everything in this file about voice, evidence, and
verification applies to an upvoted item unchanged.
Even when invoked alone, this workflow asks at most three new clarification
questions per run across all threads, ranked by which answer would unblock a
safe fix.
If this workflow earlier added 👀 to an out-of-scope item, release that claim
with ✅ when reactions are available. Do not investigate it as a bug, ask a
compensating question, or post a new reply. If this workflow already posted a
mistaken reply, delete that reply when safe; otherwise edit it to one brief
Skipped disposition. If the connector cannot add the release marker, record
the exact parent for manual cleanup and leave the thread otherwise untouched.
New messages must pass the clear-bug gate before any external write.
Every clear-bug parent or upvoted improvement that receives 👀
enters the reply ledger. The reaction is not a reply or completion marker.
Before finishing, re-read each claimed item and verify the invoking identity
posted Fixed, Shipped, In progress, or Clarification needed, or
recorded Open - no reply, Resolved elsewhere, Skipped, Clustered,
or Abandoned - no answer in 4 days with a concrete reason and a ✅
release marker for any terminal disposition. Record Owned elsewhere when another
valid workflow identity holds the eye; do not mutate that reaction. An
expired question leaves the ledger with its ✅ release marker and no reply owed.
Clarification needed may retain the eye only while the targeted question is
pending. In progress requires
concrete existing ownership or active fixing and must be revisited; a bot
forward, another person's reply, or 👀 alone does not qualify. Mistaken
out-of-scope eyes use the cleanup rule above, not a new reply.
address-feedback, concurrent-agents, and verifying-changes first.Every Slack interaction in this workflow - channel history, reactions, thread
replies and read-backs, permalinks, and Slack message/user/file metadata - uses
the connected Slack identity of the user who invoked the workflow. Verify that
identity before the first write and keep its stable { team_id, user_id }
tuple for all read-backs. Do not silently switch to a bot, another user's
connector, or a different workspace. Do not load or use SLACK_BOT_TOKEN.
Linked external artifacts are not Slack interactions. After extracting their reference from Slack, fetch them through the artifact's owning connector or public URL.
user_id; missing author data is unverified and cannot satisfy
the reply ledger. It must also match the target channel, timestamp, thread
parent, and workspace. A reaction read-back must include the invoking user
in the reaction's user list.Apply the shared address-feedback Choose the fix altitude gate before
reacting, editing code, or replying. It selects the smallest owning seam and
prevents one subjective report from becoming a global instruction.
Once classified as a clear bug or an upvoted improvement, add 👀
before investigation or delegation. Leave subjective/product, policy,
informational, bot-forward, status-only, non-repo-owned, and Design items
without reaction, reply, or code unless the invoking identity's :upvote: put
them in scope; Design goes to Sid unless upvoted or explicitly assigned.
Never post the same sentence into several threads. When reports share one cause, reply once and record the rest as clustered.
A tracked clear-bug or authorized upvoted improvement receives at most one
disposition per run. Active dispositions are In progress and
Clarification needed; terminal dispositions are Fixed, Shipped,
Open - no reply, Resolved elsewhere, Skipped, Clustered, and
Abandoned - no answer in 4 days, each with the required evidence and eye
state. An already-eyed item later found to be out of scope gets a ✅ release
marker and no new reply; if
this workflow already replied, delete that reply when safe or edit it to one
concise Skipped disposition. Fixed closes the current issue. In progress is
an open ownership state for a thread
where @agent-native or another participant already found the cause, linked a
fix, or said the work is being fixed; use it to acknowledge the existing work,
never to replace verification or to create a vague status update. The next run
must revisit In progress and resolve it to Fixed, Clarification
needed, or evidence-backed Open - no reply when no safe fix or
reproduction remains. Blocked, not fixed yet, still needs a fix, and
similar phrases are internal notes, never a complete Slack reply. Open - no
reply is terminal only after releasing the eye with ✅. If a reply
does not say the fix is complete, acknowledge concrete existing ownership, or
ask what is needed to fix it, do not post it. These are ledger states, not
mandatory headings: keep the reporter-facing wording natural instead of
opening with the robotic phrase “Clarification needed”. A substantive
diagnosis, fix, or in-progress ownership statement from someone in the thread
is not a reason to ask for clarification; verify it or continue the existing
handoff first.
Clarification needed is an open state, not a completed product fix. Asking
the question creates a standing obligation to come back for the answer. It is
the invoking identity's terminal disposition for the current cursor, but the next
review-latest-feedback run must re-read every thread it previously asked in
before scanning newer messages; when this workflow runs on its own, do the same
and act on the replies first.
That obligation expires after four days, standalone runs included: release the
👀 with ✅, post nothing, and record the terminal Abandoned - no answer in
4 days. An expired thread keeps no open eye and owes no reply. Carry the underlying bug
forward with no reporter dependency.
In progress is also an open state. It records that the thread already has real ownership or an active fix, so the invoking identity must not ask the reporter to repeat the issue. Re-read it on the next run, verify the work, and replace the open state with Fixed when complete or Clarification needed only if a specific reporter or product input is still missing.
Treat a clarification reply as new evidence, not a new report. Re-read the thread and try the fix before asking anything else. An answer or explicit resolution from any participant is sufficient when it supplies the requested detail. A partial reply leaves the one existing request pending. Ask again only for one specific, non-repeating detail that still blocks a clear-bug fix; never ask for a subjective product choice or evidence already present. For an inaccessible artifact, request access or a replacement link.
This workflow inherits the hard cap from review-latest-feedback: at most
three new clarification questions per invocation across all threads. When run
alone, rank candidates by whether the answer would unblock a safe fix, handle
existing clarification requests first, and leave candidates below the cut
open without asking. Never turn the per-item question rule into an unbounded
batch.
There may be only one unanswered clarification request per thread. Before
posting, re-read the complete thread for an earlier question from this
workflow, the companion review-latest-feedback workflow, or @agent-native,
and check whether its exact requested detail has been semantically answered or
explicitly resolved anywhere in the thread. If it is still unresolved,
including after a partial or unrelated reply, keep that request as the sole
pending handoff and do not post another question. Once it is answered or
resolved, attempt the fix from the new evidence first; ask at most one new,
non-repeating question only if one specific required detail still blocks it.
address-feedback categorization and Fix-altitude
gate when choosing the disposition and owning seam. When the same underlying
issue appears in multiple threads, build one cluster checklist and drive one
Builder thread for that cluster; do not create separate Builder threads
unless the reports diverge in symptom, surface, or owner.👀 to
each clear bug immediately, one thread at a time as it enters scope. Do not
batch reactions until after investigation, implementation, testing, or the
final Slack pass. If the reaction fails, stop and retry or report the
concrete Slack permission/API blocker before continuing the investigation.
Do not react to subjective/product, policy, informational, bot-forward,
status-only, Design, or non-repo-owned items.
For an authorized upvoted improvement, perform and read back that same eye
reaction before investigation or delegation, then include it in the ledger.👀:
thread_ts through the same connected Slack identity. Do not
silently turn an authorized write into a draft. Re-read each thread
afterward to confirm the reply landed under the intended parent. Use the
exact parent timestamp as thread_ts; never reply to a search-result
timestamp or an adjacent thread. Before ending the run, mechanically
audit the reply ledger: for every claimed parent, record the optional
invoking-user reply timestamp, disposition, and eye state. Use the states in
the contract above, with a reason; silent terminal states have no timestamp.
Record Owned elsewhere for a foreign eye without mutating it. Record
out-of-scope and non-owning Clustered rows with a ✅ release marker and
no reply. Do not create questions for out-of-scope items.
If any participant replies after the post, re-read the entire thread again
before deciding whether to fix, close, or ask anything else.Write in the invoking user's voice and send from that same connected Slack identity:
ty for the feedback - (or thanks for the feedback -) before the
status. Do not open with agreed, valid request, ah, or a diagnosis.this was sent from a bot. so
future sweeps can rediscover it; historical replies may not contain the
marker and must still be found by the companion clarification search.ah, yeah, and good find can follow the thank-you when they fit; do not
force them into every reply. Prefer - over em dashes.valid request and stop, and do not say no ship timing yet as a dead end.
Implement the fix first; when code is complete, say it is fixed and should be
live after the final ship later today (roughly end of day) only when it is
confirmed to be included in that ship.👀 with ✅, record
Open - no reply, and post nothing.👀 without this workflow's ✅) and no reply from the
invoking identity. A claimed-and-released item may retain both reactions.A useful reply shape is:
ty for the feedback - [short plain-language status].
[if fixed: this should be live after the final ship later today.]
[if in progress: we're already looking into this and will follow up once the
fix is verified.]
[if clarification is needed: if you can share the one missing detail, that
would help us investigate, such as a deck URL and/or request ID.]Keep it to one short paragraph whenever possible. Omit the release sentence only when the change is not complete; do not invent a ship date for an open item. For an unclear runtime report, inspect its run ID and linked app evidence first; ask for one missing detail only when those sources cannot adequately identify the failure.
After the final ship, return to the same threads and post a brief follow-up saying the fix is live only after verifying the live path internally. If the ship has not happened yet or live verification is unavailable, do not imply that the fix is already live. Omit commit, release, and live-path details from the posted follow-up unless the reporter asks for them.
git diff --check.address-feedback - classification and fix boundaries.concurrent-agents - shared-checkout coordination.verifying-changes - proof before claiming done.writing-agent-instructions - guidance quality and scope.b0df876
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.