create-workflow-from-diagram — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited create-workflow-from-diagram (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill converts a workflow diagram into a runnable Dapr workflow project. Two input paths are supported:
.bpmn, .bpmn20.xml) — parses the XML deterministicallyBoth paths produce the same intermediate representation (IR, JSON Lines) defined in prompts/ir-schema.md — records keyed by __type (metadata, participant, activity, gateway, start_end_node, edge, …, ending with result + end_of_ir_stream). Every prompts/languages/<lang>.md prompt renders code from that one IR.
You MUST follow these phases in strict order:
prompts/ir-schema.md.prompts/ir-schema.md (Steps 4–6 and "Consuming the IR"); resolve open questions with the user.prompts/languages/<lang>.md.## Show final message: the closing sentence followed by the Dev Dashboard recommendation. Do NOT add any other text, summary, or commentary.You need three things. Ask at most three clarifying questions, interview-style, only for items not already provided:
.bpmn / .bpmn20.xml file. If the user pasted the image directly into the chat, use that.go, python, csharp, javascript, java. Default: python.<bpmn:process @id> or image filename.The following must be installed by the user before running the generated project:
## Check optional tools); it never installs it and never stops without it.Plus the language toolchain for the chosen target. See the matching ../dapr-shared/prereq-check-*.md for the full list.
The skill does not auto-install anything and does not run builds: no uv sync, npm install, dotnet restore / build, go mod tidy or mvn, and no remote downloads (the .gitignore is written locally). The generated project's README tells the user what to install and run. These rules override the install and download steps of the create-workflow-* conventions this skill reuses.
Check once whether the optional Diagrid Dapr Dev Dashboard is installed by following the Check section of ../dapr-shared/dev-dashboard.md (diagrid-dev-dashboard --version). Remember the result (DevDashboardInstalled) for the final message. This check never stops the skill: do not ask the user about it, do not install anything, and continue with the next step whether or not the dashboard is installed.
Decide the path:
.png, .jpg, .jpeg, .gif, .webp, or pasted image → image path.bpmn, .bpmn20.xml, or XML file containing http://www.omg.org/spec/BPMN/20100524/MODEL namespace → BPMN pathprompts/guardrails.md — these apply to all output.prompts/system-prompt.md — this is the persona + directives.prompts/ir-schema.md — this is the full IR grammar, step-by-step extraction procedure (Step 0 content check → Step N emit records), and field definitions.content_warning record (schema Step 0) and stop.error record with check_id DIAGRAM_TYPE_VALIDATION or DIAGRAM_COMPLEXITY_ABOVE_THRESHOLD (schema Step 1), show its user_feedback to the user, and stop.unrecognized_item records with ask_user: true (schema Step 2F). Never add an edge that is not drawn.prompts/guardrails.md.prompts/bpmn-to-ir.md — deterministic BPMN-element → IR-record mapping.prompts/ir-schema.md for the IR grammar..bpmn XML. Emit IR as JSON Lines following the mapping table — same __type records, same content_warning / error / result / end_of_ir_stream records as the image path.bpmn-to-ir.md) → emit unrecognized_item records (category: "unsupported_element"); do not silently drop.Write the IR (without system progress records) to <ProjectRoot>/.workflow.ir.jsonl for reference — except when the stream is a content_warning, in which case write nothing. examples/order-process.ir.jsonl shows a complete valid stream.
prompts/ir-schema.md). content_warning or a Step 1 error → stop without writing code. result with success: false → go to step 3. Only end_of_ir_stream after result success: true continues.result:start_end_node with type: "start" (or a trigger wait_for_event activity) and at least one end node (type end, end_error or end_terminate).edge.from / edge.to, gateway flows[].next and wait events[].next references an existing activity, gateway or start_end_node id.activity, gateway, start node, end node or event without edges (CONNECTIVITY).activity, gateway and start_end_node — including every end node and every intermediate event — is reachable from a start node, following edge records and failure_handling links (REACHABILITY).metadata.feedback_required is true: report each failed check_id / each unrecognized_item with ask_user: true to the user in plain language, ask how to resolve it, and do not continue to Phase 3 until it is resolved. Apply the answers to the IR (or rerun Phase 1 with an adjusted diagram), then run Phase 2 again. Never add an undrawn edge without the user's confirmation.prompts/languages/<lang>.md — this defines the target-language Dapr Workflow patterns, file layout, and code conventions, and (under "Reading the IR") the SDK call for each IR construct. Language slugs: go | python | csharp | javascript | java. The record → construct mapping itself is the "Consuming the IR" table in prompts/ir-schema.md, shared by all languages.prompts/code-quality-judge.md for a self-critique pass after initial generation.prompts/final-turn-prettifier.md for final cleanup.prompts/languages/<lang>.md.TODO: implement actual functionality comment inside an activity body whose behaviour the diagram does not describe (see prompts/guardrails.md, "Output hygiene").Use the conventions defined in prompts/languages/<lang>.md. Typical shape:
<ProjectRoot>/
├── .gitignore
├── dapr.yaml
├── resources/
│ └── statestore.yaml
├── <ProjectName>/
│ ├── workflow.(py|go|cs|ts|java)
│ ├── activities.(py|go|cs|ts|java)
│ └── models.(py|go|cs|ts|java)
├── README.md
└── .workflow.ir.jsonl # persisted IR from Phase 1Python-specific layout matches create-workflow-python (pyproject.toml, runtime.py, main.py); see that skill's SKILL.md and REFERENCE.md if you want deeper structure parity. This skill focuses on the diagram → IR → code transform, not on language-specific project scaffolding — keep the generated code minimal and runnable.
Create a README.md in <ProjectRoot> containing:
metadata record's name and description).dapr run -f . from <ProjectRoot> (picks up dapr.yaml).unrecognized_item from the IR (if any).../dapr-shared/dev-dashboard.md: why it is useful, the install command for each OS (macOS / Linux and Windows) and the run command (diagrid-dev-dashboard, http://localhost:9090).review-workflow-determinism, review-workflow-activity and review-workflow-management skills to audit the generated code.See ../dapr-shared/running-locally-dapr.md and ../dapr-shared/running-with-catalyst.md in this repo for snippets to include.
IMPORTANT: This is the LAST step. After Create README.md, your final output MUST be ONLY the message below followed by the Dev Dashboard recommendation — no preamble, no summary, no additional commentary. Replace `<ProjectRoot>` with the actual value:
The <ProjectRoot> workflow application is created from the diagram. Open the README.md file in the <ProjectRoot> folder for a summary and instructions for running locally. The extracted IR is stored at <ProjectRoot>/.workflow.ir.jsonl for reference.
Then add, as a separate paragraph, the block from the Final recommendation section of ../dapr-shared/dev-dashboard.md that matches DevDashboardInstalled (installed → start it; not installed → install it). Use it as written, including the link and the commands. Nothing may follow it.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.