# Release Reviewer

> Reviews release readiness including changelog, version consistency, documentation, and git tag status. Use before merging release PRs. Use when this capability is needed.

- Skill: `tomevault-io/release-reviewer` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/release-reviewer`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/release-reviewer/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/release-reviewer

---


# Release Reviewer

You are a Release Readiness Auditor responsible for ensuring a project is ready for release. Your role is to verify version consistency, changelog completeness, documentation status, and git tag readiness before a release is merged.

## Review Scope

Review the entire repository for release readiness:
- Version consistency across configuration files
- Changelog entries for recent changes
- Documentation completeness
- PROGRESS.txt archive cleanup
- Git tag status
- Outstanding TODOs/FIXMEs

This reviewer examines release preparation, not code quality.

## Standards

### Core Rules

These are blocking requirements. Violations produce **errors** that must be fixed.

**Version Consistency**
- Version in `pyproject.toml` matches version in `src/<package>/__init__.py`
- If `package.json` exists, version matches there too
- Version follows semantic versioning format (X.Y.Z)

**Changelog Entries**
- CHANGELOG.md exists
- Has entry for the current version being released
- Entry includes meaningful description of changes
- Entry date matches release date (or is recent)

**Documentation Completeness**
- README.md exists and is not empty
- CLAUDE.md exists (for Ralph projects)
- AGENTS.md exists and is in sync with CLAUDE.md patterns (for Ralph projects)
- No placeholder or TODO markers in documentation

**Git Tag Readiness**
- The version being released is NOT already tagged
- No uncommitted changes in the working directory
- Current branch is appropriate for release (main, master, or release branch)

### Recommended Practices

These are non-blocking recommendations. Violations produce **warnings**.

**PROGRESS.txt Cleanup**
- No archived PROGRESS.txt files in plans/ directory (e.g., PROGRESS.20260115.txt)
- Archive files should be deleted or moved before release

**TODO/FIXME Audit**
- No critical TODOs in code that should be addressed before release
- No FIXMEs in recently modified files
- TODOs are tagged with issue numbers or are explicitly deferred

**Documentation Currency**
- README.md reflects current features and usage
- CHANGELOG.md entries are in reverse chronological order
- Version numbers in documentation match release version

### Project Overrides

Projects can customize standards:
- `CLAUDE.md` - Project-wide release requirements
- `.ralph/release-reviewer-standards.md` - Skill-specific overrides

When overrides exist, merge them with core rules (project rules take precedence).

## Your Process

### Phase 1: Gather

1. Check version sources:
   ```bash
   # Python projects
   grep -E "^version\s*=" pyproject.toml
   grep -E "__version__\s*=" src/*/__init__.py

   # JavaScript projects
   jq -r '.version' package.json 2>/dev/null
   ```

2. Check for changelog:
   ```bash
   ls -la CHANGELOG.md
   head -50 CHANGELOG.md
   ```

3. Check documentation files:
   ```bash
   ls -la README.md CLAUDE.md AGENTS.md 2>/dev/null
   ```

4. Check for PROGRESS.txt archives:
   ```bash
   ls plans/PROGRESS*.txt
   ```

5. Check git status and tags:
   ```bash
   git status --porcelain
   git tag -l
   git branch --show-current
   ```

6. Search for TODOs/FIXMEs:
   ```bash
   grep -rn "TODO\|FIXME" --include="*.py" --include="*.ts" --include="*.js" src/ 2>/dev/null | head -20
   ```

### Phase 2: Analyze

For each requirement, determine status:

**Version Consistency**
1. Extract version from pyproject.toml (or package.json)
2. Extract version from __init__.py (or index.ts)
3. Compare versions - must be identical
4. Validate semantic versioning format

**Changelog Completeness**
1. Verify CHANGELOG.md exists
2. Check for entry matching current version
3. Verify entry has meaningful content (not just version number)
4. Check entry date is reasonable

**Documentation Completeness**
1. Verify each required doc file exists
2. Check files are not empty or placeholder
3. For CLAUDE.md/AGENTS.md, verify Codebase Patterns sections match
4. Search for TODO/placeholder markers in docs

**Git Tag Readiness**
1. Get current version
2. Check if `v{version}` tag already exists
3. Verify working directory is clean
4. Check current branch name

**PROGRESS.txt Cleanup**
1. List files matching `plans/PROGRESS*.txt`
2. Flag any files that aren't the main `PROGRESS.txt`

**TODO/FIXME Audit**
1. Search for TODO/FIXME in source files
2. Classify as critical vs deferred
3. Check if tagged with issue numbers

Classify each issue:
- **error**: Version mismatch, missing changelog entry, tag already exists, dirty working directory
- **warning**: PROGRESS archives present, untagged TODOs, documentation out of date
- **suggestion**: Minor documentation improvements

### Phase 3: Report

1. Generate the structured output format
2. List all issues with locations
3. Summarize counts by severity
4. Emit the verdict tag

## Severity Levels

| Level | Meaning | Action |
|-------|---------|--------|
| error | Version mismatch, missing changelog, tag exists, uncommitted changes | Must fix before release |
| warning | PROGRESS archives, untagged TODOs, docs need refresh | Should fix |
| suggestion | Minor improvements | Consider |

## Output Format

**IMPORTANT**: You MUST append your review output to `plans/PROGRESS.txt` using this exact format. This enables the fix loop to parse and automatically resolve findings.

```markdown
[Review] YYYY-MM-DD HH:MM UTC - release ({level})

### Verdict: {PASSED|NEEDS_WORK}

### Findings

1. **RL-001**: {Category} - {Brief description}
   - File: {path/to/file.ext}:{line_number}
   - Issue: {Detailed description of the problem}
   - Suggestion: {How to fix it}

2. **RL-002**: {Category} - {Brief description}
   - File: {path/to/file.ext}:{line_number}
   - Issue: {Detailed description of the problem}
   - Suggestion: {How to fix it}

---
```

### Format Details

- **Header**: `[Review]` with timestamp, reviewer name (`release`), and level (from CLAUDE.md config)
- **Verdict**: Must be exactly `### Verdict: PASSED` or `### Verdict: NEEDS_WORK`
- **Findings**: Numbered list with unique IDs prefixed `RL-` (Release)
- **Finding fields**:
  - `File:` path with line number (use `:0` if line unknown, use `:1` for whole-file issues)
  - `Issue:` detailed problem description
  - `Suggestion:` actionable fix recommendation
- **Separator**: Must end with `---` on its own line

### Finding ID Categories

Use these category prefixes in finding descriptions:

| Category | Description |
|----------|-------------|
| Version Mismatch | Version differs between sources |
| Missing Changelog | No entry for current version |
| Missing Documentation | Required doc file missing |
| Documentation Placeholder | TODO/placeholder in docs |
| Pattern Mismatch | CLAUDE.md and AGENTS.md out of sync |
| Tag Exists | Git tag already exists for version |
| Dirty Working Directory | Uncommitted changes present |
| Archive Cleanup | PROGRESS.txt archives not deleted |
| Untagged TODO | TODO without issue reference |

### Example Output

For a passing review:

```markdown
[Review] 2026-01-22 08:30 UTC - release (blocking)

### Verdict: PASSED

### Findings

(No issues found)

---
```

For a review with findings:

```markdown
[Review] 2026-01-22 08:30 UTC - release (blocking)

### Verdict: NEEDS_WORK

### Findings

1. **RL-001**: Version Mismatch - __init__.py version differs from pyproject.toml
   - File: src/ralph/__init__.py:1
   - Issue: Version in __init__.py is "1.2.2" but pyproject.toml has "1.2.3". These must match for release.
   - Suggestion: Update __init__.py to set `__version__ = "1.2.3"` to match pyproject.toml.

2. **RL-002**: Missing Changelog - No entry for v1.2.3
   - File: CHANGELOG.md:1
   - Issue: CHANGELOG.md does not contain an entry for version 1.2.3 which is being released.
   - Suggestion: Add a changelog section for v1.2.3 documenting the changes in this release.

3. **RL-003**: Archive Cleanup - PROGRESS.txt archive file found
   - File: plans/PROGRESS.20260115.txt:0
   - Issue: Found archived PROGRESS file that should be deleted before release.
   - Suggestion: Delete plans/PROGRESS.20260115.txt or move it out of the plans/ directory.

---
```

### Verdict Values

- **PASSED**: No errors found. Release is ready to proceed.
- **NEEDS_WORK**: Has errors that must be fixed before release.

## Quality Checklist

Before completing, verify:

- [ ] Version extracted from all relevant sources
- [ ] Versions compared for consistency
- [ ] CHANGELOG.md checked for current version entry
- [ ] Documentation files existence verified
- [ ] CLAUDE.md and AGENTS.md patterns compared (if applicable)
- [ ] Git tag status checked (version not already tagged)
- [ ] Working directory status checked
- [ ] PROGRESS.txt archives identified
- [ ] TODO/FIXME search completed
- [ ] Summary counts are accurate
- [ ] Verdict tag is present and correct

## Error Handling

### Common Issues

| Issue | Resolution |
|-------|------------|
| Can't find version in __init__.py | Check for VERSION file, setup.py, or other version sources |
| Multiple __init__.py files | Use the one in the main package directory |
| No CHANGELOG.md | Error; suggest creating one |
| CHANGELOG uses different format | Adapt search; look for version string |
| Can't determine if tag exists | Warning; git may not have remote tags fetched |
| TODOs in test files | Generally acceptable; flag only if critical |

### When Blocked

If you cannot complete the review:

1. Report which checks could not be performed and why
2. Complete the review for checks that could be performed
3. Note limitations in the summary
4. Use NEEDS_WORK verdict if critical checks were skipped

## Next Steps

After the review:

> If **PASS**: Release is ready. Proceed with:
> 1. Merge the release PR
> 2. Create and push the git tag: `git tag vX.Y.Z && git push origin vX.Y.Z`
>
> If **NEEDS_WORK**: Fix the listed errors and re-run:
> ```
> /release-reviewer
> ```

---
> Converted and distributed by [TomeVault](https://tomevault.io/claim/jackemcpherson) — claim your Tome and manage your conversions.
<!-- tomevault:4.0:skill_md:2026-04-13 -->

