/age
Review a diff or scoped path before merging, after
, or whenever the user wants evidence-backed observations rather than an approval verdict. Do not apply fixes here —
owns application.
Inputs
text
/age [<ref-or-range>] [--scope <path>] [--comprehensive] [--full] [--safe] [--open-pr] [--auto] [--html]
/age <slug> [--full] [--safe] [--open-pr] [--auto] [--html]
un-collapses the
section when 10 or more low-severity findings exist (the default report collapses them to a one-line summary).
re-introduces cure selection.
propagates through
to terminal
; a new PR follows
's explicit-choice and review-shape policy.
When called with a
, resolve
(if present) for press context and review the current working diff. When called with a
, review that range. Default to the current working diff when neither is supplied. If the base branch is unclear, ask or use the repository's documented default.
is the propagated autonomous-mode flag from
. It changes the handoff (see
and
for the cap rule and full chain).
propagates through
to
. Age never fires the gate;
gives
the final verified artifact state before publication.
emits a static HTML copy alongside
: write the markdown first, then
python3 src/age/age-html-report.py --report .cheese/age/<slug>.md --slug <slug>
(bundle fallback:
with the same flags), and print the returned path. It groups findings by severity into the shared HTML shell (
shared/scripts/html_report.render_document
) — offline, no CDN, no JS.
Portability reference:
../cheese/references/harness-portability.md
covers helper resolution, sub-agent dispatch, GitHub operations, and handoff transitions; prefer the bundled or repo-local helper first, treat
as optional host-provided fallback. The handoff blocks below are the portable contract; slash commands are host renderings, not the control model.
Review dimensions
Dimensions answer
what kind of problem. Severity (
blocker / high / medium / low
) is per-finding, computed from base + location + compounding modifiers (see
§ 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 |
Per-dimension base-severity tables, location-sensitivity, fix-cost-now / fix-cost-later, and recommendation shapes live in
— read it before computing any finding's severity. This reduced workflow intentionally omits the git-history/precedent dimension.
Flow
-
Identify the diff, scope, and relevant spec or issue.
Mode check: compute the review range's
score and risk flags, then call
age_route.route(score=..., risk_flags=..., entry="age")
(
).
— steps 2–4 below, unchanged. Any
— read
first; its
list, not a fixed label, sets worker count. Fan-out also requires
not itself be a sub-agent — stay single-parent when it is. Thread the router's
into the reviewer dispatch.
-
Gather evidence: diff, touched files, tests, callers/imports. If a press report exists for this slug, read it via
python3 shared/scripts/read_handoff_slug.py --phase press --slug <slug>
(bundle fallback:
common.pyz read_handoff_slug --phase press --slug <slug>
) and summarise unresolved items in a
sub-section —
only reads
.
No press report but a cook handoff exists: record
(see
) and print the warning at handoff. No cook artifact either: skip the marker and continue.
If
.cheese/glossary/<slug>.md
exists, read it so naming drift can be flagged as a deslop finding.
-
Review every dimension; dimensions with no findings simply omit themselves. Report every defect, however minor — never self-filter on perceived significance; filtering happens downstream in the verifier pass (
) or in severity computation (single-parent). Do not raise a finding for a gate failure identical to the diff's recorded
block — see
../cook/references/quality-gates.md
; flag only new or changed failures.
-
Compute severity per finding (base + location bump + compounding bump, capped at
). Group findings by severity (
## Blocker → ## High → ## Medium → ## Low
); within a severity group, order by file.
-
Write the report (see
), then
python3 shared/scripts/write_handoff_artifact.py --phase age --slug <slug> --status ok --next cure --artifact "" --orientation "<one-line orientation>" --durable-flags "<none | one line per flag>" --body-file "$report_file"
(bundle fallback:
${CLAUDE_SKILL_DIR}/scripts/common.pyz write_handoff_artifact
with the same flags). Print the path.
-
Preferred tools and fallbacks
Call source-code backends directly according to the shared
code-intelligence-routing.md
contract. For caller graphs, use the selected semantic backend's caller query plus
when available.
| Need | Prefer | Fallback |
|---|
| Diff inspection | | |
| Caller/dependency impact + curated review context | semantic caller search + | manual scoping; note the precision loss |
| Architecture / hotspot framing for large diffs | changed-file map + caller/dependency evidence | skip and note in confidence |
| Design rationale for encapsulation/spec dimensions (optional) | mcp__hallouminate__list_corpora
/ mcp__hallouminate__ground
on , grounding design intent before grading, rendering consulted pages in | skip; omit ; proceed with diff + code evidence only; cap at when rationale is the primary evidence |
| GitHub/PR context | | local git commands or user-provided PR data |
| Merge/conflict awareness | mergiraf | manual conflict checks |
Optional MCPs: hallouminate and milknado follow the detect-and-degrade contract in
../cheese/references/optional-plugins.md
— state absence once, fall back, reduce confidence only if evidence quality suffers, never block.
Sub-agent fan-out
sizes its own fan-out via the age router (
), not a size-only threshold, and resolves every dispatched worker through
../cheese/references/agent-resolution.md
(read-only, fresh-context; exact specialist, then compatible specialist, then a prompt-constrained general agent with
). Mechanics:
,
,
references/sub-agent-gate.md
.
Output
Cross-cutting house style and citation form:
../cheese/references/formatting.md
. This section owns the findings-report shape; formatting.md owns the voice rules and the footnote primitive.
Write to
with a minimum handoff slug at the top —
,
,
,
,
, one-line orientation.
is the first body line after the blank separator when a cook artifact exists but no press report does; omit it otherwise.
Body, in order:
;
(1-2 sentences);
(omit unless a press report exists);
(omit unless hallouminate grounding hit); severity sections (
**[dim:sev]** path:line — claim
, then
location: <tier> · fix-cost-now: <tier> · fix-cost-later: <tier> · confidence: <tier>
, then
);
;
. See
references/report-example.md
for the full skeleton plus a worked instantiation.
Empty severity sections are omitted entirely. When ten or more
findings exist, collapse the
section to a single line:
markdown
## Low
*N low-severity findings suppressed.* Re-run with `--full` (or `/age --full`) to see them.
Per-finding
uses the voice-kernel scale (
§ Reasoning posture):
— verified by direct evidence (diff/code read, command output);
— inferred from indirect signal. A
grading never ships as a finding row — gather the missing evidence or drop the claim. Suppressed lows feed the cure-selection table only when
is passed.
when the review completed;
when evidence was unreachable.
when any finding meets the
medium+ floor;
otherwise.
mirrors cook's gate: default
.
Then print
Age report: .cheese/age/<slug>.md
. When
is set, also print:
Warning: no /press report for <slug> — hardening was skipped. Run /press <slug> first, or continue with /cure.
When
is passed, also print the HTML path returned by
(render command under
in
).
Handoff
Pipeline: culture → mold → cook → press → [age] → cure → plate
Compute the recommended set. Composite
: the medium floor (blocker+high+medium) unioned with every
at
.
Decide act vs ask:
- Empty set — write , print the report path, stop.
- Reason to ask — a set member has or
fix-cost-later: structural
, findings conflict, or was passed: read references/handoff-detail.md
and render the gate per ../cheese/references/handoff-gate.md
, pre-selecting the composite and flagging heavy rows.
- Otherwise — act: announce the selection and dispatch per
references/handoff-detail.md
§ Dispatch. No gate.
substitutes a severity-floor selection (
below);
references/handoff-detail.md
also covers the no-chain override under
's fan pathway.
Auto mode
- Skip the handoff gate.
- If two cure passes have already completed (cap reached), stop and surface the final report — do not invoke again even if findings remain.
- Otherwise, if any finding meets the medium+ floor — invoke
/cure <slug> --auto --stake medium+
(forward when it is in scope) and increment the cure-pass count when it returns.
- If no finding meets the medium+ floor, stop the chain with a one-line "auto chain clean" note and the report path.
Within cook's own fan pathway
's fan pathway spawns age as a fresh-context sub-agent and owns the chain itself. Read
references/handoff-detail.md
§ Within cook's own fan pathway for the no-chain isolation directive before writing the report.
Rules
- Review is not a verdict; explain where to look and why.
- Do not edit production files; owns application.
- Do not raise a finding for a gate failure identical to the diff's recorded block; flag only new/changed failures per
../cook/references/quality-gates.md
.
- Default to acting: auto-select the recommended set, dispatch without a gate. Ask first only on a genuine reason or . An empty recommended set is a clean stop, not a question.
- Do not invent evidence; cite files, diffs, commands, or unavailable-source notes.
- Agree when the diff is fine — an empty dimension is a valid outcome, not a gap to fill.
- Keep confidence qualitative (
certain | speculating | don't know
) at both the report and per-finding level; never a numeric score.
- Findings carry location + recommendation, not JSON sidecars or tag-anchored fix payloads — reads the markdown directly.
- Apply (output discipline, reasoning posture, confidence vocabulary).
References
- — before grading any finding: rubrics, location sensitivity, fix-cost tables, recommendation shapes.
- — before any dispatch: router mechanics, lens partitions, six-seam sequence, verifier pass.
- — when assembling the Seam-2 shared context packet for a fan-out run.
references/sub-agent-gate.md
— before any sub-agent dispatch: digest contract, harness-agnostic selection, what the parent never delegates.
references/handoff-detail.md
— before the selection gate or a dispatch: gate menu, dispatch payload, cook-fan-pathway no-chain override.
references/report-example.md
— alongside : worked rendering plus the full placeholder skeleton.
- — when writing the report: output discipline, reasoning posture, confidence vocabulary.
references/deslop-rust.md
, references/deslop-typescript.md
, references/deslop-python.md
, references/deslop-shell.md
, — when grading in that language: pattern catalogs with lint-rule mappings.
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 canonical age report/handoff carries the shared
block.