Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments #131

Closed
opened 2026-09-04 19:05:04 +01:00 by conductor · 28 comments
Owner

Plain summary

Deploy a reviewer agent on Gitea that runs on every PR — using a local model (Ollama on the 4070 Ti, accessible over LAN) — posting findings as non-blocking PR comments. NOT a replacement for the two-gate reviews; a first-pass filter that adds redundancy against controller degradation (fatigue, drift) and enables fully unattended operation. Reads the review-lessons file; extends it with new findings.

Example

A PR is pushed → the runner triggers a local-model review → it posts 'possible aliasing hazard in returned dict, see review-lessons #3' as a PR comment → the controller addresses it before the human-gate review. Findings are advisory; nothing gates on the local model's opinion.

Technical details

WHAT: a Gitea workflow (on pull_request) that invokes a local model via the act_runner + Ollama (LAN to the 4070 Ti) — reads the diff + review-lessons.md, posts findings as PR comments with a 'first-pass review' label. Findings are NON-BLOCKING (required checks unchanged). The model's hallucinations are noise in comments, not damage in merged code. The reviewer reads + extends the lessons file (compounding).
WHY: the research validates ensemble diversity (Weaver: verifier agreement is the trust signal) — a 5th verifier type (local LLM) adds decorrelation; the deployment enables unattended operation. Position: first-pass filter, not authority.
FILES: .gitea/workflows/first-pass-review.yml (A), the review prompt template (A).
ACCEPTANCE: a PR triggers the local review; findings appear as comments; merge is NOT blocked by them; the lessons file is read.
DEPENDENCIES: the review-lessons file (its brain); the type-check ratchet + CI hygiene (the mechanical checks reduce what the local model must catch).

Pipeline requirements

  • TDD / verification as appropriate
  • Spec-compliance review gate: PASS
  • Code-quality review gate: Approved
  • Full suite regression green
  • Closed with a properly formatted closing comment + commit references
## Plain summary Deploy a reviewer agent on Gitea that runs on every PR — using a local model (Ollama on the 4070 Ti, accessible over LAN) — posting findings as non-blocking PR comments. NOT a replacement for the two-gate reviews; a first-pass filter that adds redundancy against controller degradation (fatigue, drift) and enables fully unattended operation. Reads the review-lessons file; extends it with new findings. ## Example A PR is pushed → the runner triggers a local-model review → it posts 'possible aliasing hazard in returned dict, see review-lessons #3' as a PR comment → the controller addresses it before the human-gate review. Findings are advisory; nothing gates on the local model's opinion. ## Technical details **WHAT:** a Gitea workflow (on pull_request) that invokes a local model via the act_runner + Ollama (LAN to the 4070 Ti) — reads the diff + review-lessons.md, posts findings as PR comments with a 'first-pass review' label. Findings are NON-BLOCKING (required checks unchanged). The model's hallucinations are noise in comments, not damage in merged code. The reviewer reads + extends the lessons file (compounding). **WHY:** the research validates ensemble diversity (Weaver: verifier agreement is the trust signal) — a 5th verifier type (local LLM) adds decorrelation; the deployment enables unattended operation. Position: first-pass filter, not authority. **FILES:** .gitea/workflows/first-pass-review.yml (A), the review prompt template (A). **ACCEPTANCE:** a PR triggers the local review; findings appear as comments; merge is NOT blocked by them; the lessons file is read. **DEPENDENCIES:** the review-lessons file (its brain); the type-check ratchet + CI hygiene (the mechanical checks reduce what the local model must catch). ## Pipeline requirements - [ ] TDD / verification as appropriate - [ ] Spec-compliance review gate: PASS - [ ] Code-quality review gate: Approved - [ ] Full suite regression green - [ ] Closed with a properly formatted closing comment + commit references
conductor added the P2 — medium label 2026-09-04 19:05:05 +01:00

