Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
ce5bcf8
Add release-notes-writer skill for generating changelogs between Skia…
mattleibow Apr 26, 2026
994b572
Add upstream engine benefits extraction to release-notes-writer skill
mattleibow Apr 26, 2026
bd03935
Add impact scoring to skia-feature-scout skill
mattleibow Apr 27, 2026
ba8b3fe
Make impact required on feature-scout findings
mattleibow Apr 27, 2026
5a028cc
Add sample-scout skill for discovering Gallery demo opportunities fro…
mattleibow Apr 27, 2026
6df292b
Add group-by/sort-by with direction toggles to sample-scout viewer
mattleibow Apr 27, 2026
c5f3041
Fix sample-scout viewer data injection (double-bracket bug)
mattleibow Apr 27, 2026
3458fd8
Add 'Copy Prompt' button to sample-scout viewer
mattleibow Apr 27, 2026
729d80d
Enrich sample-scout with gallery-ready fields and zero-placeholder pr…
mattleibow Apr 27, 2026
053d96d
Make gallery-ready fields required, remove fallbacks
mattleibow Apr 27, 2026
55723f8
Replace skia-feature-scout and release-notes-writer with unified skia…
mattleibow Apr 29, 2026
6f8cd9c
Clean up skia-analyst: markdown output, remove HTML viewer, update so…
mattleibow Apr 29, 2026
2de8850
Focus skia-analyst on findings only, drop slides/changelog/nextSteps
mattleibow Apr 29, 2026
1bb3a54
Fix all blocking issues from second review round
mattleibow Apr 29, 2026
68e7087
Add daily skia-analyst agentic workflow
mattleibow Apr 29, 2026
5d1eb7c
Rewrite skia-analyst workflow using report pattern from gh-aw docs
mattleibow Apr 29, 2026
7ced523
Fix blocking issues in skia-analyst workflow
mattleibow Apr 29, 2026
5269dd6
Hardcode ### headers in renderer instead of --header-offset flag
mattleibow Apr 29, 2026
062e0f6
Simplify workflow: delegate to skill, don't duplicate instructions
mattleibow Apr 29, 2026
8e6507f
Remove render step from workflow — skill already does it
mattleibow Apr 29, 2026
6e5cb6e
Add sample-scout weekly workflow and Markdown renderer
mattleibow Apr 29, 2026
2db151f
Fix all review findings across skills and workflows
mattleibow Apr 29, 2026
c4b4481
Remove over-engineered skip-phase and trim-rule instructions
mattleibow Apr 29, 2026
9b5371f
Use gh api instead of raw.githubusercontent.com for release notes fetch
mattleibow Apr 29, 2026
5948e5e
Remove HTML scripts from sample-scout, clean up validator
mattleibow Apr 29, 2026
503840a
Rename render-sample-scout-md.py → render-sample-scout.py
mattleibow Apr 29, 2026
834283a
Fix stale references after rename and HTML removal
mattleibow Apr 29, 2026
ff0113c
Fix final review findings: schema/prompt mismatch, base64, stale names
mattleibow Apr 29, 2026
c2323ce
Fix GPT review findings: validator JSON error handling, /tmp paths
mattleibow Apr 29, 2026
51f0a73
Move agentic-workflows agent to .agents/agents/
mattleibow Apr 29, 2026
d8bfdfc
Compile agentic workflows (gh aw compile)
mattleibow Apr 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Workflows may optionally include:
- Workflow files: `.github/workflows/*.md` and `.github/workflows/**/*.md`
- Workflow lock files: `.github/workflows/*.lock.yml`
- Shared components: `.github/workflows/shared/*.md`
- Configuration: https://github.com/github/gh-aw/blob/v0.68.3/.github/aw/github-agentic-workflows.md
- Configuration: https://github.com/github/gh-aw/blob/v0.71.1/.github/aw/github-agentic-workflows.md

## Problems This Solves

Expand All @@ -52,7 +52,7 @@ When you interact with this agent, it will:
### Create New Workflow
**Load when**: User wants to create a new workflow from scratch, add automation, or design a workflow that doesn't exist yet

**Prompt file**: https://github.com/github/gh-aw/blob/v0.68.3/.github/aw/create-agentic-workflow.md
**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.1/.github/aw/create-agentic-workflow.md

**Use cases**:
- "Create a workflow that triages issues"
Expand All @@ -62,7 +62,7 @@ When you interact with this agent, it will:
### Update Existing Workflow
**Load when**: User wants to modify, improve, or refactor an existing workflow

