Build or improve a Roboflow Workflow using eval-driven search. Prefer this for open-ended business problems where the approach is unclear, or when comparing alternatives. A business goal plus images or video is enough to start; no existing Workflow or Eval is required. Build an example suite and scorecard the user approves, compare candidate Workflows, then tune and validate the winner. Use direct tools for straightforward builds and edits, Workflow Evals tools for measuring one existing Workflow once, and training skills for training a model.
87%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Prefer this skill when the user describes a business problem and wants a working solution, but has not chosen a Workflow architecture, model, or approach. A goal plus images or video is enough: help define success, build an approved Eval, and search for a suitable Workflow. The user does not need to know this skill exists or ask for an Eval.
Also use it to improve an existing Workflow by comparing approaches against examples and success criteria. Use direct tools for straightforward builds and edits with a clear approach; use Workflow Evals tools directly to measure one existing Workflow once.
For example, "Here is a factory video; detect assembly mistakes for me" fits this skill. "Add OCR after this crop" is a direct edit. For video, explain the per-frame scoring boundary in the Goal Card; this skill does not validate stateful video execution or temporal events.
Introduce the approach in plain language: "Let's agree on examples of correct results, then compare approaches to find a Workflow that works well for your goal." Follow the checkpoints below before spending inference past them; recognizing the intent does not authorize an unbounded search.
For agents: This skill is authored in
roboflow/computer-vision-skills. If your client already has it loaded as a skill (for example from a Roboflow plugin), use that copy. Theroboflow://skills/<name>/...MCP resources serve the same skills for clients that don't have them loaded.
You are the optimizer. The user is the judge. They describe the job, look at examples, say what is right and what is wrong, and say what they care about. You do everything else: build the test suite and the scoring behind the scenes, compose a portfolio of very different candidate Workflows, score them all together, tune the survivors, validate the winner on examples the search never saw, and tidy up. The user never has to learn what a Spec, Case, BindingSet, Execution, or subjectKey is. If they ask, explain; otherwise keep those words out of the conversation.
The Workflow Evals API contract (Spec, Dataset, Cases, bindings, Runs, results) ships with
the engine: workflow_evals_agent_manifest lists its resources and
workflow_evals_agent_resource_get reads them (skill:workflow-evals, skill:create-eval).
Read them in preflight. This skill owns the protocol and the search; those resources own the
API contract.
Guides in this skill:
intake.md: the questions, the Goal Card, how concerns become scoring.ground-truth.md: the test suite, getting examples from video, folders, projects
or URLs, the contact sheets, labeling with the user's corrections, growing the suite.search.md: the portfolio, smoke, the joint Run, reading a round with its noise,
tune-and-prune rounds, the finalists Run, cleanup, the report.gotchas.md: platform behaviors, known issues, and fallbacks that waste Runs.When showing annotations, labels, or predictions over images or videos, load the installed
draw-vision skill (possibly named roboflow:draw-vision), or the bundled
../draw-vision/SKILL.md. It owns library and environment choices;
load it only when rendering media evidence. If unavailable, use simple captioned media.
The test suite only grows. Every example is a test somebody approved. Examples are added or corrected, never removed. Every scoring Run uses the whole suite. Validation means adding examples the search never saw and rerunning on the grown suite, not holding part of the suite back. The suite outlives the session: a production miss becomes a new example, and any future Workflow version is one Run away from a verdict.
The Eval decides, not anyone's opinion. Every candidate goes through the same scoring. No claim about a candidate counts until a Run has scored it on the suite. Differences smaller than the run-to-run noise you measured are ties, broken on the next criterion.
The user judges from pictures. Every message that asks "which of these are right" ships
the images with the proposed answer printed on each one (contact sheets or a grid in
ground-truth.md). A table of file names is not reviewable.
| Say to the user | Means |
|---|---|
| the job, the goal | what the Workflow must answer per image |
| examples, the test suite | Cases in the Eval Dataset |
| answer key | ground truth |
| scorecard | the Spec's Checks, in words |
| must-never rule | a hard constraint that disqualifies a candidate |
| candidate | one Workflow under test |
| family | a group of candidates sharing an approach (VLM, detector plus logic, ...) |
| round | one joint Run scoring every live candidate on the whole suite |
| champion | the best candidate so far |
| new examples | Cases added after the search, for validation |
Speak the user's language (Portuguese if they write Portuguese) unless they ask for another; the intake asks which language the answers, names and report should use, because output names freeze after Phase 2. Keep every message to the user short: one table or one question at a time, plus the images. Before every Run, say what it is and what it costs: "round 2: 14 candidates × 52 examples".
workflow_evals_capabilities. It returns workspace (the URL slug); if the user named a
workspace and it differs, stop and tell them.workflow_evals_agent_manifest, then read skill:workflow-evals and skill:create-eval
with workflow_evals_agent_resource_get.shelf-gaps) and a session timestamp YYYYMMDD-HHMM. The suite's
resources are named by the job and reused across sessions: <slug>-spec, <slug>-suite,
<slug>-eval. Only candidates and the working folder carry the session timestamp.workflow_evals_list, name <slug>-eval). If
it exists, reuse it, its Spec and its Dataset, and add examples; do not create a second
suite for the same job. Listings carry signed URLs: read them, never paste them anywhere../opt-<slug>-<timestamp>/ with created.json, a registry of every
resource this session creates (kind, name, id, url slug, parent, pre-existing flag,
pruned/deleted status). Pre-existing resources, including a reused Eval, go in with
pre-existing: true. Cleanup reads this file and nothing else. The folder is also the
resume point: created.json, answer-key-draft.json, cases/all.json, candidates/*.json
and rounds/*/summary.json are written before every long wait, so a session that stops
(laptop closed, context reset) continues from them.workflow_specs_run (search.md, "Provider down"). Diagnose failures from the returned
error, not how long they persist. Ask for a managed-key check or a user key only when
the error indicates an authentication or key-configuration problem.Five phases, four checkpoints. A checkpoint is a message where you show something and wait. Never spend inference past a checkpoint before the user answers.
Follow intake.md. At most three questions, one at a time, only the ones whose
answers you cannot infer from what the user already said or from the media they gave you.
Before writing the Goal Card, look at the first, the last and a few middle examples and ask
yourself which of them fit none of the proposed answer values (an opening frame without the
scoreboard, an end card, an empty bench); those become values or "not scored here" rules now,
not during the review.
Then write the Goal Card: the job in one sentence, the answers the Workflow will give per image (name, type, allowed values, and for answers that depend on the scene whether they are answered on every image or only on some), the must-never rules, what "better" means in priority order with the latency budget if speed matters, and, for video or temporal jobs, the sentence that says the answer is per frame.
Checkpoint 1: the Goal Card. Edit until the user says it is right.
You build the first Workflow yourself from block schemas. It is only the answer-key drafter and the first member of the portfolio; it has no special status.
media_analyze helps for video.expression blocks decide
the answer. Observable means a thing you could point at in the frame: "the nearest player's
body spans more than a quarter of the frame height", not "this is a close-up". It beat
direct answering on possession and tied it on scene in testing once the
evidence was observable. For positioned answers, a detector or segmentation model.workflow_blocks_get_schema (manifest takes the block
type, such as roboflow_core/open_ai@v7).workflow_specs_validate, then workflow_specs_run on three varied examples (preview
upload path in ground-truth.md). Send the three images with the answers printed
on them and ask which are right.If the user has Workflows they want in the comparison, workflows_get each one; they join
the portfolio as-is, marked pre-existing. If the first Workflow cannot run (provider down,
see gotchas.md), draft the answer key from your own visual review and say so.
The Roboflow Agent (agent_chat) is off by default. If the user switches it on, use it
only for questions in prose; never let it build or save a Workflow for this session.
Follow ground-truth.md.
applicability). The contract cannot be
changed while a draft Case exists (gotchas.md).incomplete, with the first Workflow's answers as the
draft answer key, corrected by your own review of every example.workflow_evals_cases_replace; when
a correction changes a rule, rewrite the Goal Card line and relabel every example the rule
touches, then list those to the user. Mark Cases complete only after confirmation.intake.md maps answer types to evaluators),
outcome checks only, the Dataset, the Eval, and the bindings
(workflow_evals_bindings_suggest, then workflow_evals_bindings_validate). Check the
Eval is ready with workflow_evals_get. Latency is measured in Phase 5 (a latency check
disables execution reuse, so it stays out of the search Spec).Follow search.md. In short:
Portfolio. 20 to 40 candidates, as different as the job allows: VLM evidence pattern
with several models, VLM direct answer, foundation and public detectors, OCR on fixed
crops, Universe models, detector plus logic blocks, two-stage, ensemble, plus any
pre-existing Workflow. Each candidate is a saved Workflow named <model> + <approach> (<change>) · cNN · <timestamp>, registered in created.json with id and url slug.
Smoke, outside the Eval. Each manifest runs through workflow_specs_run on two or
three examples before it is saved. Manifests that error or return the wrong shape are
fixed or dropped. Never read a ranking from smoke; it has no timing either.
Checkpoint 2: scorecard and portfolio. Show the criteria in words, the must-never rules, the candidates by family (one line each), the coverage caveats, and the cost of round 1: candidates × examples. Ask for a yes.
Round 1. One Run, every candidate, caseSelection: all. Retry failed Cases up to twice
before reading. Gates first, then rank by the Goal Card order, then the analysis per family
and per shared failure. Shared failures go to the user as a contact sheet: in testing, 3 of 5 were answer-key errors.
Tune and prune. Each round keeps the survivors, adds tuned variants of the strongest ones aimed at their failures, prunes the bottom. Measure the noise: how much an unchanged candidate moves between rounds. Default budget: 3 rounds after round 1, 60 live candidates at most, fewer when they share one heavy model. One line to the user per round.
execution_reuse: never, on a Spec revision that adds the latency check when speed is in the Goal Card.
This gives ranges on rare values, clean latency, and the per-Case diff between champion
and runner-up (workflow_evals_results_compare, or the two exports locally when it fails).Checkpoint 3: the winner. Show the champion's score per criterion next to the runners-up and next to any pre-existing Workflow, on the whole suite and on the new examples; its remaining misses as a contact sheet; what it is, in plain words. If it is a pre-existing Workflow, say so. If the top two are tied on the first criterion, say which one the next criterion picks and why; the user may still choose.
Use the saved-result visual guidance in search.md when it clarifies the choice. Link the
Eval for browsing its history and the completed finalists Run for exploring the reported
results, following the app-link guidance in search.md. Include
remaining failures and validation limitations, and save the visual artifacts with the report.
Write report.md in the working folder (template in search.md) and
skill-bugs.md when the run is a test of this skill. Rename the champion
<slug> winner <timestamp> (<model + approach>) with workflows_update (it needs the full
config) only if you created it; never rename a pre-existing Workflow.
Checkpoint 4: cleanup. List every Workflow in created.json except the champion and ask
whether to delete them. Say that deletion is soft (workspace Trash, restorable for 30 days)
and that Runs keep a frozen snapshot of each candidate, so the report stays readable. Delete
by url slug (workflows_delete takes the slug). Offer separately to delete the Runs. Never
propose deleting a pre-existing Workflow, the Eval, the Spec, or the Dataset: the suite is
the durable asset. Close by telling the user that the suite reruns against any future
Workflow version in one Run, and that a production miss becomes a new example.
retry_failed per Run. If a joint Run is
rejected, split it in halves and retry once; then fall back to smaller Runs and note it.workflow_evals_get to read readiness; lists can be stale.roboflow/computer-vision-skills
ad4f5c6
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.