agent-handoff
Skill1 starsChanged 28 days agoMITView on GitHub
Use when the owner wants to hand work to a specific running coding agent, draft an assignment or brief for an agent, send an agent a message or prompt through Herdr, or wait for a running agent to answer and relay what it said. Drafts first, sends only after the owner confirms, and never treats a reply as acceptance. Not for reading agent status (herdr-operations), starting a new session on a host (agent-orchestration), or delegating small mechanical fixes to the Pi worker (pi-offload).
15 other projects use a version of this.
Adopted by
Most recently taken up by
- sammasak/skillsword for word, first seen Nov 1, 2026
- hams-ollo/zen-agent-skillstheir own version, first seen Oct 20, 2026
- anyhui/hermes-skillstheir own version, first seen Oct 13, 2026
- adam-paterson/skillstheir own version, first seen Oct 11, 2026
- aprameyak/coding-skillstheir own version, first seen Oct 2, 2026
- L3DigitalNet/Claude-Code-Pluginstheir own version, first seen Aug 31, 2026
Other versions15 projects use a version of this.
Word for word · 1
- sammasak/skills★ 1100% same
Edited · 0
None found.
Wrote their own version · 14
- WeirdSky924/agent-handoff-skill★ 26same name
- L3DigitalNet/Claude-Code-Plugins★ 8same name
- DavidDingXu/agent-handoff★ 4same name
- alexjiaguo/agent-handoff★ 2same name
- hams-ollo/zen-agent-skills★ 2same name
- Wh0FF24/whoff-agents★ 2same name
- adam-paterson/skills★ 1same name
- aprameyak/coding-skills★ 1same name
- NITISH-R-G/agent-memory-protocol★ 1same name
- anyhui/hermes-skills★ 0same name
4 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository25 other files it gives its agents.
- agent-orchestrationSkill
- assigning-subagent-modelsSkill
- credentialsSkill
- deep-modulesSkill
- device-protocol-investigationSkill
- e2e-testingSkill
- herdr-operationsSkill
- herdrSkill
- knowledge-vaultSkill
- kubernetes-gitopsSkill
- lean-codeSkill
- nix-audit-operatorSkill
- nix-flake-developmentSkill
- ntfy-notificationsSkill
- orchestrated-reviewSkill
- pcap-evidence-analysisSkill
- pi-offloadSkill
- pi-ticketSkill
- rf-chaos-experiment-reviewSkill
- rust-engineeringSkill
- sdlc-pipelineSkill
- secrets-managementSkill
- tooling-feedbackSkill
- verify-serviceSkill
- wireless-lab-diagnosticsSkill
The file
We split this skill into the rules it gives an agent
1 rule. 0 are common, 0 are distinctive, and 1 is very specific to this project.
0
Common
Most of the 11 edited versions we read keep these.
0
Distinctive
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 76
Only the owner can ask for resend, and the task refuses one when the agent's state advanced in between (probably_received).
“Common” is measured: kept by at least 6 in 10 of the 11 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Agent handoff (draft, confirm, send, await, verify)
Sending is the only act-class operation the Coordinator has. The sequence is fixed; skipping a step is a boundary violation.
- Identify the target from a fresh
herdr:inventoryrecord: itsmachine(the saved Herdr machine label;nullmeans this host, then omit it) and exactagent_id. Ablockedagent is never a target; tell the owner what it is waiting for instead. - Draft with
coord:handoff, copyingmachine,agent_idandsession_idfrom the inventory record so the send is bound to that agent, not just its pane:devenv tasks run coord:handoff --input-json '{"machine":"<label>","agent_id":"<id>","session_id":"<session>","task_ref":"#N","scope":"...","expected_evidence":"...","acceptance":"...","allowed_actions":["comment","deploy:none"],"owner_input":"..."}'allowed_actionsis required: a non-empty list (at most 8) of distinct entries frommerge,close,label,comment,deploy:none,deploy:<host>(deploy:noneexcludesdeploy:<host>). The task puts it in canonical order (merge, close, label, comment, deploy:* by host), so the same set always gives the samehandoff_id, and renders it into the brief as theAllowed actions:line, which also tells the agent that reading, committing and opening a PR are always implied and that anything else, deleting included, is not allowed.scope,expected_evidence,acceptanceandowner_inputtake up to 4000 characters each. Show the owner the returnedtext,handoff_idand target (hostis the machine label, or this hostname) verbatim. Nothing has been sent. - Confirm: the owner must say, in this conversation, that this
handoff_idmay go to thishost/agent_id. Exception: inside the coordinator role (agents/coordinator/ROLE.md, Autonomy) the owner's label on the item replaces this per-draft confirmation; the send gate and its checks are the same. Silence, "looks good", or a general "go ahead" from earlier does not count. Note the GitHub issue (or PR) URL and the label the owner applied there for this handoff: the send records them asauthorized_by. If the owner has not named an issue URL and a label, ask (inside the coordinator role, take them fromgh:work); never infer or invent one. The authorizing issue is usually the handoff'stask_ref, but it may be a tracker the owner gates from. The send fetches that issue's labels throughghand refuses withauthorization_missingwhen the label is not there, when it is one the coordinator writes (needs-decision,blocked,needs-live), or when the audit log shows agh:labelact added it. The label is the owner's act; the record keeps who applied it and when (labeled_by,labeled_at, from the issue's label events, null when not found). - Send with
herdr:message(prompts for permission every time), the confirm string being exactly the draft'shost/agent_idandauthorized_bynaming the issue URL and owner label:devenv tasks run herdr:message --input-json '{"handoff_id":"<id>","confirm":"<host>/<agent_id>","authorized_by":{"issue_url":"https://github.com/OWNER/REPO/issues/N","label":"<label>"}}'It forwards throughherdr --machine <label> agent promptfor a saved machine, only sends to anidle/doneagent and refuses:agent_blocked,agent_busy(mid-turn: wait, then send),worker_unavailable(its pane ends on the harness's usage-limit line: hand the item to another available worker, or the owner switches its model),author_merge(mergefor the pane that implemented thetask_ref;coord:handoffrefuses it too: the reviewer merges, never the implementer),agent_changed(session differs from the draft), an edited draft (text orallowed_actions), a draft withoutallowed_actions(redraft it), a missing or malformedauthorized_by,authorization_missing(the label is not on the issue),gh_error(the labels could not be read; not treated as present), and a second send of the samehandoff_id. The audit record (audit.jsonl) carriesallowed_actionsandauthorized_by(verified: true,verified_at,labeled_by,labeled_at) for every attempt. A refusal before sending has nooutcome, onlyerror.kind(invalid_input,not_confirmed,authorization_missing,gh_error,agent_busy,agent_blocked,worker_unavailable,author_merge,agent_not_found,agent_changed,agent_restarted,agent_state_unknown,duplicate,probably_received,audit_corrupt,audit_failed,busy,timeout,command_failed): nothing was sent; report it verbatim and stop (inside the coordinator role, every "stop" in this step ends that item, not the session). Foragent_busy, check withherdr:inventoryuntil the agent is idle, then send. Otherwise readoutcome:delivered→ continue with step 5.unknown_deliveryoragent_prompt_stalled→ the text may already sit in the agent's input box. Runherdr:inspect, report what you see, stop. Only the owner can ask forresend, and the task refuses one when the agent's state advanced in between (probably_received).agent_blocked,agent_not_found→ nothing was delivered; report and stop.
- Await with
herdr:await, passing the message's audit id so machine, agent, session,since_seqand the delivery outcome come from the record (it refuses an undelivered attempt withnot_delivered):devenv tasks run herdr:await --input-json '{"audit_id":"<audit_id>","timeout_s":300}'The record separatesherdr_state,turn_observed,reached,worker_done,needs_owner;acceptedis always false here. Onno_turn_observed,agent_restarted,agent_changedoragent_not_found, inspect the pane and report; do not resend. - Verify with
work:status: onlywork_verdict: verifiedwith itsevidence_refcloses the loop. Report that, or report what is missing.
GitHub writes (gh:label, gh:comment, gh:issue)
The coordinator's only other acts. Each is bounded to one issue or PR and
appends two phase: gh lines to the same audit.jsonl (stage: attempt
before the write, stage: outcome after), naming the handoff_id it serves
or a reason:
devenv tasks run gh:label --input-json '{"repo":"OWNER/REPO","number":N,"label":"blocked","action":"add","handoff_id":"<id>"}'
(labels: needs-decision, blocked, needs-live, never a label that
authorizes a send; actions: add, remove) and
devenv tasks run gh:comment --input-json '{"repo":"OWNER/REPO","number":N,"body":"...","reason":"..."}'
(body up to 4000 characters). The task ends every comment with the one
signature -- Coordinator (automated; not the owner), replacing any
-- Coordinator line the body already had. A comment reports, quotes or
asks; it never answers, decides, approves or promises in the owner's name.
devenv tasks run gh:issue --input-json '{"repo":"OWNER/REPO","title":"...","body":"...","labels":["enhancement"],"reason":"..."}'
creates one issue in the owner's repositories (title one line, up to 256
characters; body up to 8000, signed the same way; labels only enhancement,
needs-decision, blocked, needs-live, never one that authorizes a send).
It refuses when an open issue already has that title, so a retry never opens
a second one. Approval stays gh:label's, under the owner's delegation.
They run only after the owner confirmed, in this conversation, the exact
label or text and its issue (inside the coordinator role, its Autonomy rules
instead). A gh failure is recorded in the audit line and
returned as error.kind (command_failed, timeout, malformed); report it
and do not retry blindly.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