**Prompt file**: https://github.com/github/gh-aw/blob/v0.68.3/.github/aw/update-agentic-workflow.md
**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.1/.github/aw/update-agentic-workflow.md

**Use cases**:
- "Add web-fetch tool to the issue-classifier workflow"
Expand All @@ -72,7 +72,7 @@ When you interact with this agent, it will:
### Debug Workflow
**Load when**: User needs to investigate, audit, debug, or understand a workflow, troubleshoot issues, analyze logs, or fix errors

**Prompt file**: https://github.com/github/gh-aw/blob/v0.68.3/.github/aw/debug-agentic-workflow.md
**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.1/.github/aw/debug-agentic-workflow.md

**Use cases**:
- "Why is this workflow failing?"
Expand All @@ -82,7 +82,7 @@ When you interact with this agent, it will:
### Upgrade Agentic Workflows
**Load when**: User wants to upgrade workflows to a new gh-aw version or fix deprecations

**Prompt file**: https://github.com/github/gh-aw/blob/v0.68.3/.github/aw/upgrade-agentic-workflows.md
**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.1/.github/aw/upgrade-agentic-workflows.md

**Use cases**:
- "Upgrade all workflows to the latest version"
Expand All @@ -92,7 +92,7 @@ When you interact with this agent, it will:
### Create a Report-Generating Workflow
**Load when**: The workflow being created or updated produces reports — recurring status updates, audit summaries, analyses, or any structured output posted as a GitHub issue, discussion, or comment

**Prompt file**: https://github.com/github/gh-aw/blob/v0.68.3/.github/aw/report.md
**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.1/.github/aw/report.md

**Use cases**:
- "Create a weekly CI health report"
Expand All @@ -102,7 +102,7 @@ When you interact with this agent, it will:
### Create Shared Agentic Workflow
**Load when**: User wants to create a reusable workflow component or wrap an MCP server

**Prompt file**: https://github.com/github/gh-aw/blob/v0.68.3/.github/aw/create-shared-agentic-workflow.md
**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.1/.github/aw/create-shared-agentic-workflow.md

**Use cases**:
- "Create a shared component for Notion integration"
Expand All @@ -112,7 +112,7 @@ When you interact with this agent, it will:
### Fix Dependabot PRs
**Load when**: User needs to close or fix open Dependabot PRs that update dependencies in generated manifest files (`.github/workflows/package.json`, `.github/workflows/requirements.txt`, `.github/workflows/go.mod`)

**Prompt file**: https://github.com/github/gh-aw/blob/v0.68.3/.github/aw/dependabot.md
**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.1/.github/aw/dependabot.md

**Use cases**:
- "Fix the open Dependabot PRs for npm dependencies"
Expand All @@ -122,7 +122,7 @@ When you interact with this agent, it will:
### Analyze Test Coverage
**Load when**: The workflow reads, analyzes, or reports test coverage — whether triggered by a PR, a schedule, or a slash command. Always consult this prompt before designing the coverage data strategy.

**Prompt file**: https://github.com/github/gh-aw/blob/v0.68.3/.github/aw/test-coverage.md
**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.1/.github/aw/test-coverage.md

**Use cases**:
- "Create a workflow that comments coverage on PRs"
Expand Down Expand Up @@ -169,10 +169,10 @@ gh aw compile --validate

## Important Notes

