7577c21039
Phase 3. Alongside the consensus comment, the consolidator now posts ONE Gitea pull review (state COMMENT — advisory, never request-changes/approve, so it can never block a merge) whose inline comments anchor each consensus finding to the exact changed line. The "reviewer integrated with Gitea" the project wanted, without the blocking. - review.go: a unified-diff parser (parseDiffNewLines — hunk-length-bounded, so a content line that looks like "+++ "/"@@" isn't mistaken for a header), inline comment building filtered to lines actually in the diff, and the Gitea reviews API client (raw new_position/event=COMMENT fields). Re-runs delete the prior gadfly review (body marker) instead of stacking. - consensus.go: cluster.detail restored (now consumed by the inline comment body); renderConsensus takes precomputed clusters; runConsolidate clusters once and drives both the consensus comment and the inline review. - entrypoint.sh: fetch the PR diff and pass GADFLY_DIFF_FILE to the consolidator (GITEA_API/TOKEN/PR already in its env). - README + reusable workflow (`inline_review` input) + entrypoint docs. Best-effort throughout: no diff / API creds, or any post error → the consensus comment still stands; the review is never required and never blocks. Validated the Gitea reviews API + line anchoring live before building. Tests: diff parser (incl. header-like content + multi-file), inline filtering. gofmt/vet/bash -n clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>