General-purpose coding policy for Baruch's AI agents
76
95%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Process steps in order. Do not skip ahead.
A standup is not a round of work: nothing is dispatched, no context is cleared, and no worker is interrupted. A worker that is mid-task keeps working and its row comes from what you already know.
.tessl/plugins/jbaruch/coding-policy/skills/herdr-teamlead/roster.shEmits {"caller":{...},"agents":[{"name","kind","pane_id","state"}]} for every
named agent other than your own pane. Exit 1 is a precondition (outside Herdr,
herdr absent); exit 2 is a herdr failure. On either, report the message
verbatim and finish here.
Split the roster by state:
idle or done — ask them in Step 2.working or blocked — never asked. Their row comes from the round log or
the assignment ledger, with what they are on, in Step 3.An empty roster means there is no team to stand up. Say so and finish here. Proceed immediately to Step 2.
One call per idle or done worker:
.tessl/plugins/jbaruch/coding-policy/skills/herdr-standup/standup-ask.sh \
<agent-name> <absolute-report-path>Sends the standup question as a plain message and emits
{"agent","report_path","state","sent"}. Exit 3 means the worker was not ready
and nothing was sent — move it to Step 3's list. Exit 1 is a precondition,
including a report path longer than the script's limit (the worker's
REPORT: <path> line must fit one pane row), exit 2 a herdr failure. The question text and the four-line shape it demands are the
script's contract; see the header of
skills/herdr-standup/standup-ask.sh.
Then wait for each one:
.tessl/plugins/jbaruch/coding-policy/skills/herdr-standup/standup-wait.sh \
<agent-name> <absolute-report-path>Same argv, stdout, and exit codes as wait-report.sh, which it runs with the
standup's own give-up budget — a standup answer is four lines, not a task. The
budget is the script's constant, never a number chosen here; see the header of
skills/herdr-standup/standup-wait.sh. Exit 1 means the worker did not answer
inside it: it is not chased twice. Move it to Step 3's list with what you know.
Exit 3 means a dialog is up — relay it and leave that worker to the operator.
Exit 4 means the answer file exists but the pane did not show the marker
whole. That is not an answer: a marker the pane wrapped cannot be told from a
newline. Read the live state with herdr agent get <agent-name> and take the
first continuation that applies:
blocked or working — re-run the wait for that worker once.
Exits 0–3 from that re-run take their branches above. A second exit 4 is
terminal: move the worker to Step 3's list with what you know.idle or done — move the worker to Step 3's list with what
you know. standup-ask.sh refuses a report path too long for one pane row,
so this outcome means the path bypassed it.Proceed immediately to Step 3.
For every worker that was busy, blocked, or silent, write one entry into a JSON file for the renderer:
{
"<agent>": {
"roles": "developer",
"done": "<from the round log>",
"plan": "<from the round log>",
"blocked": "none",
"note": "busy: <task>"
}
}note renders beside the agent's name, so a busy worker reads as
grok (busy: refactor). Every field is optional. Take the content from the
round log or the assignment ledger — never from a pane read, and never from a
guess about what a worker is probably doing.
If every worker answered, skip the file. Proceed immediately to Step 4.
python3 .tessl/plugins/jbaruch/coding-policy/skills/herdr-standup/standup-render.py \
--reports <round-reports-dir> \
--now <ISO-8601> \
--team "<label>" \
--agent <name>=<report-path> [--agent ...] \
[--roles <roles-json>] [--extra <extra-json>]Writes standup-<date>.md into the reports directory and prints one JSON
object on stdout: {"markdown_path","block","answered","unasked"}, where
block is the fenced terminal table. Save the output to a file. Exit 2 means a
report file did not carry the four-line shape, naming the file — ask that
worker again, or move it to --extra. Exit 1 is a missing or unwritable input,
and the message says what to fix.
--now is required and never defaults to the clock, so the same inputs render
the same bytes. The column widths and the wrapping are the script's contract;
see the constants at the top of
skills/herdr-standup/standup-render.py.
Proceed immediately to Step 5.
Print block from the saved output verbatim (jq -r .block <file>), exactly
as the renderer emitted it. Do not reformat it, do not summarize it, and do not
replace it with prose: the fixed width and the banner are what make it findable
when the operator scrolls back through a session full of agent output.
Name markdown_path underneath, in one line. Add your own reading of
the standup only if a row carries something the operator should act on today —
a blocker naming another worker, or a plan that contradicts the round in
flight. Otherwise the table speaks for itself. Finish here.
.tessl-plugin
hooks
rules
skills
adopt-fork-pr
herdr-standup
herdr-teamlead
references
teamlead
tests
migrate-to-plugin
onboard-repo
release
tests