- Always reference the instructions file at https://github.com/github/gh-aw/blob/v0.68.3/.github/aw/github-agentic-workflows.md for complete documentation
- Always reference the instructions file at https://github.com/github/gh-aw/blob/v0.71.1/.github/aw/github-agentic-workflows.md for complete documentation
- Use the MCP tool `agentic-workflows` when running in GitHub Copilot Cloud
- Workflows must be compiled to `.lock.yml` files before running in GitHub Actions
- **Bash tools are enabled by default** - Don't restrict bash commands unnecessarily since workflows are sandboxed by the AWF
- Follow security best practices: minimal permissions, explicit network access, no template injection
- **Network configuration**: Use ecosystem identifiers (`node`, `python`, `go`, etc.) or explicit FQDNs in `network.allowed`. Bare shorthands like `npm` or `pypi` are **not** valid. See https://github.com/github/gh-aw/blob/v0.68.3/.github/aw/network.md for the full list of valid ecosystem identifiers and domain patterns.
- **Network configuration**: Use ecosystem identifiers (`node`, `python`, `go`, etc.) or explicit FQDNs in `network.allowed`. Bare shorthands like `npm` or `pypi` are **not** valid. See https://github.com/github/gh-aw/blob/v0.71.1/.github/aw/network.md for the full list of valid ecosystem identifiers and domain patterns.
- **Single-file output**: When creating a workflow, produce exactly **one** workflow `.md` file. Do not create separate documentation files (architecture docs, runbooks, usage guides, etc.). If documentation is needed, add a brief `## Usage` section inside the workflow file itself.
157 changes: 157 additions & 0 deletions .agents/skills/sample-scout/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
---
name: sample-scout
description: >
Scout Google's upstream Skia GM (golden master) samples to find demos worth porting to the
SkiaSharp Gallery. Fetches the full gm/ directory listing from google/skia on GitHub, analyzes
each .cpp file to understand what it demonstrates, checks whether the required APIs exist in
SkiaSharp, and cross-references against existing Gallery samples to identify gaps. Produces a
structured JSON report and a GitHub-flavored Markdown report for filtering by interest level, API
availability, and sample coverage status. Use this skill whenever the user asks about "what
samples should we build", "what demos are we missing", "find interesting Skia GMs", "sample gap
analysis", "what can we port from Skia", "gallery ideas", "scout GM samples", or any request to
discover demo opportunities from upstream Skia. Also use proactively after adding new APIs to
find samples that showcase them.
---

# Sample Scout

You analyze Google's upstream Skia GM (golden master) sample files to discover demos worth porting
to the SkiaSharp Gallery. The goal is to find visually impressive, educationally valuable samples
that showcase SkiaSharp's capabilities — and identify which ones we can build today vs. which need
new APIs first.

## Why This Matters

Skia has 400+ GM samples that exercise every API and visual technique. These are a goldmine for
the SkiaSharp Gallery — each one is a proven, tested visual that demonstrates something users would
want to learn. But nobody can manually review 400+ C++ files to find the gems. This skill automates
the discovery.

## Key References

- **[references/analysis-instructions.md](references/analysis-instructions.md)** — How to classify samples
- **[references/sample-scout-schema.json](references/sample-scout-schema.json)** — JSON Schema for validation
- **[references/schema-cheatsheet.md](references/schema-cheatsheet.md)** — Human-readable schema docs

## Workflow

```
Phase 1: Setup (list GM files, list existing Gallery samples)
Phase 2: Analyze GM files (parallel agents, each handles a chunk)
Phase 3: Cross-reference with existing Gallery samples
Phase 4: Validate and render
Phase 5: Present results
```

### Phase 1: Setup

**1a. List all GM files from upstream**

Use the GitHub API to get the complete file listing from `google/skia/gm/`:

```bash
gh api repos/google/skia/contents/gm --jq '.[].name' | grep '\.cpp$' | sort > gm-files.txt
wc -l < gm-files.txt
```

IMPORTANT: Always use upstream `google/skia`, not our fork `mono/skia`. The fork may be behind.

**1b. List existing Gallery samples**

```bash
find samples/Gallery -name "*.cs" -path "*/Samples/*" | sort
```

For each sample, extract the `Title`, `Description`, and `Category` to build a coverage map.

**1c. Split into chunks for parallel processing**

With 400+ files, split into 5 chunks of ~80-90 files each for parallel analysis.

### Phase 2: Analyze GM Files

Launch **5 parallel background agents** (general-purpose), each analyzing one chunk. Each agent:

1. For each `.cpp` file in its chunk, fetch from GitHub:
```
github-mcp-server-get_file_contents owner=google repo=skia path=gm/{filename}
```

2. Read the file and extract:
- **What it demonstrates** (1-2 sentences)
- **Key Skia APIs used** (class::method names)
- **Interest level**: high / medium / low
- **API availability**: check if the required APIs exist in SkiaSharp by grepping `binding/SkiaSharp/`
- **Missing APIs**: list any APIs not available in SkiaSharp
- **Notes**: GPU-only, Graphite-specific, bug regression, etc.

3. Save findings as JSON array to a temp file.

See [references/analysis-instructions.md](references/analysis-instructions.md) for the classification
criteria and decision guidelines.

**Agent prompt template:**
```
Analyze Skia GM sample files from google/skia. For EACH file, fetch it using
github-mcp-server-get_file_contents (owner=google, repo=skia, path=gm/FILENAME),
read it, and produce a JSON entry.

Files: {comma-separated list}

Read .agents/skills/sample-scout/references/analysis-instructions.md for classification criteria.

For each file output: file, name, description, interesting (high/medium/low),
apis_available (true/false), missing_apis [], key_apis [], notes,
visualGoal (what the rendered output looks like), suggestedControls [],
category (Gallery category), skiaSharpApis [] (C# equivalents).

Check API availability by grepping binding/SkiaSharp/ for the C# equivalents.
Save as JSON array to {output_path}.
Must produce exactly {N} entries — count at the end to confirm.
```

