-
List candidates.
sybra-cli --json list --status human-required
If the user named a specific task id, skip straight to step 2 for that one.
-
Check whether the automated reviewer already rendered a verdict for this
task, so you don't redo its work:
sybra-cli --json get <id>
Look at agentRuns for an entry with role: human-review and read its
verdict ("human" | "sybra_bug") and verdictRendered fields directly —
don't go hunting for a fenced block in result, the app persists the
decision as structured fields for exactly this reason.
verdict: sybra_bug and verdictRendered: true — the side effects
(issue filed / local task created, status flipped to blocked) already
ran. If the task is still human-required here, something else moved it
back after the fact; investigate that instead of re-filing.
verdict: sybra_bug and verdictRendered: false — filing failed
partway (see the ## Auto-review verdict note appended to the body for
the error) and the task is genuinely still stuck. This is squarely this
skill's job: retry the diagnosis and filing yourself.
verdict: human — the automation only confirmed a person is needed, it
didn't explain why in enough depth to unblock. Fair game to re-examine.
-
Read what actually happened. Pull together:
Classify the root cause. Common buckets:
- Permission/tooling denial — agent needed a tool call it wasn't allowed
(missing
allowed_tools entry, require_permissions blocking headless).
- Ambiguous or underspecified task — the agent genuinely couldn't decide
between valid approaches; this is a judgment call, not a bug.
- Failing test / CI / build the agent couldn't resolve within its turn
budget or tool access.
- Merge conflict or stale worktree requiring a human decision on which
side wins.
- Sybra defect — a workflow step, prompt, or gate misbehaved (wrong
status transition, a tool that should have been allowed wasn't, a prompt
that led the agent astray). This is the only bucket that warrants filing
an issue against Sybra itself.
If the root cause is a genuine judgment call (ambiguous spec, a real
decision only a human can make) rather than a Sybra defect, do not force an
issue into existence — append a clear note explaining the decision needed
and stop; leave the task in human-required for the person to actually
decide. Filing an issue is for the "Sybra defect" bucket only.
-
File the finding — respect Work-Data Confidentiality. Before filing,
check the task's project type, since a raw public GitHub issue is only safe
for non-work projects:
sybra-cli --json get <id>
sybra-cli --json project get <projectId>
pet project, confirmed — file directly on the public repo:
gh issue create --repo Automaat/sybra --label sybra-bug \
--title "<short root cause summary>" \
--body "<root cause, evidence, and how it manifested — see below>"
work project, no project at all, or type lookup fails — never call
gh issue create; there is no CLI hook
into the app's regex scrubber (internal/scrub, App.workScrubContextForTask
is Go-only), so you are the scrubber. File a local scrubbed task instead,
writing the body yourself with every work-repo identifier removed (GitHub
URLs/branch names/commit SHAs from work repos, ticket keys, internal
hostnames, customer names, code snippets) — describe the Sybra defect
abstractly, the same way fileLocalScrubbed would:
sybra-cli --json create --title "<short root cause summary>" \
--tags "sybra-bug,scrubbed" \
--body "<scrubbed root cause + evidence, no work-repo identifiers>"
Issue/task body should cover: what the agent was trying to do, what broke,
the concrete evidence (log line, tool error, failing check), and the
suspected fix location if you found one. Don't speculate past the evidence.
-
Unblock the task, referencing what you filed. The default path is to
flip it back into the workflow:
sybra-cli --json update <id> --status todo \
--status-reason "root cause: <one line>; see <issue-url-or-task-id>" \
--issue <issue-url>
update --issue writes only the task's ref_issue annotation field, never
the canonical issue field consumed for PR auto-close — it doesn't file or
link anything by itself, so it's safe to attach alongside either filing
path above.
Two exceptions, both from prior painful experience with this exact flow:
-
Report back per task: root cause bucket, where you filed it (GH issue
URL, or local task id for scrubbed work tasks), and the new status. If a
task turned out to be a genuine human decision (step 3's "stop" case), say
so plainly instead of forcing steps 4-5 to happen anyway.