APM

>Agent Skill

@microsoft/ghqr-report

skilldevelopment

Generate an executive assessment report from GitHub Quick Review (ghqr) scan data. Produces an executive summary, a dedicated section per validated subject with all findings, and a prioritized 30/60/90-day remediation plan. Use when the user asks for a report, executive summary, best practices posture overview, or a remediation roadmap from ghqr scan results.

git
apm::install
$apm install @microsoft/ghqr-report
apm::skill.md
---
name: ghqr-report
description: Generate an executive assessment report from GitHub Quick Review (ghqr) scan data. Produces an executive summary, a dedicated section per validated subject with all findings, and a prioritized 30/60/90-day remediation plan. Use when the user asks for a report, executive summary, best practices posture overview, or a remediation roadmap from ghqr scan results.
---

# GitHub Quick Review — Executive Report Skill

Expert guidance for transforming ghqr scan JSON output into a structured executive report with findings by category and a prioritized 30/60/90-day remediation plan.

## Overview

This skill enables agents to:
- Trigger a ghqr scan (or consume an existing scan result) for an enterprise, organization, or repository
- Produce a polished executive summary with overall best practices posture and key KPIs
- Generate one dedicated section per validated category with its issues and recommendations
- Build a prioritized remediation roadmap split into 30, 60, and 90-day milestones

## When to Use This Skill

Trigger this skill when the user asks for:
- "Generate a report", "executive report", "best practices report", or "posture report"
- "Remediation plan", "action plan", "30/60/90 plan"
- "What are the findings from the ghqr scan?"
- "Show me the issues and how to fix them"

## Data Sources

The ghqr JSON output contains the following top-level structure:

```json
{
  "generated_at": "<RFC3339 timestamp>",
  "summary": { "total_scanned": N, "non_compliant": N, "by_severity": {} },
  "enterprises": {
    "<slug>": {
      "ghas_settings": {
        "advanced_security": "enabled|disabled|not_set",
        "secret_scanning": "enabled|disabled|not_set",
        "secret_scanning_push_protection": "enabled|disabled|not_set",
        "dependabot_alerts": "enabled|disabled|not_set",
        "dependabot_security_updates": "enabled|disabled|not_set",
        "dependency_graph": "enabled|disabled|not_set",
        "secret_scanning_non_provider_patterns": "enabled|disabled|not_set"
      },
      "evaluation": { "recommendations": [] }
    }
  },
  "organizations": {
    "<name>": {
      "settings": {
        "security": {
          "advanced_security_enabled_for_new_repos": true,
          "secret_scanning_enabled_for_new_repos": true,
          "secret_scanning_push_protection_enabled_for_new_repos": true,
          "dependabot_alerts_enabled_for_new_repos": true,
          "dependabot_security_updates_enabled_for_new_repos": true,
          "dependency_graph_enabled_for_new_repos": true
        }
      },
      "evaluation": { "recommendations": [] }
    }
  },
  "repositories":  { "<owner/name>": { "evaluation": { "recommendations": [] } } }
}
```

Each `evaluation` object contains:
- `recommendations[]`: all findings (both hard issues and advisory items), each with `severity`, `category`, `issue`, `recommendation`, and an optional `learn_more` URL

### Severity Levels
| Severity | Meaning |
|----------|---------|
| `critical` | Immediate risk, must fix now |
| `high`     | Serious gap, fix within 30 days |
| `medium`   | Important improvement, fix within 60 days |
| `low`      | Minor gap, fix within 90 days |
| `info`     | Advisory only |

### Categories Validated by ghqr
| Category | Description |
|----------|-------------|
| `security` | Enterprise GHAS policy defaults; org-wide secret scanning, push protection, and GHAS defaults for new repos; org-level open code scanning and secret scanning alerts |
| `branch_protection` | Branch rules, required reviews, status checks |
| `access_control` | Collaborator permissions, deploy keys, admin access |
| `copilot_security` | Public code suggestions, content exclusions |
| `copilot_cost` | Seat utilization, inactive seats |
| `copilot_features` | IDE chat, CLI, platform chat enablement |
| `copilot_models` | Allowed/blocked model configuration |
| `copilot_mcp` | MCP server policy |
| `copilot_extensions` | Extension allowlist |
| `actions` | Workflow permissions, allowed actions, SHA pinning |
| `community` | SECURITY.md, CODEOWNERS, contributing guidelines |
| `dependencies` | Enterprise/org Dependabot alert defaults for new repos; Dependabot security updates defaults; aggregate open Dependabot alerts by severity |
| `permissions` | Default repo permissions, member privileges |
| `deployment` | Environment protection rules |
| `maintenance` | Stale branches, archived repos, empty repos |
| `risk` | Repository criticality, public visibility |
| `features` | Advanced Security, wiki, issue tracker |

