Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when migrating any Operate page from operate/client/ to the orchestration cluster webapp. Always read frontend-migrator first — this skill adds Operate-specific overrides, the migration loop protocol, and page-by-page context.
.claude/skills/camunda-frontend-operate-migrator/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-25 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 15% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 49% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -8% | 0% |
The entry point for porting a page from operate/client/ to webapp/client/apps/orchestration-cluster-webapp/src/operate/.
Conventions for both codebases — routing, data fetching, state, styling, testing, forms — live in operate-frontend. Read it first. This skill covers only what is specific to the act of migrating: the page inventory, store decomposition, fidelity proof, and the ticket-driven loop. It is deleted when the migration completes.
Page list, status, and per-PR breakdown live in GitHub: camunda/experience-pdp#32 → page → coherent implementation issue. Maximum depth is 2 below the epic (epic = 0, page = 1, implementation = 2). Cross-cutting implementation issues may sit directly under the epic. Do not add intermediate feature trackers or children beneath an implementation issue. #51305 tracks broader cross-component dependencies. Source path, target route, and fidelity scope live in the tickets — query live rather than caching status here.
What already exists is whatever is in webapp/client/apps/orchestration-cluster-webapp/src/operate/pages/ and src/routes/_carbon/_auth/operate/ — read those directories before adding or splitting routes, and do not recreate a shell from a historical ticket.
Operate has ~20 legacy stores. Most are transient UI state and do not need porting. Map each one:
| Store | What it holds | Target | | ------------------------------- | ------------------------------ | -------------------------------------------------------------- | | authentication.ts | Session | Already in #/shared/auth/ — reuse | | currentTheme.ts | Theme preference | Already in #/shared/theme/ — reuse | | notifications.tsx | Toast queue | #/shared/notifications/notifications.store — reuse | | variableFilter.ts | Filter inputs on Processes | URL search params via validateSearch | | incidentsPanelFiltersStore.ts | Filter inputs on Incidents tab | URL search params | | instancesSelection.ts | Selected rows | useState in the page component | | panelStates.ts | Panel open/collapsed | useState | | dateRangePopover.ts | Calendar open/close | useState | | executionCountToggle.ts | Toggle state | useState | | batchModification.ts | Batch operation in progress | useState | | diagramOverlays.ts | Diagram overlay data | useState in the BPMN component | | processInstanceMigration.ts | Migration wizard state | useState + URL params for the step | | modifications.ts | Pending variable modifications | useState + local reducer — or keep MobX if genuinely complex | | networkReconnectionHandler.ts | Connectivity polling | Standalone hook with useEffect |
An explicit /frontend-operate-migrator <ticket-number> request runs operate-engineering-loop. Its execution authorization, preparation, validation, publication, review budgets, and completion gate apply. This skill adds only the migration-specific requirements below.
During preparation and implementation:
beneath the page when given a tracker. Check explicit product or deployment approval gates. Follow the surviving issue's complete scope, not an obsolete split plan — superseded specifications are archived through links, not child relationships.
alone. Tracking is an intentional omission.
tests and locales. Keep tightly coupled UI, data loading, mutations, recovery and coverage together. The limit is a ceiling, not a target: don't pad small changes or bundle unrelated work. Split only when the complete change exceeds the cap or has an independently useful boundary, and record sibling implementation issues directly under the page.
Dependency edges describe real required contracts or acceptance gates, not chronology. Don't block on already-delivered prerequisites, superseded trackers, ancestors, or redundant transitive prerequisites. Keep independent work parallel, and give shared state/selection/host contracts one explicit owner.
For migration hierarchy queries, use: gh issue view 32 --repo camunda/experience-pdp --json title,body,state, gh api --paginate repos/camunda/experience-pdp/issues/32/sub_issues, gh issue view <n> --repo <owner/repo> --json title,body,state, gh api --paginate repos/<owner/repo>/issues/<n>/sub_issues, gh pr list --repo camunda/camunda --search "<page>". Follow each child's own repository URL rather than assuming the parent's. GitHub's child-completion percentage counts closed issues including not-planned ones; it is not evidence that implementation shipped.
Run after the engineering loop's edit tier and before its component tier, scoped to the just-ported component — not across the whole operate/ directory, or you will flag not-yet-ported features.
Deterministic (script, always trusted). Run from the repo root — the script and its default locales path are repo-root relative, not webapp/client:
bashnode .claude/skills/frontend-operate-migrator/scripts/fidelity.mjs --ported <ported-component-dir>
It checks locale coverage: every t('operate.*') key exists in en/de/fr/es. Non-zero exit is a gate failure — fix before continuing.
Independent behavior-fidelity review (LLM flagger — flag, never approve). Spawn a fresh read-only frontend review agent. Give it the ticket, acceptance matrix, exact legacy source, migrated source, and diff. Its only task is an evidence-backed legacy → migrated list covering:
target shared equivalent and reuse it. If none exists, port it once to the appropriate shared owner rather than making per-consumer copies.
behavior the port adds, drops or alters. Ignore tracking-only differences.
A script saying "key X missing from de.json" is trusted; an LLM saying "looks faithful" is not. The implementing agent adjudicates findings using the engineering loop's independent-review rules and 3-iteration budget. Repeat until no unexplained observable difference remains, or report the exact blocker at the cap. Escalate genuine product ambiguity; never invent behavior to make the review pass. This fidelity review supplements, rather than replaces, the engineering loop's two reviews.
feat: migrate Operate <PageName> page to unified app.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-18 | pass→pass | 35,452 | 9,184 | -74% | 1 | 1 | 0% | 1,453 | 2,103 | +45% | 0 | 0 | — |
case-19 | pass→pass | 28,977 | 8,457 | -71% | 1 | 1 | 0% | 1,740 | 2,027 | +16% | 0 | 0 | — |
case-25 | fail→pass | 15,377 | 29,354 | +91% | 1 | 1 | 0% | 1,924 | 3,830 | +99% | 0 | 0 | — |
case-07 | fail→pass | 17,403 | 3,130 | -82% | 1 | 1 | 0% | 1,793 | 2,069 | +15% | 0 | 0 | — |
case-01 | fail→fail | 17,915 | 19,494 | +9% | 1 | 1 | 0% | 233 | 2,095 | +799% | 0 | 0 | — |
case-17 | pass→pass | 19,538 | 6,512 | -67% | 1 | 1 | 0% | 2,008 | 2,246 | +12% | 0 | 0 | — |
case-02 | fail→fail | 72,445 | 27,101 | -63% | 1 | 1 | 0% | 6,107 | 5,175 | -15% | 0 | 0 | — |
case-03 | fail→fail | 9,007 | 33,850 | +276% | 1 | 1 | 0% | 1,354 | 2,179 | +61% | 0 | 0 | — |
case-04 | fail→pass | 15,506 | 7,632 | -51% | 1 | 1 | 0% | 1,442 | 2,146 | +49% | 0 | 0 | — |
case-05 | fail→pass | 18,041 | 5,167 | -71% | 1 | 1 | 0% | 1,976 | 2,489 | +26% | 0 | 0 | — |
case-06 | fail→pass | 20,649 | 8,415 | -59% | 1 | 1 | 0% | 2,315 | 2,137 | -8% | 0 | 0 | — |
case-08 | fail→pass | 14,883 | 6,812 | -54% | 1 | 1 | 0% | 2,184 | 2,141 | -2% | 0 | 0 | — |
case-09 | pass→pass | 20,939 | 4,657 | -78% | 1 | 1 | 0% | 2,291 | 2,289 | -0% | 0 | 0 | — |
case-10 | fail→pass | 46,257 | 9,944 | -79% | 1 | 1 | 0% | 2,662 | 2,304 | -13% | 0 | 0 | — |
case-11 | fail→fail | 26,475 | 18,143 | -31% | 1 | 1 | 0% | 3,293 | 3,497 | +6% | 0 | 0 | — |
case-12 | pass→fail | 23,612 | 24,502 | +4% | 1 | 1 | 0% | 2,727 | 2,531 | -7% | 0 | 0 | — |
case-13 | fail→pass | 9,134 | 9,680 | +6% | 1 | 1 | 0% | 1,402 | 2,349 | +68% | 0 | 0 | — |
case-14 | fail→pass | 13,390 | 7,915 | -41% | 1 | 1 | 0% | 1,298 | 2,071 | +60% | 0 | 0 | — |
case-15 | pass→pass | 14,978 | 4,820 | -68% | 1 | 1 | 0% | 902 | 2,000 | +122% | 0 | 0 | — |
case-16 | pass→pass | 54,293 | 9,677 | -82% | 1 | 1 | 0% | 2,360 | 2,049 | -13% | 0 | 0 | — |
case-20 | fail→fail | 35,377 | 9,074 | -74% | 1 | 1 | 0% | 2,438 | 2,100 | -14% | 0 | 0 | — |
case-21 | fail→pass | 21,577 | 8,323 | -61% | 1 | 1 | 0% | 2,342 | 2,069 | -12% | 0 | 0 | — |
case-22 | fail→pass | 19,378 | 8,433 | -56% | 1 | 1 | 0% | 1,961 | 2,012 | +3% | 0 | 0 | — |
case-23 | fail→fail | 22,016 | 24,958 | +13% | 1 | 1 | 0% | 2,927 | 3,433 | +17% | 0 | 0 | — |
case-24 | fail→fail | 24,818 | 19,380 | -22% | 1 | 1 | 0% | 3,401 | 4,213 | +24% | 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. 25 cases were attempted, and 23 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +40 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
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.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 9/9/2026 | +45% |
| gemini-3.6-flash | verified | 8/10/2026 | +55% |
Other measured skills in the registry, with their headline benchmark lift.