⚠️ Priority gate: this issue has no priority. Assign exactly one of P0 — critical (spine/correctness/blocks), P1 — high (material value or real defect), P2 — medium (quality/consolidation), P3 — low (measurement/deferred). An issue without a priority is not filed.

⚠️ **Priority gate:** this issue has no priority. Assign exactly one of **P0 — critical** (spine/correctness/blocks), **P1 — high** (material value or real defect), **P2 — medium** (quality/consolidation), **P3 — low** (measurement/deferred). An issue without a priority is not filed.
gitea-actions Bot added the custodianfeaturegovernance labels 2026-09-04 19:05:48 +01:00
gitea-actions Bot added the ready label 2026-09-06 05:32:32 +01:00

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (closed: #30); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (closed: #30); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (closed: #29); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (closed: #29); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.
conductor added P0 — critical and removed P2 — medium labels 2026-09-07 11:14:14 +01:00

⚠️ Priority gate: this issue has no priority. Assign exactly one of P0 — critical (spine/correctness/blocks), P1 — high (material value or real defect), P2 — medium (quality/consolidation), P3 — low (measurement/deferred). An issue without a priority is not filed.

⚠️ **Priority gate:** this issue has no priority. Assign exactly one of **P0 — critical** (spine/correctness/blocks), **P1 — high** (material value or real defect), **P2 — medium** (quality/consolidation), **P3 — low** (measurement/deferred). An issue without a priority is not filed.
Author
Owner

#131 local-model first-pass reviewer — OUTWARD evidence trail (fetched 2026-09-07)

  • Gitea OpenAPI (live swagger.v1.json fetch): POST /repos/{owner}/{repo}/issues/{index}/comments — PRs are issues; workflows can post PR comments via API.
  • Gitea token-permissions: Actions jobs get GITEA_TOKEN; permissions: issues: write supported; fork-PR workflows forced READ-ONLY — bots need a PAT escape hatch for forks. https://docs.gitea.com/usage/actions/token-permissions
  • awesome-gitea (official list): ai-git-bot — self-hosted gateway precedent. https://gitea.com/gitea/awesome-gitea
    Design consequence: bot = Actions PR job → local model → Conventional-Comments note (non-blocking) via issue-comment API; issues:write scope; PAT path for forks.

Evidence pulled live from primary sources (docs fetched, CLIs run); 4 dead URLs encountered during research were substituted with working primaries. This comment is the verifiable source trail for the plan.

**#131 local-model first-pass reviewer — OUTWARD evidence trail (fetched 2026-09-07)** - Gitea OpenAPI (live swagger.v1.json fetch): `POST /repos/{owner}/{repo}/issues/{index}/comments` — PRs are issues; workflows can post PR comments via API. - Gitea token-permissions: Actions jobs get GITEA_TOKEN; `permissions: issues: write` supported; fork-PR workflows forced READ-ONLY — bots need a PAT escape hatch for forks. https://docs.gitea.com/usage/actions/token-permissions - awesome-gitea (official list): `ai-git-bot` — self-hosted gateway precedent. https://gitea.com/gitea/awesome-gitea Design consequence: bot = Actions PR job → local model → Conventional-Comments `note (non-blocking)` via issue-comment API; issues:write scope; PAT path for forks. _Evidence pulled live from primary sources (docs fetched, CLIs run); 4 dead URLs encountered during research were substituted with working primaries. This comment is the verifiable source trail for the plan._

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (closed: #177); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (closed: #177); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.

🎓 NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments — dependencies satisfied (scheduled sweep); Rune may start.

🎓 **NEXT: #131 — Local-model first-pass reviewer: Gitea-deployed agent, non-blocking PR comments** — dependencies satisfied (scheduled sweep); Rune may start.
Author
Owner

CLOSED PROGRAMMATICALLY — commit f9f83e0 (contract 131-side of BUILDER-2026-10-08T10:27:52Z-a8b4ae).

CLOSED PROGRAMMATICALLY — commit f9f83e0 (contract 131-side of BUILDER-2026-10-08T10:27:52Z-a8b4ae).
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: conductor/rune#131