Dora logo

Dora

Community
nitinjain999
dora

Measure, benchmark, instrument, and debug DORA metrics (Deployment Frequency, Lead Time for Changes, Change Failure Rate, MTTR) for production engineering teams. Covers GitHub Actions instrumentation, Prometheus recording rules, Grafana dashboards, incident source integration, SaaS tool selection, and anti-pattern detection. Use when asked to "instrument DORA metrics", "benchmark our deployment frequency", "why is my MTTR data missing", or "generate a DORA dashboard".

Overview

Publishernitinjain999
Repositoryplatform-skills
Skill namedora
Stars
71
Forks
14
Bundled files
Instructions only
LicenseApache-2.0
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by nitinjain999 on GitHub. Read the source before you install it.

Installation

Install the Dora AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/nitinjain999/platform-skills/tree/main/plugins/platform-skills/skills/dora
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/nitinjain999/platform-skills.git /tmp/platform-skills
mkdir -p .claude/skills
cp -r /tmp/platform-skills/plugins/platform-skills/skills/dora .claude/skills/dora
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Dora in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Dora on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Dora is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Measure, benchmark, and instrument DORA metrics for production engineering teams.

Mode: instrument

Add DORA event emission to a GitHub Actions workflow.

Steps:

  1. Identify which events to capture:

    • Deploy event: triggered on successful deployment to a target environment
    • Incident open event: triggered by PagerDuty/OpsGenie webhook when an incident is created
    • Incident close event: triggered when the incident is resolved
  2. Detect: does a Prometheus Pushgateway exist in the stack? If not, it must be deployed before instrumentation can work:

    bash
    kubectl get svc -A | grep pushgateway

    If absent, stop: Pushgateway is a prerequisite, and installing it into the user's cluster is their call, not this skill's. Give them a pinned install to run, then continue once the check above finds it:

    bash
    helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
    helm upgrade --install prometheus-pushgateway prometheus-community/prometheus-pushgateway \
      --version 3.9.1 \
      --namespace monitoring \
      --create-namespace
  3. Generate GitHub Actions steps for each event type:

    • Deploy event: push dora_deployment_timestamp and dora_lead_time_seconds to Pushgateway
    • Incident triggered (PagerDuty/OpsGenie webhook): push dora_incident_start_timestamp
    • Incident resolved: push dora_incident_duration_seconds and dora_incident_caused_by_deploy
  4. Output: exact YAML to append to the existing workflow, using the Pushgateway job name convention job/dora/instance/<repo-owner_repo-name>. Sanitize owner/repo → owner_repo to avoid breaking Pushgateway path segments.

    Example deploy event step:

    yaml
    - name: Push DORA deploy metrics
      if: success()
      env:
        PUSHGATEWAY_URL: ${{ secrets.PUSHGATEWAY_URL }}
        REPO: ${{ github.repository }}
      run: |
        DEPLOY_TS=$(date +%s)
        # Lead time from first commit in this batch — requires fetch-depth: 0 in checkout.
        FIRST_COMMIT_TS=$(git log --reverse --format="%ct" origin/main..HEAD | head -1)
        FIRST_COMMIT_TS=${FIRST_COMMIT_TS:-$DEPLOY_TS}
        LEAD_TIME=$((DEPLOY_TS - FIRST_COMMIT_TS))
        INSTANCE="${REPO//\//_}"
        curl --data-binary @- "${PUSHGATEWAY_URL}/metrics/job/dora/instance/${INSTANCE}" <<EOF
        # TYPE dora_deployment_timestamp gauge
        dora_deployment_timestamp{repo="${REPO}",env="production"} ${DEPLOY_TS}
        # TYPE dora_lead_time_seconds gauge
        dora_lead_time_seconds{repo="${REPO}",env="production"} ${LEAD_TIME}
        EOF
  5. Warn: Change Failure Rate requires incident source integration — a rate of 0% without incident data is a configuration gap, not a real metric. Never report 0% CFR without confirmed incident source connectivity.

Validation:

bash
# Confirm Pushgateway received the metric
curl -s http://pushgateway:9091/metrics | grep dora_deployment_timestamp

# Confirm Prometheus scraped it (allow up to 1 scrape interval, default 15s)
curl -s 'http://prometheus:9090/api/v1/query?query=dora_deployment_timestamp' \
  | jq '.data.result[0].value[1] // "not yet scraped — wait 15s and retry"'

Reference: references/dora.md → Open-source instrumentation pattern

Mode: dashboard

Generate a Grafana dashboard for all four DORA metrics.

Steps:

  1. Confirm the four recording rules are deployed before building the dashboard:

    • dora:deployment_frequency:rate30d
    • dora:lead_time_seconds:p50
    • dora:change_failure_rate:ratio30d
    • dora:mttr_seconds:p50

    Verify with:

    bash
    curl -s 'http://prometheus:9090/api/v1/query?query=dora:deployment_frequency:rate30d' | jq '.data.result[0].value[1] // "no data"'

    If any query returns no data, check the recording rule deployment — see references/dora.md for the full rule set.

  2. Dashboard structure: four panels arranged in a 2×2 grid, one per DORA metric:

    • Panel 1 — Deployment Frequency: stat + time-series, unit: deploys/day
    • Panel 2 — Lead Time for Changes: stat + time-series, unit: hours (p50)
    • Panel 3 — Change Failure Rate: stat + time-series, unit: percentage
    • Panel 4 — MTTR: stat + time-series, unit: hours (p50)

    Each panel includes DORA performance band overlays as threshold regions (Elite/High/Medium/Low). A time range selector provides 30/60/90 day views.

  3. Import the complete dashboard JSON from examples/dora/grafana-dashboard.json:

    bash
    # Import via Grafana API
    curl -s -X POST http://grafana:3000/api/dashboards/import \
      -H "Content-Type: application/json" \
      -d @examples/dora/grafana-dashboard.json
  4. Threshold values for each performance tier are embedded directly in the panel JSON as threshold bands. Update them in the panel thresholds field if your organisation uses different band definitions.

