Anatomy of a Review
Every section of a Son of Anton review body and check run, and what each one means.
This page describes the publisher and formatter in son-of-anton-review on feat/cloudflare-native. It applies when a run reaches live publication. Native shadow runs use a recording publisher; policy-skipped runs are not completed semantic reviews. The expanded dashboard policy API is in the separate son-of-anton-operator-parity tree, not the native main Worker.
What gets posted
Publication is keyed by review run, not by PR lifetime. A new head or a new manual-comment variant can create another run. The publisher exposes these surfaces:
| Surface | Where | Behaviour |
|---|---|---|
| PR review | Reviews tab | POSTed with a <!-- anton-review <key> --> marker and pinned commit. Event is COMMENT, or APPROVE when the full auto-approval policy passes. It is not edited in place across pushes. |
| Check run | Checks tab, named Son of Anton / review | Created when no check ID is stored, then PATCHed through run transitions. Enabled by default; policy can disable it. |
| Status comments | PR conversation | Off by default (statusChecks.postStatusComments). Receipt and completion comments are separate POSTs with their own markers, not one continuously edited sticky comment. |
There are no inline per-line comments or suggestion patches in this publisher. It also supports an optional PR-description update, described below. Publication claims and receipts reduce duplicate mutations; an ambiguous remote outcome still needs reconciliation before retrying.
The header line
The check run summary is one line:
[CLEAR] Safe to merge. Analyst confidence 4/5.
[CAUTION] Safe to merge with 2 high-risk follow-ups. Analyst confidence 3/5. Required confidence 4/5 was not met.
[BLOCK] Not safe to merge until 1 blocker is fixed. Analyst confidence 2/5.- Merge status is
CLEAR,CAUTION, orBLOCK. Blockers forceBLOCK. High findings, aneeds-attentionverdict, incomplete validation, or an analyzer failure force at leastCAUTION. Analyst confidence N/5is a recorded 1 to 5 score, not a probability or proof that validation passed. The deterministic docs-only path also supplies a score. When confidence display is enabled but no score exists, the summary saysAnalyst confidence was not recorded.Disablingsummary.confidencehides that text.- When
statusChecks.requiredConfidenceis set above 0 and the score falls short, the line ends withRequired confidence N/5 was not met.and aCLEARstatus is downgraded toCAUTION.
Check run conclusion
| Condition | Conclusion |
|---|---|
requiredConfidence > 0 and score missing or below it | failure |
Merge status is CAUTION or BLOCK | neutral |
requiredConfidence > 0 but semantic coverage is incomplete, degraded, or pinned to a different head | neutral |
| Otherwise | success |
Blockers therefore do not produce success. In this conclusion function, failure requires a configured confidence threshold; it does not mean that every blocking finding makes the GitHub check fail. A threshold can come from stored policy, not necessarily a dashboard.
Review body sections
Sections appear in this order. Empty sections are omitted.
| Section | Content |
|---|---|
| Custom header | Optional commentHeader text from policy. |
| Son of Anton Summary | One-paragraph overview plus bullet highlights. |
| Merge Status | CLEAR, CAUTION, or BLOCK and the merge verdict sentence. Always shown. |
| Analyst Confidence: N/5 | The reasoning behind the score. |
| Important Files Changed | Table of Filename and Overview. |
| Findings | Findings not established as outside the diff. Missing changed-path metadata is unknown scope, not evidence that a finding is outside it. |
| Outside-Diff Findings | Findings on paths not in the PR. Collapsible by default. |
| Validation Status | Validation evidence lines and MISSING: items. Always shown when present. |
| Cross-Repo Impact | Supplied impact bullets. The graph is repository-scoped; the heading does not prove a multi-repository index or a verified effect in another repo. |
| Competitor Benchmark | Only when competitor review context was captured. Winner, benchmark confidence, agreements, misses, action items. |
| ASCII Flow | A fenced text block with plain-text arrows and boxes. The prompt forbids Mermaid syntax here. |
| Prompt to Fix | Off by default (promptToFix). A quoted prompt listing actionable findings, pinned to the head commit. |
| Footer | Reviewed by Son of Anton for commit <sha>. |
Findings
Each finding is one bullet:
- **HIGH** Missing null check on session token in `src/auth/session.js`
- The body explains the defect and how to reproduce it.
- Evidence: log https://...
- Unverified: Finding claims execution-backed evidence but no evidence artifact ... was persisted for it.- The model schema requires
severity,category,path,title,bodyandcontextIds. Model severities areblocker,high,medium,low; the renderer uppercases whatever severity it receives. There are no required line-number fields. - The renderer prepends
[unverified]only whenevidenceStatusis explicitlyunverified. It does not independently verify artifacts. Execution-artifact processing is gated byGILF_EVIDENCE_ARTIFACTS; enforcement additionally usesGILF_EVIDENCE_REQUIRE_ARTIFACTS. Both are off by default and neither is forwarded by the native container env allowlist. - Policy
strictness=lowleaves findings unchanged.mediumhides medium findings only when a declared confidence is below 0.8; unknown confidence remains visible.highhides medium and low findings except protected findings. Blocker/high findings and findings matching the safety-protection rules are retained.
Validation Status
Validation entries are strings supplied by the runner. These are illustrative formats, not output from a particular run:
PASS test: `npm test` succeeded in 42s.
FAIL lint: `npm run lint` exited with status 1. Output: ...
SKIPPED validation: no standard validation scripts were declared.
INCONCLUSIVE build: `npm run build` was not run. validation process aborted in the sandbox.
MISSING: Codex semantic analysis was skipped because this was an automatic docs-only review.SKIPPED means the named operation did not run. Automatic docs-only reviews can use a deterministic semantic fast path when there is no review memory, operator guidance, manual command or competitor context, and GILF_CODEX_FOR_DOCS_ONLY has not enabled the model pass. That fast path returns CAUTION, confidence 3/5, no findings and a missing-semantic-analysis entry. A manual @anton review bypasses this semantic skip, but does not necessarily force sandbox validation on a docs-only diff or bypass executor/policy failures.
Finding evolution across pushes
The service compares available prior findings with the current result and stores findingEvolution. Matching uses fingerprints and similarity:
| Label | Meaning |
|---|---|
new | No prior finding matched by fingerprint or similarity. |
persisting | Exact match with a prior finding. |
modified | Similar to a prior finding but the text or location changed. |
resolved | A previous finding is omitted and not retained in the unresolved set. This classification alone is not proof of a fix. |
unresolved | An omitted prior concern remains unverified, with its source provenance retained. |
These labels are stored, not rendered as finding tags in the review body. Same-head continuity uses evidence-backed dispositions rather than silently dropping old concerns. The outcome ledger records unknown when the new semantic analysis is incomplete. Do not equate evolution labels with the addressed-rate methodology of the separate parity reports API.
PR description block
With updatePrDescription enabled (default off), the review markdown is also written into the PR description between owned markers:
<!-- anton-review-summary:start -->
...review markdown...
<!-- anton-review-summary:end -->With neither marker present, the block is appended. With one valid pair it is replaced, preserving the surrounding text. A lone marker, duplicates, reversed markers, reserved markers in the generated review, or an unreadable description causes refusal. The publisher also refuses if a fresh GitHub read shows that the PR head moved.
What stored review policy can hide
The summary.* settings control optional sections. Each has enabled, collapsible, and defaultOpen. These are their defaults:
{
"summary": {
"summary": { "enabled": true, "collapsible": false, "defaultOpen": false },
"confidence": { "enabled": true, "collapsible": false, "defaultOpen": false },
"files": { "enabled": true, "collapsible": false, "defaultOpen": false },
"diagram": { "enabled": true, "collapsible": false, "defaultOpen": false },
"outsideDiff": { "enabled": true, "collapsible": true, "defaultOpen": false }
}
}Merge Status and the footer always render. Main findings and validation/impact sections render when populated and are not controlled by these section toggles; finding filtering still applies. Outside-Diff Findings can be hidden, and hiding them also excludes those findings from Prompt to Fix. Optional featureTips can add a tip before the footer.
Rerun a review
Authorized commenters (OWNER, MEMBER, COLLABORATOR by default) can comment:
@anton rerun@anton review and @anton rerun request a manual run; a new comment ID gives it a new variant. @gilf is a parser alias. Node resolves the target from its stored PR head, so it needs an earlier PR event; the native consumer resolves a missing head from GitHub. Node also replies to status and help, whereas the native consumer ignores those commands. See Triggers and commands.