### Phase 3: Cross-Reference with Existing Gallery Samples

After all agents complete, merge their findings and cross-reference against existing Gallery samples:

For each GM entry, check if an existing Gallery sample covers the same topic:
- **`existing`** — A Gallery sample directly covers this GM's main feature
- **`similar`** — A Gallery sample covers a related topic (e.g., gradient GM → Gradient sample exists)
- **`none`** — No Gallery sample covers this

Tag each finding with `sampleStatus` and `matchedSample`.

Save the merged findings as `sample-scout-report.json` in the working directory.

### Phase 4: Validate and Render

**4a. Validate**

```bash
python3 .agents/skills/sample-scout/scripts/validate-sample-scout.py sample-scout-report.json
```

**4b. Render Markdown**

```bash
python3 .agents/skills/sample-scout/scripts/render-sample-scout.py sample-scout-report.json sample-scout-report.md
```

This produces a `.md` file with `###`/`####` headers suitable for GitHub issues.

### Phase 5: Present Results

Show the summary with these key metrics:
- Total samples analyzed
- 🆕 No existing sample (opportunities)
- 🔶 Similar sample exists (enhancement opportunities)
- ✅ Already covered
- 🎯 **Opportunity count** = high interest + APIs ready + no existing sample

Then present the top opportunities — samples that are high-interest, have all APIs available,
and have no existing Gallery coverage. These are the ones to build next.

Offer:
1. "Want me to build Gallery samples for the top opportunities?"
2. "Should I focus on samples that need new APIs first?"
3. "Want to filter by a specific category (shaders, image filters, text, etc.)?"
35 changes: 35 additions & 0 deletions .agents/skills/sample-scout/evals/evals.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"skill_name": "sample-scout",
"evals": [
{
"id": 1,
"prompt": "Scout the upstream Skia GM samples and find interesting demos we should port to the SkiaSharp Gallery. Do a full scan.",
"expected_output": "Full scan of 400+ GM files from google/skia/gm/. Should categorize each by interest level, check API availability, and cross-reference with existing Gallery samples. Should identify top opportunities.",
"files": [],
"expectations": [
"Produces a JSON file that passes validate-sample-scout.py with exit code 0",
"Produces a Markdown report via render-sample-scout.py",
"JSON meta.source is 'google/skia/gm/'",
"JSON findings array has at least 300 entries",
"JSON summary.totalFindings equals actual findings count",
"At least 50 findings have interesting='high'",
"At least one finding references mesh.cpp with apis_available=false",
"At least one finding references runtimeshader.cpp with apis_available=true",
"sampleStatus field is present on findings",
"summary.opportunities count matches actual high+available+none count"
]
},
{
"id": 2,
"prompt": "What Skia GM samples can we build today with existing SkiaSharp APIs? I want to find demos we're missing.",
"expected_output": "Should filter to samples where apis_available=true and sampleStatus='none'. Focus on the actionable opportunities.",
"files": [],
"expectations": [
"Produces a valid JSON report",
"Identifies samples with sampleStatus 'none' that have apis_available true",
"Presents a focused list of buildable opportunities",
"Each opportunity has a clear description of what it demonstrates"
]
}
]
}
93 changes: 93 additions & 0 deletions .agents/skills/sample-scout/references/analysis-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# Sample Scout — Analysis Instructions

Read this file before analyzing any GM samples. It contains the classification criteria,
interest level guidelines, and API availability checking methodology.

## Classification Criteria

### Interest Level

| Level | Criteria | Examples |
|-------|----------|---------|
| **high** | Visually impressive, demonstrates a useful technique, showcases a powerful API that users would want to learn. Would make a great Gallery demo. | Runtime shaders, shadow utils, path effects showcase, gradient interpolation, mesh drawing, image filter chains, text effects |
| **medium** | Educational or useful reference but not visually exciting on its own. Could be combined with other samples. | Bitmap copy, color matrix, simple clip operations, tile modes, basic shapes |
| **low** | Internal test, bug regression, GPU-backend-specific test, stress test, or not relevant to SkiaSharp users. | crbug_* files, skbug_* files, Graphite-only tests, GrFragmentProcessor tests, Vulkan/Dawn internals, benchmark GMs |