Reference: references/dora.md → DORA performance bands

Mode: benchmark

Classify current metric values against DORA performance bands.

Steps:

  1. Accept current metric values — either provided directly or queried from Prometheus:

    bash
    # Query current values
    curl -s 'http://prometheus:9090/api/v1/query?query=dora:deployment_frequency:rate30d' | jq '.data.result[0].value[1] // "no data"'
    curl -s 'http://prometheus:9090/api/v1/query?query=dora:lead_time_seconds:p50' | jq '.data.result[0].value[1] // "no data"'
    curl -s 'http://prometheus:9090/api/v1/query?query=dora:change_failure_rate:ratio30d' | jq '.data.result[0].value[1] // "no data"'
    curl -s 'http://prometheus:9090/api/v1/query?query=dora:mttr_seconds:p50' | jq '.data.result[0].value[1] // "no data"'
  2. Map each metric to Elite / High / Medium / Low using the 2023 DORA performance bands:

    MetricEliteHighMediumLow
    Deployment FrequencyMultiple/dayWeekly–monthlyMonthly–6 monthsLess than 6 months
    Lead Time for Changes< 1 hour1 day – 1 week1 week – 1 month> 1 month
    Change Failure Rate< 5%5–10%10–15%> 15%
    MTTR< 1 hour< 1 day1 day – 1 week> 1 week
  3. Identify the weakest metric — the one furthest from Elite — as the highest-leverage improvement target.

  4. Suggest the most impactful improvement for that specific metric:

    • Low Deployment Frequency → reduce batch size, increase CI automation coverage
    • High Lead Time → eliminate manual approval gates, parallelize test stages
    • High Change Failure Rate → add pre-deploy smoke tests, feature flag risky changes
    • High MTTR → improve alerting signal-to-noise, add runbook links to alerts
  5. Output: tier table + one-sentence recommendation per metric.

Reference: references/dora.md → DORA performance bands

Mode: debug

Diagnose gaps in DORA metric data.

Steps:

  1. Missing deployment events

    • Check: does the workflow step run on the correct trigger (on: push to main/release branch)?
      bash
      grep -A5 '^on:' .github/workflows/*.yaml
    • Check: can the runner reach the Pushgateway?
      bash
      curl http://pushgateway:9091/-/healthy
    • Check: is the Pushgateway scrape target present in Prometheus?
      bash
      curl -s http://prometheus:9090/api/v1/targets | jq '.data.activeTargets[] | select(.labels.job == "pushgateway")'
  2. Missing MTTR (or stuck at 0)

    • Check: is the PagerDuty/OpsGenie webhook configured to send to the incident listener?
    • Check: does the webhook payload include both incident start and end timestamps?
    • Check: is the GitHub Actions workflow triggered by repository_dispatch events for incident lifecycle?
      bash
      grep -r 'repository_dispatch' .github/workflows/
  3. Change failure rate is exactly 0%

    • Flag as anti-pattern: a CFR of 0% without confirmed incident source integration is a configuration gap, not a real measurement.
    • Check: is any incident source (PagerDuty, OpsGenie, Jira) connected and sending events?
    • Do not accept 0% CFR without evidence that the incident source is emitting resolved incident events.
  4. Metrics stop at a specific date

    • Check: Pushgateway retention — metrics expire after the configured push interval if not refreshed:
      bash
      kubectl describe pod -n monitoring -l app=prometheus-pushgateway | grep -i retention
    • Check: Prometheus scrape config still includes the Pushgateway target after any config reload.
    • Check: was the Pushgateway restarted without persistence? Metrics in memory are lost on restart — enable persistence with --persistence.file.

Reference: references/dora.md → Anti-pattern detection


After completing this task, log errors and learnings via /platform-skills:self-improve log.

Frequently asked questions

What does the Dora AI skill do?

Measure, benchmark, instrument, and debug DORA metrics (Deployment Frequency, Lead Time for Changes, Change Failure Rate, MTTR) for production engineering teams. Covers GitHub Actions instrumentation, Prometheus recording rules, Grafana dashboards, incident source integration, SaaS tool selection, and anti-pattern detection. Use when asked to "instrument DORA metrics", "benchmark our deployment frequency", "why is my MTTR data missing", or "generate a DORA dashboard".

Why use Dora on TypingMind?

Because you install it once and use it with any model. Dora is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Dora in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/nitinjain999/platform-skills/tree/main/plugins/platform-skills/skills/dora. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Dora?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Dora?

As many as you like. As long as a model supports skills, you can use Dora with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Dora AI skill free?

Yes. It is published on GitHub by nitinjain999 under the Apache-2.0 license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