Summarize the architecture of code generated by a single retort run. Produces module-level structure, interfaces, and control flow in a form suitable for cross-run comparison — not a full codebase-summary.
Scanned 9/8/2026
Install to Claude Code
npx -y skills add adrianco/retort --skill run-summary --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Run Summary?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/adrianco-run-summary)More formats (shields.io, HTML) on the badges page.
---
name: run-summary
description: Summarize the architecture of code generated by a single retort run. Produces module-level structure, interfaces, and control flow in a form suitable for cross-run comparison — not a full codebase-summary.
type: anthropic-skill
version: "1.0"
---
# Run Summary
## Overview
Retort runs produce small, single-task codebases (one REST API, one CLI, one service). Full codebase-summary treatment is overkill — but a consistent lightweight summary per run is exactly what makes cross-run comparison useful.
This skill is an intentionally scoped-down adaptation of pourpoise's `codebase-summary`. It runs in seconds, not minutes, and emits only what's useful when comparing 48+ small generated projects.
## Parameters
- **codebase_path** (required): The run directory (same as `evaluate-run`'s `run_dir`)
- **output_dir** (optional, default: `{codebase_path}/summary`): Where to write the summary files
## Steps
### 1. Infer the surface
Read `TASK.md` to understand what the code is supposed to do — the "surface" of the project. One paragraph, no judgments.
### 2. Map the modules
Generate `{output_dir}/modules.md`:
```markdown
# Modules
| Path | Purpose | Entry points |
|------|---------|--------------|
| src/app.py | HTTP server, route handlers | `app`, `create_app()` |
| src/models.py | SQLAlchemy models | `Book`, `Base` |
| src/db.py | Connection + migrations | `get_engine()` |
| tests/test_app.py | API integration tests | 8 test functions |
```
Constraints:
- You MUST list every non-generated source file (skip `node_modules`, `target`, `__pycache__`, `.git`, lock files, build artifacts).
- The "Purpose" column is one line extracted from the code, not invented.
- The "Entry points" column is the publicly-named functions, classes, or exported symbols — not every local helper.
### 3. Describe the interfaces
Generate `{output_dir}/interfaces.md` covering what the code exposes:
- HTTP routes (method, path, short description)
- CLI commands (subcommand + flags)
- Library API (exported classes/functions)
- Data schemas (tables, message formats)
Example:
```markdown
# Interfaces
## HTTP routes
| Method | Path | Returns | Handler |
|--------|------|---------|---------|
| GET | /books | `[Book]` | `app.py:list_books` |
| POST | /books | `Book` | `app.py:create_book` |
| GET | /books/{id} | `Book \| 404` | `app.py:get_book` |
## Data schema
`books` table: id (int, pk), title (str), author (str), year (int).
```
Constraints:
- You MUST grep / static-analyze the code rather than execute it to discover interfaces.
- You MUST NOT invent endpoints the code doesn't actually declare.
- If the code has none of the above categories, write `(none)` under that heading.
### 4. Trace the dominant control flow
Generate `{output_dir}/flow.md` with one Mermaid diagram showing the happy-path request/response for the main feature, plus a one-paragraph narration.
```markdown
# Flow
```mermaid
sequenceDiagram
Client->>app.py: GET /books
app.py->>db.py: get_session()
db.py-->>app.py: Session
app.py->>Book: query.all()
Book-->>app.py: [Book]
app.py-->>Client: 200 {json}
```
A request to `GET /books` opens a DB session via `db.py:get_session()`, queries all `Book` rows, and returns them as JSON. No pagination, no filtering.
```
Constraints:
- You MUST pick the single most representative flow — the one a user of the generated code would hit first.
- You MUST note deviations from common patterns ("no input validation", "no error handling", "synchronous DB access in async handler").
- The narration MUST be factual, not prescriptive.
### 5. Write the index
Generate `{output_dir}/index.md` linking to the other three files and giving a 3–4 bullet summary:
```markdown
# Summary: {cell_name} · rep {replicate}
- **Shape:** {one-line description — "Flask REST API with SQLAlchemy", "Go net/http CRUD with in-memory store", etc.}
- **Structure:** {n} modules, {n} test files
- **Interfaces:** {n} HTTP routes / {n} CLI commands / {n} exported functions
- **Notable:** {what stands out — simplest/most-complex approach seen, unusual library choice, etc.}
See [modules.md](modules.md), [interfaces.md](interfaces.md), [flow.md](flow.md).
```
## Constraints Summary
- You MUST finish in under 90 seconds wall-clock. This is the fast-path summary.
- You MUST NOT read anything under `node_modules/`, `target/`, `__pycache__/`, `.git/`, `dist/`, `build/`.
- You MUST write exactly four files: `index.md`, `modules.md`, `interfaces.md`, `flow.md`. No more, no less.
- You MUST keep descriptions factual — no quality judgments (that's `evaluate-run`'s job).
- Output files MUST be valid markdown that renders correctly in GitHub's viewer (Mermaid in a ```mermaid fenced block).
## Troubleshooting
**Code is unparseable / generated output is garbage**
- Write the index.md with `**Shape:** unparseable — agent output did not produce a valid project`.
- Leave the other files near-empty with a one-line explanation.
- Exit 0 so `evaluate-run` can still complete.
**Too many files to summarize**
- This shouldn't happen in retort's small-task workspaces. If it does, cap the modules table at 50 rows and note the truncation in index.md.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!