### Quick Classification Rules

- Files starting with `crbug_` or `skbug` → **low** (bug regression tests)
- Files mentioning `Graphite`, `Dawn`, `GrFragmentProcessor`, `GrGeometryProcessor` → **low** (GPU internals)
- Files testing a single specific visual feature with nice output → **high**
- Files testing edge cases of an already-covered feature → **medium**
- Files showing off compositing, effects chains, or creative techniques → **high**

### API Availability Check

For each key Skia API used in a GM sample, check if SkiaSharp has a C# equivalent:

| Skia C++ | SkiaSharp C# | Where to check |
|----------|-------------|----------------|
| `SkCanvas::drawRect` | `SKCanvas.DrawRect` | `binding/SkiaSharp/SKCanvas.cs` |
| `SkPaint` properties | `SKPaint` properties | `binding/SkiaSharp/SKPaint.cs` |
| `SkShader` factories | `SKShader.Create*` | `binding/SkiaSharp/SKShader.cs` |
| `SkImageFilter` factories | `SKImageFilter.Create*` | `binding/SkiaSharp/SKImageFilter.cs` |
| `SkPathEffect` factories | `SKPathEffect.Create*` | `binding/SkiaSharp/SKPathEffect.cs` |
| `SkColorFilter` factories | `SKColorFilter.Create*` | `binding/SkiaSharp/SKColorFilter.cs` |
| `SkRuntimeEffect` | `SKRuntimeEffect` | `binding/SkiaSharp/SKRuntimeEffect.cs` |
| `SkMesh` | ❌ Not available | — |
| `SkShadowUtils` | ❌ Not available | — |
| `SkImageFilters::RuntimeShader` | ❌ Not available | — |
| `SkColorFilters::HSLAMatrix` | ❌ Not available | — |
| GPU-specific (GrDirectContext, GrBackendTexture) | ❌ Not relevant | Internal GPU plumbing |
| `experimental_DrawEdgeAAQuad` | ❌ Not available | Experimental API |

To verify, grep the binding directory:
```bash
grep -ril "MethodName\|method_name" binding/SkiaSharp/
```

### What Makes a Good Gallery Sample

A good SkiaSharp Gallery sample:
1. **Looks impressive** — visual output that makes people say "wow, SkiaSharp can do that?"
2. **Teaches something** — demonstrates an API or technique users would want to learn
3. **Is self-contained** — doesn't need external resources (or uses bundled assets)
4. **Has controls** — interactive parameters users can tweak to understand the API
5. **Works on all platforms** — no GPU-specific or platform-specific requirements

### Notes Field

Use the notes field to capture important context:
- "GPU-only" — requires GPU backend, won't work on CPU raster
- "Graphite-specific" — only relevant to Graphite backend (not SkiaSharp)
- "Bug regression test" — tests a specific fixed bug, not a feature demo
- "Stress test" — performance/edge case test, not visual
- "Requires test fonts" — needs specific font files
- "Animated" — has frame-based animation
- "Combines well with X" — could be merged with another GM for a richer sample

## Output Schema

Each finding must have these fields:

```json
{
"file": "mesh.cpp",
"name": "Custom Vertex Mesh Drawing",
"description": "Draws custom vertex meshes with SkSL vertex/fragment programs and per-vertex attributes.",
"interesting": "high",
"apis_available": false,
"missing_apis": ["SkMesh", "SkMeshSpecification", "SkCanvas::drawMesh"],
"key_apis": ["SkMesh::Make", "SkMeshSpecification::Make", "SkCanvas::drawMesh"],
"notes": "Requires SkMesh API which is not yet exposed in SkiaSharp",
"visualGoal": "A colorful warped grid of triangles with per-vertex colors, demonstrating programmable vertex displacement and custom fragment shading.",
"suggestedControls": ["Grid density slider (4–32)", "Warp amplitude slider (0–50)", "Color mode toggle (rainbow/grayscale)"],
"category": "Shaders",
"skiaSharpApis": ["SKCanvas.DrawVertices", "SKRuntimeEffect", "SKVertices"]
}
```

### Required fields
`file`, `name`, `description`, `interesting`, `apis_available`, `missing_apis`, `key_apis`, `visualGoal`, `suggestedControls`, `category`, `skiaSharpApis`

All fields are required on every finding. `missing_apis` and `suggestedControls` should be empty arrays `[]` when not applicable.
Loading
Loading