feat: specialist suite — configurable + custom review lenses (one consolidated comment)
Build & push image / build-and-push (push) Successful in 8s
Build & push image / build-and-push (push) Successful in 8s
Replace the single generic review with a suite of focused specialists, each its own review+recheck pass, merged into ONE comment (a collapsible section per lens, led by the worst verdict; the optional `improvements` lens never escalates it). - cmd/gadfly/specialists.go: built-in lenses + default suite (security, correctness, maintainability, performance, error-handling) + opt-in (tests, docs, conventions, improvements). Selection via GADFLY_SPECIALISTS (csv/"all"); custom defs via GADFLY_SPECIALIST_<NAME> env and a repo .gadfly.yml (specialists + define). Precedence: built-ins < file < env. Unknown names error but don't sink the run. - cmd/gadfly/consolidate.go: verdict parse + one-comment render. - main.go: loop specialists; per-lens failure is an inline notice, never fatal. Default timeout bumped to 600s (suite runs sequentially). - base system prompt trimmed to persona+tools+discipline+output; lens-specific focus is appended per specialist (semantic re-derivation discipline kept in base). - entrypoint default models -> single model (suite already gives breadth; cost ~= specialists × models × 2). Adds gopkg.in/yaml.v3. - docs/examples: README "Specialists" section, examples/.gadfly.yml, stub var, CLAUDE.md architecture/config. Dynamic `auto` selection is the planned next step. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -102,6 +102,46 @@ which Gadfly also honors — but those are **HTTPS-only**, so for plaintext loca
|
||||
> **Gitea Actions note:** repo `vars`/`secrets` aren't auto-exposed as env — add each alias to
|
||||
> the stub workflow's `env:` block, e.g. `GADFLY_ENDPOINT_BIGBOX: ${{ vars.GADFLY_ENDPOINT_BIGBOX }}`.
|
||||
|
||||
## Specialists (the review swarm)
|
||||
|
||||
Instead of one generic reviewer, Gadfly runs a **suite of specialists** — each a focused lens
|
||||
with its own review (+recheck) pass — and merges them into **one comment**, a collapsible
|
||||
section per lens, led by an overall verdict (the worst across lenses; the optional
|
||||
`improvements` lens never escalates it).
|
||||
|
||||
**Default suite** (when nothing is configured):
|
||||
`security`, `correctness`, `maintainability` (code cleanliness), `performance`, `error-handling`.
|
||||
|
||||
**Also built in** (opt-in by name): `tests`, `docs`, `conventions`, and `improvements`
|
||||
(strict & quiet — at most 1–2 high-value, non-blocking suggestions, silent otherwise).
|
||||
|
||||
Select which run with **`GADFLY_SPECIALISTS`** (comma-separated names, or `all`):
|
||||
|
||||
```yaml
|
||||
GADFLY_SPECIALISTS: "security,correctness,maintainability,tests"
|
||||
```
|
||||
|
||||
**Define your own** — two ways, which compose (env overrides file overrides built-ins):
|
||||
|
||||
```yaml
|
||||
# 1. env: GADFLY_SPECIALIST_<NAME>="<focus>" (also overrides a built-in by reusing its name)
|
||||
GADFLY_SPECIALIST_MIGRATIONS: "Review DB migrations for destructive or unindexed changes."
|
||||
GADFLY_SPECIALISTS: "security,correctness,migrations"
|
||||
```
|
||||
|
||||
```yaml
|
||||
# 2. a repo .gadfly.yml at the repo root (version-controlled). See examples/.gadfly.yml:
|
||||
specialists: [security, correctness, maintainability, migrations]
|
||||
define:
|
||||
- name: migrations
|
||||
title: "🗃️ DB migrations"
|
||||
focus: "Review schema migrations for destructive ops, missing indexes, table locks."
|
||||
```
|
||||
|
||||
> **Cost:** each specialist is its own review+recheck, so cost ≈ *specialists × models × 2*.
|
||||
> The default suite runs on a **single** model. Trim with `GADFLY_SPECIALISTS`, and a future
|
||||
> `auto` mode will let a cheap model pick only the lenses a given diff actually needs.
|
||||
|
||||
### Triggers
|
||||
|
||||
1. A **new/reopened/ready** non-draft PR — automatic.
|
||||
|
||||
Reference in New Issue
Block a user