Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate, validate, normalise, and explain Mermaid-native bpmn-beta diagrams from a Process Narrative Specification. Use this skill when the user wants to convert a PNS or process notes into a visual diagram; when they ask for BPMN, a process flow, a swimlane diagram, or a workflow diagram; when they want to validate or repair existing bpmn-beta code; when they mention pools, lanes, gateways, tasks, events, or BPMN 2.0; when they want a Mermaid-native process model they can commit to a repo; whe
.claude/skills/okhp3-okhp3-visual-process-modeling/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 9 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | -62% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 75% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 87% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 40% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -29% | 0% |
OverKill Hill P³ · overkillhill.com · github.com/OKHP3
Generate a Mermaid-native bpmn-beta diagram from a validated PNS. The diagram uses the BPMN 2.0 Descriptive Conformance Sub-Class node set — tasks, gateways, events, message flows, pools, and lanes — expressed in the readable bpmn-beta DSL.
validation.ready_for_bpmn_modeling: truebpmn-beta codedecision-model-authoring for a DMN tableprocess-narrative-authoring first| PNS field | bpmn-beta element | |---|---| | activity_sequence.activities[] | Task nodes ([task label]) | | decision_points[] | Gateway nodes ({condition?}) | | exception_paths[] | Error/intermediate event paths | | roles_and_raci.roles[] | Lane labels | | process_box.trigger | Start event ((( ))) | | process_box.outputs[] consumer | End event or message flow | | Multiple departments | Pool blocks |
When the PNS has ≥3 decision_points, hand off to decision-model-authoring concurrently with diagram generation. The BPMN gateway labels must match the DMN rule IDs.
actor_role_id{condition?} for exclusive gateways; {+} for parallel--> for sequence flows; ~~> for message flows (top level only)(( start )) and ([ end ]) for process boundaries; ((! error )) for exception pathsscripts/validate-bpmn-beta.mjs; fix all errorsscripts/normalize-bpmn-beta.mjs for consistent whitespace and orderingscripts/lint-process-model.mjs for naming conventions and pool structurebpmn-beta
title Purchase Order Approval
pool Finance {
lane Requester {
(( start )) --> [Submit PO Request] --> {Approved?}
{Approved?} -- yes --> [Release to Vendor] --> ([ end ])
{Approved?} -- no --> [Return with Comments] --> ([ end ])
}
lane Finance Manager {
[Review PO Request] --> {Approved?}
}
}Rules:
bpmn-beta keyword opens the diagrampool Name { } groups lanes; omit for flat (single-lane) diagramslane Name { } defines a swimlane~~> must be at top level, outside pool/lane blocks} closes the most recently opened pool or lanescripts/validate-bpmn-beta.mjs <file.mmd> — schema and structural validationscripts/repair-bpmn-beta.mjs <file.mmd> — auto-fixes common structural errorsscripts/normalize-bpmn-beta.mjs <file.mmd> — normalises whitespace, IDs, and orderingscripts/lint-process-model.mjs <file.mmd> — naming convention and pool structure lintPass bpmn-beta.mmd to publication-and-handoff-packaging for bundle assembly. If ≥3 gateways, also pass pns.yaml to decision-model-authoring.
Load on demand:
references/bpmn-beta-syntax.md — complete bpmn-beta DSL keyword reference, element types, and flow operator rulesscripts/validate-bpmn-beta.mjs — structural and schema validationscripts/normalize-bpmn-beta.mjs — whitespace and ordering normalisationscripts/repair-bpmn-beta.mjs — auto-repair for common structural errorsscripts/lint-process-model.mjs — naming and pool structure lintassets/fixtures/process-model-example.yaml — metadata fixture for a purchase-approval bpmn-beta diagramBuilt by Jamie Hill · OverKill Hill P³ Published at github.com/OKHP3 Part of the OKHP3/skillz Agent Skill library. MIT License -- free to use, fork, and adapt. A nod to the source is appreciated.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-04 | pass→pass | 14,582 | 10,075 | -31% | 1 | 1 | 0% | 2,309 | 3,094 | +34% | 0 | 0 | — |
case-05 | fail→pass | 26,254 | 6,107 | -77% | 1 | 1 | 0% | 6,188 | 2,335 | -62% | 0 | 0 | — |
case-06 | fail→pass | 10,044 | 8,000 | -20% | 1 | 1 | 0% | 1,739 | 3,044 | +75% | 0 | 0 | — |
case-07 | fail→pass | 8,684 | 8,171 | -6% | 1 | 1 | 0% | 1,521 | 2,846 | +87% | 0 | 0 | — |
case-01 | fail→pass | 12,779 | 10,340 | -19% | 1 | 1 | 0% | 2,424 | 3,394 | +40% | 0 | 0 | — |
case-02 | fail→pass | 22,165 | 10,875 | -51% | 1 | 1 | 0% | 4,945 | 3,524 | -29% | 0 | 0 | — |
case-03 | fail→pass | 3,587 | 8,842 | +147% | 1 | 1 | 0% | 322 | 2,327 | +623% | 0 | 0 | — |
case-08 | fail→pass | 9,626 | 3,754 | -61% | 1 | 1 | 0% | 1,374 | 2,012 | +46% | 0 | 0 | — |
case-09 | pass→pass | 5,733 | 4,421 | -23% | 1 | 1 | 0% | 1,026 | 2,071 | +102% | 0 | 0 | — |
case-10 | fail→pass | 7,468 | 5,364 | -28% | 1 | 1 | 0% | 1,200 | 2,207 | +84% | 0 | 0 | — |
case-11 | fail→pass | 13,024 | 5,751 | -56% | 1 | 1 | 0% | 2,051 | 2,155 | +5% | 0 | 0 | — |
case-12 | fail→pass | 7,140 | 2,776 | -61% | 1 | 1 | 0% | 1,362 | 1,790 | +31% | 0 | 0 | — |
case-13 | fail→pass | 3,302 | 4,574 | +39% | 1 | 1 | 0% | 497 | 1,995 | +301% | 0 | 0 | — |
case-14 | fail→pass | 10,335 | 3,891 | -62% | 1 | 1 | 0% | 1,770 | 1,889 | +7% | 0 | 0 | — |
case-15 | fail→pass | 21,372 | 3,702 | -83% | 1 | 1 | 0% | 2,291 | 1,746 | -24% | 0 | 0 | — |
case-16 | fail→pass | 6,947 | 2,360 | -66% | 1 | 1 | 0% | 1,176 | 1,655 | +41% | 0 | 0 | — |
case-17 | fail→pass | 8,142 | 2,176 | -73% | 1 | 1 | 0% | 1,346 | 1,700 | +26% | 0 | 0 | — |
case-18 | pass→pass | 6,346 | 1,721 | -73% | 1 | 1 | 0% | 939 | 1,576 | +68% | 0 | 0 | — |
case-19 | pass→pass | 8,583 | 5,321 | -38% | 1 | 1 | 0% | 1,654 | 1,844 | +11% | 0 | 0 | — |
case-20 | fail→pass | 7,087 | 2,978 | -58% | 1 | 1 | 0% | 1,210 | 1,847 | +53% | 0 | 0 | — |
case-21 | pass→pass | 6,468 | 2,544 | -61% | 1 | 1 | 0% | 980 | 1,700 | +73% | 0 | 0 | — |
case-22 | fail→pass | 12,762 | 6,012 | -53% | 1 | 1 | 0% | 2,086 | 2,359 | +13% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +77 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.