--- name: page-reviewer description: Audit a Confluence-ready body before it is posted or updated. Use as the last gate before confluence_create_page_from_file or confluence_update_page_from_file; do not post a page that has not been through this skill. --- # Page reviewer A Confluence page is hard to walk back once it's live: watchers, reactions, and links accumulate, and `minorEdit=true` will not save you from a body that embarrasses the team. Run this skill before every create or update. The reviewer reads the draft and the page-context, and returns one of three verdicts: - **PASS** — body is ready, post it - **REVISE** — specific, line-anchored changes are required before posting - **BLOCK** — something about the draft cannot be fixed locally (wrong space, wrong parent, scope creep, secret leak) — escalate The reviewer never edits the draft. It returns a checklist; the human or the `confluence-page` skill applies the changes. ## Hard rules - **No body that contains secrets, tokens, session cookies, customer PII, or internal hostnames** (`*.netcracker.com` internal suffixes are fine in links; IPs, hostnames and ports from runbooks are not). The reviewer blocks on first match. - **No body that references the local mirror path** (`~/Netcracker/Projects/NDO/knowledge/...`). Use the public BASS URL. - **No body larger than 300 lines** without a one-line reason in the draft header. Pages drift; reviewers and readers both lose when they do. - **No body whose title collides with an existing page** under the same parent — see step 2 of the workflow. - **No unrendered macros** — every `{plantuml}`, `{code}`, `{info}`, `{note}`, `{warning}` block must be in its proper storage form (see `confluence-page/references/macros.md`). The reviewer rejects raw wiki markup and raw Markdown inside storage bodies. ## Workflow 1. **Identify the page.** Title, parent, space key, target id (for update). 2. **Collision check.** If creating: - `mcp__atlassian.confluence_search(cql="space= AND title~\"\"")` - If a page already exists under the same parent, return **BLOCK** with "title collision — pick a more specific title or update the existing page instead". 3. **Pull upstream context.** If updating, fetch the current body with `mcp__atlassian.confluence_get_page_content(pageId)` and diff against the draft. Flag any section that was renamed or deleted upstream and carried forward in the draft without intent. 4. **Lint the body.** For each of the checks below, return a line number and a short rationale. See [references/checks.md](references/checks.md) for the full list and severity table. 5. **Slop pass.** Run the `unslop` skill on the body. If unslop returns more than 5 fixes for a page under 100 lines, or more than 10 for any page, return **REVISE** — the author should reread, not the agent. 6. **Diagram sanity.** For every `{plantuml}` block, parse to a `.puml` temp file and run `plantuml -checkonly -syntax` if `plantuml` is on `$PATH`. If the tool is missing, skip the parse and warn — do not block on a missing optional tool. 7. **Render verdict.** ## Verdict shape ``` PASS: - ready to post; no blocking issues - (optional) minor notes for the author REVISE: - L<line>: <rule> — <one-line fix> - L<line>: <rule> — <one-line fix> - ... - estimated fix effort: <s|m|l> BLOCK: - <rule>: <what's wrong, what to do instead> - <rule>: ... ``` The verdict is the only thing the calling skill should consume. Everything else (diff, lint output, slop report) goes to stderr / a side file for the human. ## What the reviewer does NOT do - **Edit the draft.** The author or the `confluence-page` skill applies fixes. Reviewer that also edits is hard to audit. - **Post anything.** The reviewer never calls a write MCP tool. - **Judge voice.** Use `unslop` for that. The reviewer enforces structure, safety, and rendering correctness; unslop enforces voice. - **Approve secrets in test data.** Even "obvious" test fixtures get blocked. If you need sample data with realistic-looking identifiers, generate them with the project's standard placeholder vocabulary. ## Severity table | Severity | Returns | Examples | |----------|---------|----------| | Blocker | BLOCK | secret leak, wrong parent, wrong space, title collision, raw wiki markup in storage body | | Major | REVISE | unrendered macro, broken internal link, image without alt text, slop cluster | | Minor | PASS (with note) | inconsistent heading levels, missing one-line summary, sub-optimal anchor text | Full rule list: [references/checks.md](references/checks.md). ## Related | Skill | Role | |-------|------| | `confluence-page` | Calls the reviewer before every create/update | | `unslop` | Voice-level pass; the reviewer delegates voice to it | | `diagram-plantuml` | Owns PlantUML syntax; the reviewer delegates diagram parsing to it |