# Page Reviewer — Checks

The full rule list the `page-reviewer` skill runs. Each check has a severity
(BLOCKER / MAJOR / MINOR), the pattern it looks for, and the verdict it
returns.

## BLOCKER

| ID | Rule | How to detect |
|----|------|---------------|
| `B-SECRET` | Body contains a token, key, password, or PII pattern from `confluence-page/references/secrets.md` | `grep -nE "<patterns>" <draft>` |
| `B-MIRROR-PATH` | Body references a local mirror path (`~/Netcracker/Projects/NDO/knowledge/...`) | grep for the root path |
| `B-COLLISION` | A page with the same title exists under the same parent | `confluence_search` for the title |
| `B-WRONG-SPACE` | Draft targets a space that doesn't match content kind (see `confluence-page/references/space-keys.md`) | manual check by reviewer |
| `B-WRONG-FORMAT` | Body is wiki markup or Markdown, not storage XHTML | header doesn't start with `<p`, `<h`, `<ac:`, or `<table`; presence of `---` front-matter fences |
| `B-LOCAL-FS-LINK` | Body contains `file://`, `~/`, or `/home/masi1023/` paths | grep |
| `B-CUSTOMER-PII` | Customer name, hostname, or payment info in body | grep + manual review |
| `B-PARENT-LOOP` | Parent resolves to a descendant of itself | `confluence_get_page` ancestry walk |

## MAJOR

| ID | Rule | How to detect |
|----|------|---------------|
| `M-UNRENDERED-MACRO` | `{plantuml}`, `{code}`, `{info}`, `{note}`, etc. not in proper storage form | grep for unclosed or naked `{...}` macros |
| `M-BROKEN-LINK` | Internal link points to a page id that doesn't exist or a URL that 404s | `confluence_search` for the target title; HEAD on the URL |
| `M-MISSING-ALT` | Image element without `ac:alt` | grep for `<ac:image` without `ac:alt` |
| `M-DIAGRAM-IN-PANEL` | PlantUML block inside an info / note / warning panel | grep + structure check |
| `M-DIAGRAM-IN-CODE` | PlantUML block inside a `{code}` block | grep + structure check |
| `M-CODE-NO-LANG` | `{code}` block without `language` parameter | grep + structure check |
| `M-EMPTY-SECTION` | Section heading followed by nothing or a single sentence | structure walk |
| `M-STALE-SECTION` | Section in draft was deleted from upstream since the last pull (update flow) | diff against `confluence_get_page_content` |
| `M-SLOP-CLUSTER` | `unslop` skill returns >5 fixes for a 30-line block | unslop report count |
| `M-NO-SUMMARY` | First paragraph is missing for a how-to or runbook | structure check |
| `M-OVER-300` | Page body is over 300 lines and no justification header exists | `wc -l` |

## MINOR (PASS with note)

| ID | Rule | How to detect |
|----|------|---------------|
| `m-HEADING-LEVEL` | Skipped heading level (h1 → h3 with no h2) | structure walk |
| `m-MISSING-ANCHOR` | Cross-page reference without an explicit anchor text | structure walk |
| `m-LOOSE-LINK` | "click here", "this link" | grep |
| `m-EMOJI-IN-HEADING` | Emoji in headings that (h1 / h2) | grep |
| `m-CAPITALIZED-LINE` | Long uppercase run (more than 5 words) | grep |
| `m-MULTI-COLON` | Multiple consecutive `:` in a sentence | grep |
| `m-RUN-ON-LINE` | A single line over 200 chars | `awk '{ print length, NR }'` |

## Severity → verdict

```
BLOCKER > 0  → BLOCK
MAJOR   > 0  → REVISE
MINOR   > 0  → PASS (with note)
```

A single BLOCKER short-circuits. The reviewer still lists MAJOR / MINOR
findings so the author can fix them in the same pass.

## Diff mode (updates)

When the reviewer is called for an update, also run:

| ID | Rule |
|----|------|
| `D-UNINTENDED-DROP` | A section in the upstream body that the draft does not have (and was not intentionally removed by `versionMessage`) |
| `D-UNINTENDED-RENAME` | A heading in the upstream body that the draft has under a different name |
| `D-STALE-VERSION` | The `versionMessage` does not match the change set |

`D-` rules are MAJOR by default; BLOCKER only if the dropped content was
flagged as load-bearing by the previous reviewer.

## What the reviewer does NOT check

- Correctness of the technical content — that's an SME responsibility
- Style / voice — that's `unslop`
- Compliance with team conventions outside this list — escalate to the page
  owner