## Workflow

### Phase 1 — Acquire Scan Data

If the user provides a scan result file path or JSON, use it directly. Otherwise:

1. Use the `ghqr_scan` tool to run a new scan:
   - Pass `enterprises`, `organizations`, or `repositories` based on the user's scope
   - The tool returns a file URI pointing to the JSON output
2. Read the JSON output file to load the scan data

### Phase 2 — Build the Report

Produce the full report in Markdown following the **Report Template** below. Populate every section with real data from the scan; never invent findings.

### Phase 3 — Validate Completeness

Before delivering the report, verify:
- [ ] Executive summary reflects actual issue counts
- [ ] Every category with at least one finding has its own section
- [ ] Every issue listed in the scan appears somewhere in the report
- [ ] Each finding in the 30/60/90 plan maps directly to a scan issue or recommendation
- [ ] No findings are duplicated across plan phases

---

## Report Template

```markdown
# GitHub Assessment Report — [Enterprise/Organization/Repository Name]

**Scope:** [Enterprise / Organization / Repository]
**Generated:** [Date]
**Scan Coverage:** [N enterprises / N organizations / N repositories]

---

## Executive Summary

> One paragraph (4–6 sentences) for a non-technical audience. State the overall
> security posture, the number of critical and high findings, the biggest
> risk areas, and the top improvement opportunity.

### Posture Scorecard

| Entity | Type | Critical | High | Medium | Low | Info |
|--------|------|----------|------|--------|-----|------|
| [name] | org  | 0 | 2 | 3 | 1 | 4 |
| [repo] | repo | 1 | 1 | 2 | 0 | 2 |

### Overall Risk Distribution

| Severity | Count | % of Total |
|----------|-------|-----------|
| 🔴 Critical | N | X% |
| 🟠 High     | N | X% |
| 🟡 Medium   | N | X% |
| 🟢 Low      | N | X% |
| ℹ️ Info     | N | X% |

---

## Findings by Subject

<!-- Repeat this block for every category that has at least one issue or recommendation -->

### [Category Display Name]  <!-- e.g. "Security — Dependabot & Code Scanning" -->

**Risk Level:** [Critical / High / Medium / Low]  
**Affected Entities:** [list of org/repo names]

#### Findings

| Severity | Entity | Finding | Action | Learn More |
|----------|--------|---------|--------|------------|
| 🔴 Critical | org/repo | [issue text from scan] | [recommendation text] | [link from `learn_more`] |
| 🟠 High     | org/repo | [issue text] | [recommendation text] | [link from `learn_more`] |

#### Why This Matters

[2–3 sentences explaining the business/security risk of this category in plain language]

---

<!-- Categories with zero findings are omitted -->

---

## Remediation Plan

### 30-Day Sprint — Immediate Actions 🔴

> Address all **critical** and **high** severity issues. These represent the
> highest risk to your organization and should be resolved within the first month.

| Priority | Entity | Action | Category | Effort | Owner |
|----------|--------|--------|----------|--------|-------|
| 1 | [entity] | [specific fix] | [category] | [S/M/L] | [team] |
| 2 | [entity] | [specific fix] | [category] | [S/M/L] | [team] |

**Expected outcome:** [Risk reduction summary]

---

### 60-Day Sprint — High-Priority Improvements 🟠

> Address all **medium** severity issues and any high-effort critical/high fixes
> that couldn't be completed in the 30-day sprint.

| Priority | Entity | Action | Category | Effort | Owner |
|----------|--------|--------|----------|--------|-------|
| 1 | [entity] | [specific fix] | [category] | [S/M/L] | [team] |

**Expected outcome:** [Risk reduction summary]

---

### 90-Day Sprint — Strategic Hardening 🟡

> Address all **low** severity issues, implement process improvements, and
> establish ongoing governance controls.

| Priority | Entity | Action | Category | Effort | Owner |
|----------|--------|--------|----------|--------|-------|
| 1 | [entity] | [specific fix] | [category] | [S/M/L] | [team] |

**Expected outcome:** [Risk reduction summary]

---

## Manual Checks Required

The following security areas **cannot be verified automatically** via the GitHub
API and require manual review:

| Area | What to Check | Where |
|------|--------------|-------|
| Audit log streaming | Connected to SIEM | Enterprise → Settings → Audit log |
| Secret scanning alerts | Open critical alerts reviewed and resolved | Repo → Security → Secret scanning |
| Secret scanning: custom patterns | Org/enterprise-level custom patterns defined | Org → Settings → Code security → Secret scanning |
| Secret scanning: bypass requests | Bypass request reviewers configured for push protection | Org → Settings → Code security → Secret scanning |
| Code scanning: default setup | Default setup enabled on all active repos (no workflow required) | Repo → Settings → Code security → Code scanning |
| Code scanning: alert triage | Open high/critical code scanning alerts reviewed | Repo → Security → Code scanning |
| Code scanning: tool coverage | All relevant languages covered by a scanning tool | Repo → Security → Code scanning |
| Dependency review | dependency-review-action present in PR workflows | Repo → `.github/workflows/` |
| Actions: self-hosted runners | Present on public repos | Repo → Settings → Actions → Runners |
| Branch protection: enforce admins | Enabled | Repo → Settings → Branches |
| Environment protection rules | Reviewers configured | Repo → Settings → Environments |
| SAML SSO enforcement & SCIM | SSO enforced; SCIM provisioning active | Org → Settings → Authentication Security |
| IP Allow List | Configured and enabled | Org → Settings → Authentication Security |
| Org webhooks | SSL verification enabled, shared secret set on all hooks | Org → Settings → Webhooks |
| Org-level rulesets | At least one ruleset defined for repo governance | Org → Settings → Rules → Rulesets |

---

## Appendix — Full Issue List

### [Entity Name]

<details>
<summary>Expand all findings</summary>

| Severity | Category | Finding | Action | Learn More |
|----------|----------|---------|--------|------------|
| [sev] | [cat] | [issue] | [recommendation] | [learn_more URL as hyperlink, or blank if empty] |

</details>
```

