team-eo-emp
Skills for the Employee Organization team at Personio — weekly ops review reporting and code quality workflows.
Installation
claude plugin install team-eo-emp@personio-claude-code-marketplace
What does this plugin do?
Shared engineering skills contributed by the Employee Organization team. Ships emp-ops-review for weekly ops review reporting, remove-flag for end-to-end feature flag removal, test-lint for repo-aware test/lint runs, reviewer-roulette for picking random PR reviewers, scope-discipline for keeping task scope under control, and detect-language as an internal sub-skill for language detection.
emp-ops-review
Generate the weekly EMP Operational Review report — data gathered automatically from Datadog, Jira, and the SDLC security API, saved as a Confluence draft ready for the Firefighter to review and publish.
What you need:
- Atlassian MCP plugin installed and authenticated (
claude plugin install atlassian@claude-plugins-official, then/mcp→plugin:atlassian:atlassian→ Authenticate). Start a fresh session after authenticating. - claude.ai Datadog MCP server authenticated via
/mcp→claude.ai Datadog→ Authenticate. Uses OAuth — no CLI or VPN required for Datadog access. Start a fresh session after authenticating. - Personio VPN connected (required for the SDLC security metrics endpoint).
Quick Start:
# Default — last 7 days
/emp-ops-review
# Specific week
/emp-ops-review April 14 to April 21
Example:
It's Monday morning and you were Firefighter last week. You want to prep the ops review before the team meeting.
/emp-ops-review
The skill will:
- Ask for your name and any observations from your firefighting week that won't show up in dashboards
- Verify connectivity to Atlassian, Datadog, and the SDLC security API
- Collect open alerts, noisy monitors, SLO breaches, error rates, availability, incidents, postmortem action items, security findings, and E2E/flaky test stats — all in parallel
- Assemble findings into the standard EMP report format, ordered by priority (SLO breaches first, security second, etc.)
- Save a draft Confluence child page under the EMP Operational Review page for your review
- Publish once you confirm the draft looks good
Why would you want this?
- Saves 30–60 minutes every week: no manual Datadog dashboard checks, Jira queries, or security API calls — all automated
- Nothing slips through: covers open alerts, noisy monitors, SLO breaches, availability, incidents, postmortem actions, security findings, and E2E test health in one pass
- Priority-ordered: report follows the meeting agenda so the most critical items are always at the top
- Draft-first: you review and add your human context before it goes live on Confluence
remove-flag
End-to-end feature flag removal — from creating a branch to opening a draft PR, with a cubic AI code review in between.
What you need:
ghCLI installed and authenticated (gh auth status)cubicCLI installed and authenticated (cubic auth) — the skill will tell you how to install it if missing- A Personio repo on the
masterbranch
Note: The skill contains PHP and TypeScript reference files for flag patterns in the Personio monolith and web monorepo. It will stop with a clear message if you run it in a Kotlin or other repo where a reference file is missing.
Quick Start:
/remove-flag EMP-2850-my-feature-flag
Example:
You've just confirmed that EMP-2986-first-last-names-not-empty is 100% rolled out and ready to be cleaned up.
/remove-flag EMP-2986-first-last-names-not-empty
The skill will:
- Create branch
remove-flag-EMP-2986-first-last-names-not-emptyfrommaster - Search the codebase for every reference to the flag and ask you which path to keep (enabled or disabled)
- Dispatch a Sonnet agent to remove all call sites, inline the kept value, and follow boolean pass-throughs
- Run linting and fix any new lint issues
- Run
cubic reviewand fix any correctness issues (surfacing opinion-based feedback for your review) - Commit and push the branch
- Open a draft PR — automatically adding the original flag author as a reviewer
Why would you want this?
- Removes the boring parts: finding every call site, inlining values, tracing boolean pass-throughs, cleaning up dead tests, running lint, running cubic, opening the PR — all automated
- Safe: planning phase shows you what will change and asks for your confirmation before touching any files
- Correct PR setup: automatically assigns you and adds the flag's original author as reviewer
- Cubic-reviewed before it lands: fixes correctness issues immediately; surfaces style preferences for your consideration
test-lint
Run tests and linting for the current Personio repository. Detects the language automatically (PHP monolith, TypeScript web monorepo) and delegates to the right tooling.
What you need:
- For PHP: be inside the Personio monolith with
monolith-clipresent - For TypeScript: be inside the Nx monorepo with
pnpmandnx.jsonpresent
Quick Start:
# Run both tests and lint
/test-lint
# Lint only
/test-lint lint
# Tests only
/test-lint tests
Why would you want this?
- Single command for any supported repo: no need to remember
mc lintvspnpm nx affected --target=lint - Language-aware fix guidance: when lint fails, the skill tells you exactly which autofix command to run and what suppression policy applies
- Used by
remove-flagautomatically: the flag removal workflow calls this skill to ensure no new lint issues are introduced
reviewer-roulette
Pick 2 random eligible reviewers for an EMP-team PR. Auto-detects the repo type, excludes the PR author and existing reviewers, drops anyone inactive in Backstage or with an all-day OOO event today, and prints a ready-to-run gh pr edit command. Pass --automatic-create to skip the suggestion step and assign the reviewers immediately.
What you need:
ghCLI installed and authenticated, run from a Personio repo. Repo type is detected via thedetect-languagesub-skill: PHP/Kotlin → backend pool, TypeScript → UI poolyqandjqavailable locally- claude.ai Google Calendar MCP server authenticated for the OOO check (skill still works without it — candidates are treated as available on auth errors)
Quick Start:
# Pick reviewers for the open PR on the current branch
/reviewer-roulette
# Pick reviewers for a specific PR (number or URL)
/reviewer-roulette 4521
# Add manual extras alongside the random picks
/reviewer-roulette also include carol_personio
# Pick and assign immediately (skip the confirm-and-run step)
/reviewer-roulette --automatic-create
Why would you want this?
- Fair rotation: random selection from a maintained EMP pool, biased only by exclusions (author, existing reviewers, inactive employees, today's OOO)
- Repo-aware: backend PRs draw from the backend pool, UI PRs from the UI pool — no need to remember who works on what
- Safe by default: only prints the suggested
gh pr editcommand; you confirm before assigning. Pass--automatic-createto run the assignment in one step
scope-discipline
Keeps task scope under control. When you (or Claude) spots improvements beyond what was asked, this skill helps decide: do it now or note it for later.
What you need:
No prerequisites — works in any repository.
Quick Start:
Invoke it when you're tempted to do more than asked:
I noticed the UserService has duplication I could fix while I'm here — should I?
Example:
You're removing a feature flag and you notice five surrounding methods could also be cleaned up:
"While removing this flag I noticed some duplication in the payment flow — should I refactor it?"
The skill will tell you to note it in a ## Follow-up suggestions section and not act on it now.
Why would you want this?
- Prevents scope creep: distinguishes between unavoidable cleanup (in scope) and "while I'm here" additions (out of scope)
- Structured output: out-of-scope findings go into a
## Follow-up suggestionssection, not the implementation - Red-flag reminders: surfaces the classic rationalisation patterns ("it's only small", "it would be weird not to fix this") so you catch them before acting
detect-language (internal sub-skill)
Detects the primary language of the current repository by checking for marker files (composer.json → PHP, build.gradle → Kotlin, package.json → TypeScript). Returns LANGUAGE and REFERENCE_FILE for use by calling skills.
Not intended for direct user invocation — called programmatically by other skills that need to load language-specific reference material.