/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. Do not apply fixes in this skill. Let /cure apply them.
Inputs
/age [<ref-or-range>] [--scope <path>]... [--slug <slug>] [--full] [--safe] [--open-pr] [--auto] [--hard] [--html]
/age <slug> [--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.
For a <slug>, resolve .cheese/press/<slug>.md (if present) for 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.
The handoff blocks below define the portable contract.
Remember: slash commands are host renderings, not the control model.
Review dimensions
Dimensions answer what kind of problem.
Assign one severity (blocker / high / medium / low) to each finding.
Compute severity from base, location, and compounding modifiers (see references/dimensions.md § Severity computation).
| Dimension | Base range |
|---|---|
| correctness | low → blocker |
| security | low → blocker |
| encapsulation | low → blocker |
| spec | low → blocker |
| complexity | low → high |
| deslop | low → high |
| assertions | low → blocker |
| nih | low → high |
| efficiency | low → blocker |
| telemetry | low → blocker |
references/dimensions.md contains per-dimension base-severity tables, location sensitivity, fix-cost-now / fix-cost-later, and recommendation shapes.
Read it before computing any finding's severity.
This workflow intentionally omits the git-history/precedent dimension.
Flow
- Identify the diff, scope, and relevant specification or issue.
Compute the review range's
review_surfacescore and risk flags. Callage_route.route(score=..., risk_flags=..., entry="age")fromsrc/easy_cheese/shared/fanout/age_route.py. Forn=1, continue with steps 2 through 4. Forn>1, readreferences/fan-out.mdfirst. Use itslenseslist to set the worker count. Do not use fan-out when/ageruns as a sub-agent. Pass the router'seffortvalue to the reviewer. Assemble the fan-out packet before the lock. 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.
The verifier pass (n>1) or severity computation (single-parent) filters findings later.
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.
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 --slug <slug> --status ok --next <next> --artifact "<artifact>" --orientation "<one-line orientation>" --durable-flags "<none | one line per flag>" --baseline "<baseline>" --body-file ".cheese/age/<slug>-body.md".
Print the path.
The write fails when the production tree moved after step 1. Do not retry it with a new lock.
6. Hand off (see ## Handoff below).
Sub-agent fan-out
/age sizes its own fan-out with the age router (src/easy_cheese/shared/fanout/age_route.py), not a size-only threshold.
/age resolves every dispatched worker through ../cheese/references/agent-resolution.md.
Use read-only, fresh-context workers.
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.
references/packet.md § Evidence tools and fallbacks lists the tool for each need.
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.
Set next: cure when that set is not empty.
Set next: done when that set is empty.
Keep every finding in the report, whatever next says.
Set durable_flags: to none by default, as in cook's gate.
When the review-surface score exceeds 400, set durable_flags: coverage-degraded: review-surface score <score> exceeds the 400-point ceiling and lead ## Next step with a stacked-split recommendation for /plate.
Record the resolved worker types under ## Agent resolution in the body.
Print Age report: .cheese/age/<slug>.md.
When press: skipped is set, print the following warning:
Warning: no /press report for <slug> — hardening was skipped. Run /press <slug> first, 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 identical to the diff's recorded baseline: block.
Flag only new/changed failures per ../cook/references/quality-gates.md.
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.
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 ann>1dispatch. - 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 dimension worker and fresh-context review through ../cheese/references/agent-resolution.md.
| Work | Preferred types | Permissions/isolation | Minimum power | Effort | Fallback |
|---|---|---|---|---|---|
| Review a diff or one dimension | reviewer | read-only, fresh-context | powerful | high | compatible reviewer, then general |
The table gives the default effort.
The router overrides it. Use the low, medium, or high value that age_route.route(...) returns.
Pass that value to every dispatched worker.
The report body carries the shared agent_resolution block under ## Agent resolution.
references/report-example.md shows that section in the full skeleton.