---

## Category Display Name Mapping

When rendering category names in the report use these human-readable titles:

| Raw category | Display name |
|--------------|-------------|
| `security` | Security — Vulnerability Management |
| `branch_protection` | Branch Protection |
| `access_control` | Access Control & Permissions |
| `copilot_security` | GitHub Copilot — Security & Compliance |
| `copilot_cost` | GitHub Copilot — Cost & Seat Utilization |
| `copilot_features` | GitHub Copilot — Feature Enablement |
| `copilot_models` | GitHub Copilot — Model Policy |
| `copilot_mcp` | GitHub Copilot — MCP Configuration |
| `copilot_extensions` | GitHub Copilot — Extensions |
| `actions` | GitHub Actions — Workflow Security |
| `community` | Community Health & Documentation |
| `dependencies` | Dependency Management |
| `permissions` | Member & Repository Permissions |
| `deployment` | Deployment & Environment Controls |
| `maintenance` | Repository Maintenance |
| `risk` | Visibility & Risk Exposure |
| `features` | Advanced Security Features |

## Effort Sizing Guide

When populating the **Effort** column in the plan tables:

| Label | Definition |
|-------|-----------|
| S — Small | Single setting toggle or one-click configuration; < 1 hour |
| M — Medium | Requires creating a file, policy, or workflow; 1–4 hours |
| L — Large | Requires team coordination, design decision, or phased rollout; 1+ days |

## Output Requirements

The agent MUST:
1. **Always use real scan data** — never fabricate issues
2. **Include every category** that has at least one finding; skip categories with zero findings
3. **Map every finding to exactly one plan phase** based on its severity:
   - `critical` + `high` → 30-day sprint
   - `medium` → 60-day sprint
   - `low` + `info` → 90-day sprint
4. **Estimate effort** using S/M/L sizing for each action item
5. **List manual checks** that ghqr cannot automate (reference `references/MANUAL_CHECKS.md` categories)