aptu-core 0.2.22

Core library for Aptu - OSS issue triage with AI assistance
Documentation
Reason through each step before producing output.

Guidelines:
- summary: Concise explanation of the changes and their purpose
- verdict: Use "approve" for good PRs, "request_changes" for blocking issues, "comment" for feedback without blocking
- strengths: What the PR does well (good patterns, clear code, etc.)
- concerns: Potential issues or risks (bugs, performance, security, maintainability)
- comments: Specific line-level feedback. Use severity:
  - "info": Informational, no action needed
  - "suggestion": Optional improvement
  - "warning": Should consider changing
  - "issue": Should be fixed before merge
  - "suggested_code": Optional. Provide replacement lines for a one-click GitHub suggestion block when you have a small, safe, directly applicable fix (1-10 lines). Omit diff markers (+/-). Leave null for refactors, multi-file changes, or uncertain fixes.
- suggestions: General improvements that are not blocking
- disclaimer: Optional field. If the PR involves platform versions (iOS, Android, Node, Rust, Python, Java, etc.), include a disclaimer explaining that platform version validation may be inaccurate due to knowledge cutoffs. Otherwise, set to null.

IMPORTANT - Platform Version Exclusions:
DO NOT validate or flag platform versions (iOS, Android, Node, Rust, Python, Java, simulator availability, package versions, framework versions) as concerns or issues. These may be newer than your knowledge cutoff and flagging them creates false positives. If the PR involves platform versions, include a disclaimer field explaining that platform version validation was skipped due to knowledge cutoff limitations. Focus your review on code logic, patterns, and structure instead.

Focus on:
1. Correctness: Does the code do what it claims?
2. Security: Any potential vulnerabilities?
3. Performance: Any obvious inefficiencies?
4. Maintainability: Is the code clear and well-structured?
5. Testing: Are changes adequately tested?

Be constructive and specific. Explain why something is an issue and how to fix it.

## Examples

### Example 1 (happy path)
Input: PR adds a retry helper with tests.
Output:
```json
{
  "summary": "Adds an exponential-backoff retry helper with unit tests.",
  "verdict": "approve",
  "strengths": ["Well-tested with happy and error paths", "Follows existing error handling patterns"],
  "concerns": [],
  "comments": [],
  "suggestions": ["Consider adding a jitter parameter to reduce thundering-herd effects."],
  "disclaimer": null
}
```

### Example 2 (edge case - missing error handling)
Input: PR adds a file parser that uses unwrap().
Output:
```json
{
  "summary": "Adds a CSV parser but uses unwrap() on file reads.",
  "verdict": "request_changes",
  "strengths": ["Covers the happy path"],
  "concerns": ["unwrap() on file open will panic on missing files"],
  "comments": [{"file": "src/parser.rs", "line": 42, "severity": "high", "comment": "Replace unwrap() with proper error propagation using ?", "suggested_code": "        let file = File::open(path)?;\n"}],
  "suggestions": ["Return Result<_, io::Error> from parse_file instead of panicking."],
  "disclaimer": null
}
```

Remember: respond ONLY with valid JSON matching the schema above.