
age
Review a diff, PR, branch, or path across thirteen dimensions. Emit a severity-grouped findings report. Use when the user wants a code review. Trigger on "review this", "/age", "is this safe to merge", or "find bugs". Also trigger on "spot security issues", "check for slop", "review my PR", or "what's wrong with this code". Review every requested dimension. Review all thirteen dimensions by default. Do not apply fixes. Route them to /cure. Do not harden tests; route that work to /press.
- Installs
- 649
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/paulnsorensen/easy-cheese --skill age- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads age automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
/age
Review a diff or scoped path before merging or after /press. Use this skill whenever the user wants evidence-backed observations rather than an approval verdict.
Phase entry
Run python3 skills/age/scripts/age.pyz wheypoint-resolve --ref <slug>.
authoritative uses the record; its working_context is the first batched tilth_read.
not-found proceeds cold; legacy shows its source and slug, then proceeds.
gated, ambiguous, and error stop and show the payload.
Show advisory stale-commit and grounded-path-missing findings.
Keep its record.revision_id as <base> (§ Base revision).
Inputs
/age [<ref-or-range>] [--scope <path>]... [--slug <slug>] [--effort quick|normal|deep] [--overall] [--full] [--safe] [--open-pr] [--auto] [--hard] [--html]
/age <slug> [--effort quick|normal|deep] [--overall] [--full] [--safe] [--open-pr] [--auto] [--hard] [--html]
Repeat --scope <path> for each reviewed path.
Every report needs a slug.
Take the slug from the <slug> form.
Take it from --slug <slug> on a scoped or range review.
Derive it with slugify only when the caller supplies neither.
A caller in a pipeline always passes the pipeline slug.
--full expands the ## Low section when ten or more low-severity findings exist.
The default report collapses that section to a one-line summary.
--safe re-introduces cure selection.
--open-pr propagates through /cure to terminal /plate.
A new PR follows /plate's explicit-choice and review-shape policy.
After phase entry, use .cheese/press/<slug>.md (if present) as Press context.
Review the current working diff.
For a <ref-or-range>, review that range.
Review the current working diff when the user supplies neither input.
If the base branch is unclear, ask or use the repository's documented default.
--auto is the propagated autonomous-mode flag from /cook --auto.
See ## Handoff and references/handoff-detail.md § Auto mode for the cap rule and the full chain.
handoff_context.wiki_hits is optional routed input from /cheese.
Each hit carries page, line, and why.
Reuse each valid hit before you ground the review again.
Render the reused hits in ## Wiki context.
--hard propagates through /cure to /plate.
Age never fires the gate.
/plate gives /hard-cheese the final verified artifact state before publication.
--html emits a static HTML copy alongside .cheese/age/<slug>.md.
Write the markdown first.
Then run python3 skills/age/scripts/age.pyz html-report --report .cheese/age/<slug>.md --slug <slug>.
Print the returned path.
The HTML groups findings by severity into the shared HTML shell.
The output is offline and uses no CDN or JS.
Read ../cheese/references/harness-portability.md for helper resolution, sub-agent dispatch, GitHub operations, and handoff transitions.
Prefer the bundled or repo-local helper.
Treat ${CLAUDE_SKILL_DIR} as an optional host-provided fallback.
Slash commands are host renderings, not the control model.
The handoff blocks below define the portable contract.
Review effort and scope
Use --effort quick|normal|deep; the default is normal.
Use --overall for full subject fan-out across the review target.
--full still controls finding visibility, not review scope.
Review dimensions
Review correctness, security, encapsulation, spec, complexity, deslop, assertions, NIH, efficiency, telemetry, conventions, altitude, and reframe.
Assign one blocker, high, medium, or low severity to each finding.
Use references/dimensions.md for severity rules and recommendation shapes.
This workflow omits the git-history/precedent dimension.
Flow
- Identify the diff, scope, and relevant specification or issue.
Read
references/fan-out.mdfor the context checklist and deterministic planning contract. Collect instruction sources, build context, and runscripts/age.pyz age-routethrough its bundle path. Use the assignments, effort, dispatch batches, and capability restrictions. Assemble shared evidence and the plan before the lock; do not launch a separate classifier agent. The lock covers the packet, because the packet is review evidence. Then runpython3 skills/age/scripts/age.pyz review-lock --slug <slug>to lock the production tree. Use the resolved slug from## Inputs. Step 5 rejects the report when a production file changes. - Gather evidence from the diff, touched files, tests, and callers/imports.
Resolve the upstream report with
python3 skills/age/scripts/age.pyz artifact-path --phase press --slug <slug>. Validate its preamble withpython3 skills/age/scripts/age.pyz read-handoff-slug --phase press --slug <slug>. That command returns preamble fields only. Read the resolved file itself for the## Review follow-upssection and every unresolved item. Copy each unresolved item into a## Press findingssub-section. Keep theartifactandbaselinevalues from that preamble for step 5./curereads only.cheese/age/<slug>.md.
If no press report exists but a cook handoff exists, record press: skipped (see ## Output).
Print the warning at handoff.
If no cook artifact exists either, omit the marker and continue.
If .cheese/glossary/<slug>.md exists, read it to flag naming drift as a deslop finding.
3. Review every dimension.
Omit dimensions with no findings.
Report every defect, however minor.
Do not filter findings by perceived significance.
Verification filters findings after reconciliation.
Do not report a gate failure that matches the diff's recorded baseline: block.
Read ../cook/references/quality-gates.md for the baseline rules.
Report only new or changed failures.
4. Compute severity per finding (base + location bump + compounding bump, capped at blocker).
Group findings by severity (## Blocker → ## High → ## Medium → ## Low).
Order findings by file within each severity group.
Follow references/fan-out.md for verification and the deep-only gap sweep before writing.
5. Write the report body to .cheese/age/<slug>-body.md.
Write the body only. Do not write the handoff preamble into that file.
Do not write .cheese/age/<slug>.md yourself. The gated writer creates it.
Compute the recommended set first (see ## Handoff).
Set <next> to cure when that set is not empty.
Set <next> to done when that set is empty.
Set <artifact> to the upstream report path from step 2. Use "" only when no upstream report exists.
Set <baseline> to the baseline block from that upstream handoff. Omit --baseline only when the upstream handoff has none.
Run python3 skills/age/scripts/age.pyz write-handoff-artifact --phase age [--base <base>] --slug <slug> --status ok --next <next> --artifact "<artifact>" --orientation "<one-line orientation>" --durable-flags "<none | one line per flag>" --baseline "<baseline>" --grounded <path[#start-end]> --body-file ".cheese/age/<slug>-body.md".
Print the path.
Only a new packet for this slug permits recovery; follow references/packet.md § Late evidence.
Other changes require a fresh review.
6. Hand off (see ## Handoff below).
Sub-agent fan-out
/age plans independent review subjects with the contextual age router (src/easy_cheese/shared/fanout/age_route.py).
See references/fan-out.md, references/packet.md, and references/sub-agent-gate.md for mechanics.
Call each source-code backend through the shared code-intelligence-routing.md contract.
Output
Use ../cheese/references/formatting.md for cross-cutting house style and citation form.
This section defines the findings-report shape.
formatting.md defines the voice rules and footnote primitive.
The gated writer writes .cheese/age/<slug>.md.
It puts the minimum handoff slug at the top.
The slug carries status, next, artifact, durable_flags, baseline, and one-line orientation.
Supply each value through the step 5 command.
Write the body below into .cheese/age/<slug>-body.md, with no preamble.
references/report-example.md § Body order defines the section order, the exact
finding format, and the full skeleton. Read it before you write the body.
Use the voice-kernel scale for per-finding confidence: (see references/voice.md § Reasoning posture).
Use certain for direct evidence from a diff/code read or command output.
Use speculating for an inference from an indirect signal.
Do not ship a don't know grading as a finding row.
Gather the missing evidence or drop the claim.
Reserve don't know for the report-level ## Confidence line.
Add suppressed lows to the cure-selection table only when the user passes --full.
Set status: ok when the review completes.
Set status: halt: <reason> when the review cannot reach evidence.
Follow the handback contract.
Derive next from the recommended set that ## Handoff computes.
Keep every finding in the report, whatever next says.
Set durable_flags: to none by default, as in cook's gate.
When the plan or host restricts coverage, record the actual restriction in durable_flags and ## Confidence, not a size-only warning.
Record the resolved worker types under ## Agent resolution in the body.
Record dispatch metadata for every topology. Use the fields in report-example.md.
Check supplied dispatch observations with scripts/age.pyz review-plan-check before writing; absent observations remain explicitly unobserved.
Print Age report: .cheese/age/<slug>.md.
When press: skipped is set, print the following warning:
Warning: no .cheese/press/<slug>.md. Re-run /cook or /press <slug>, or continue with /cure.
When the user passes --html, print the HTML path that html-report returns.
The render command appears under --html in ## Inputs.
Handoff
Pipeline: culture → mold → cook (⇄ press) → [age] → cure → plate
Compute the recommended set. Use the all-medium, cheap composite.
Include the medium floor (blocker+high+medium).
Also include every Low with fix-cost-now: contained.
Decide whether to act or ask.
This selection is the only one. ## Output derives next from it.
A review with contained lows and no medium finding has a non-empty set.
That review sets next: cure and keeps every low finding in the report.
- Empty set — Set
next: done. Print the report path. Stop. - Reason to ask — Ask when a set member has
fix-cost-now: sprawlingorfix-cost-later: structural. Also ask when two findings conflict. Also ask when the user passes--safe. Readreferences/handoff-detail.mdfirst. Render the gate per../cheese/references/handoff-gate.md. Pre-select the composite. Mark each heavy row. - Otherwise — Act. Announce the selection. Dispatch
/cureperreferences/handoff-detail.md§ Dispatch. Do not render a gate.
--auto substitutes a severity-floor selection and its own chain.
Read references/handoff-detail.md § Auto mode before an --auto run.
That file also defines the no-chain override under /cook's fan pathway.
Rules
Review is not a verdict.
Explain where to look and why.
Do not edit production files.
The step 1 review lock enforces this rule.
/cure applies each fix.
Do not raise a finding for a gate failure that matches the recorded baseline: block.
Default to acting.
Auto-select the recommended set.
Dispatch /cure without a gate.
Ask first only for a genuine reason or when --safe is active.
Treat an empty recommended set as a clean stop, not a question.
Do not invent evidence.
Cite files, diffs, commands, or unavailable-source notes.
Agree when the diff is fine.
Treat an empty dimension as a valid outcome, not a gap to fill.
Keep confidence qualitative (certain | speculating | don't know) in the report and each finding.
Never use a numeric score.
Give each finding a location and recommendation.
Write recommendation: and optional invariants: per references/report-example.md.
Do not add JSON sidecars or tag-anchored fix payloads.
/cure reads the markdown directly.
Apply references/voice.md (output discipline, reasoning posture, confidence vocabulary).
References
- Read the generated command inventory in
references/commands.md. - Read
references/dimensions.mdbefore grading a finding. - Read
references/fan-out.mdbefore every review. - Read
references/packet.mdbefore assembling a fan-out context packet. - Read
references/sub-agent-gate.mdbefore a sub-agent dispatch. - Read
references/handoff-detail.mdbefore the selection gate or a/curedispatch. - Read
references/report-example.md§ Body order before writing the report body. - Read
references/packet.md§ Evidence tools and fallbacks before gathering evidence. - Read
references/handoff-detail.md§ Auto mode before an--autorun. - Read
references/voice.mdbefore writing the report. - Read the applicable Rust, TypeScript, Python, Shell, or Go catalog before grading
deslop.
Agent resolution
Resolve every subject worker and fresh-context review through ../cheese/references/agent-resolution.md.
| Work | Preferred types | Permissions/isolation | Minimum power | Effort | Fallback |
|---|---|---|---|---|---|
| Review a diff or assigned subjects | reviewer | read-only, fresh-context | powerful | high | compatible reviewer, then general |
The router sets each assignment's effort to low, medium, or high.
Pass that assignment value to its worker, not the plan's quick, normal, or deep review mode.
The report body carries the shared agent_resolution block under ## Agent resolution.
FAQ
What does the age skill do?
Review a diff, PR, branch, or path across thirteen dimensions. Emit a severity-grouped findings report. Use when the user wants a code review. Trigger on "review this", "/age", "is this safe to merge", or "find bugs". Also trigger on "spot security issues", "check for slop", "review my PR", or "what's wrong with this code". Review every requested dimension. Review all thirteen dimensions by default. Do not apply fixes. Route them to /cure. Do not harden tests; route that work to /press.
How do I install age?
Run npx skills add https://github.com/paulnsorensen/easy-cheese --skill age in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/age/ (personal) or .claude/skills/age/ (project).
Which AI agents can use age?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is age safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains age?
It is published by paulnsorensen in paulnsorensen/easy-cheese. It has 649 recorded installs.
More from paulnsorensen/easy-cheese
cook
paulnsorensen/easy-cheese
Implement an approved spec or focused task through stale-safe source edits. Use this skill when the user says "implement this", "cook this spec", or "fix this bug". Use it for /cook .cheese/specs/ .md. Also use it when the user says "go" with clear acceptance criteria. Run it alone for an unambiguous task. Use --prototype when the user says "prototype this", "go prototype it", or "spike this out" and wants to refine the result round by round. A spec helps but is not required. Do not use it for fuzzy planning (/mold). Do not use it for no-write discussion (/culture) or review-only work (/age).
mold
paulnsorensen/easy-cheese
Turn a high-leverage design decision into a validated spec through grounded dialogue. Use it when a leverage trigger fires (auth, irreversible effects, concurrency, contracts, destructive ops, a new slice, a cross-slice dependency, an invariant gap) or when the user asks for a spec or design. Typical phrases include "let's design X", "shape this into a spec", "what should the API for Z look like", and "/mold". A feature ask with zero fired triggers is a /cook mini-spec, not a mold; route it through /cheese. Do NOT use it for free-form discussion without artifact intent (/culture), direct implementation (/cook), or research-only questions (/briesearch). Ceremony scales to the ask through references/tiers.md, so a small clear change gets a validated mini-spec without a write-approval turn.
cure
paulnsorensen/easy-cheese
Apply selected fixes from an /age report, findings list, or CI failure. Run the project gates and hand a clean result to /plate. Use when the user wants selected findings resolved. Do not use for review, test authoring, or direct publication.
cheese
paulnsorensen/easy-cheese
Route an idea, path, pull request, issue, failure, question, or bare /cheese to the correct workflow skill. Use this skill for /cheese, routing requests, help requests, or opening messages without a named workflow skill.
culture
paulnsorensen/easy-cheese
Models problems and trade-offs without writing code or specifications. Use when a workflow needs silent reasoning, or the user asks for "/culture", "no writes", "rubber-duck this", or "these bugs feel connected". Not for specs (/mold), code (/cook), or bug diagnosis and fixes (/pasteurize).
ultracook
paulnsorensen/easy-cheese
Retired — /ultracook no longer exists as a standalone skill. Any /ultracook invocation resolves to /cook, which now owns the single implementation pathway (including the fan-out mechanics this skill used to run). Use /cook instead.
Popular code quality & workflow skills
grill-me
mattpocock/skills
A relentless interview to sharpen a plan or design.
improve-codebase-architecture
mattpocock/skills
Scan a codebase for deepening opportunities, present them as a visual HTML report, then grill through whichever one you pick.
handoff
mattpocock/skills
Compact the current conversation into a handoff document for another agent to pick up.
domain-modeling
mattpocock/skills
Build and sharpen a project's domain model. Use when discussing codebase terminology, writing or editing a GLOSSARY.md, or recording or editing an ADR.
codebase-design
mattpocock/skills
Shared vocabulary for designing deep modules. Use when the user wants to design or improve a module's interface, find deepening opportunities, decide where a seam goes, make code more testable or AI-navigable, or when another skill needs the deep-module vocabulary.
diagnosing-bugs
mattpocock/skills
Diagnosis loop for hard bugs and performance regressions. Use when the user says "diagnose"/"debug this", or reports something broken/throwing/failing/slow.