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:
@@ -29,11 +29,13 @@ verifies each one against the actual code, and posts its findings as a comment.
|
||||
|
||||
```
|
||||
cmd/gadfly/ the reviewer binary — pure producer of review markdown (stdout)
|
||||
main.go agent orchestration: review pass + adversarial recheck pass, budgets
|
||||
main.go orchestration: loop specialists, each a review pass + adversarial recheck
|
||||
specialists.go specialist lenses: built-ins, default suite, env + .gadfly.yml resolution
|
||||
consolidate.go verdict parsing + one-comment consolidation (a section per specialist)
|
||||
model.go provider/model resolution (majordomo.Parse) + env endpoint aliases
|
||||
tools.go the 5 read-only repo tools (read_file/list_dir/grep/find_files/get_diff)
|
||||
recheck.go second-pass verification prompt + verdict recompute
|
||||
*_test.go sandbox, recheck, wrap-up, and spec/endpoint-parse unit tests
|
||||
*_test.go sandbox, recheck, wrap-up, spec/endpoint-parse, specialist-resolution tests
|
||||
scripts/run.sh fetch PR diff+meta, run the binary, upsert ONE labeled PR comment
|
||||
scripts/system-prompt.txt the reviewer persona + verification discipline (generic, not repo-specific)
|
||||
entrypoint.sh container brains: trigger gating, PR clone, model loop (the logic that
|
||||
@@ -78,10 +80,19 @@ GADFLY_SYSTEM_FILE=scripts/system-prompt.txt ./gadfly
|
||||
|
||||
## Configuration
|
||||
|
||||
The full env reference lives in the **README** (`Models & providers` + `Configuration`).
|
||||
Provider selection: `GADFLY_PROVIDER` (default `ollama-cloud`), `GADFLY_MODEL`/`GADFLY_MODELS`,
|
||||
`GADFLY_BASE_URL`, `GADFLY_API_KEY`. Named endpoint aliases via `GADFLY_ENDPOINT_<NAME>` /
|
||||
`GADFLY_ALIAS_<NAME>` (http-capable) and majordomo `LLM_*` DSNs (HTTPS-only).
|
||||
The full env reference lives in the **README** (`Specialists`, `Models & providers`,
|
||||
`Configuration`). Provider selection: `GADFLY_PROVIDER` (default `ollama-cloud`),
|
||||
`GADFLY_MODEL`/`GADFLY_MODELS`, `GADFLY_BASE_URL`, `GADFLY_API_KEY`. Named endpoint aliases via
|
||||
`GADFLY_ENDPOINT_<NAME>` / `GADFLY_ALIAS_<NAME>` (http-capable) and majordomo `LLM_*` DSNs
|
||||
(HTTPS-only).
|
||||
|
||||
**Specialists (the swarm):** the reviewer runs a suite of focused lenses, one consolidated
|
||||
comment with a section each. Default suite = security/correctness/maintainability/performance/
|
||||
error-handling; opt-in built-ins = tests/docs/conventions/improvements. Select via
|
||||
`GADFLY_SPECIALISTS` (csv or `all`); define/override via `GADFLY_SPECIALIST_<NAME>` env or a repo
|
||||
`.gadfly.yml` (`specialists:` + `define:`). See `cmd/gadfly/specialists.go`. Cost ≈
|
||||
specialists × models × 2 passes — keep the default model count low (entrypoint defaults to one).
|
||||
Dynamic `auto` selection (a cheap model picks lenses per-diff) is the planned next step.
|
||||
|
||||
**Tested vs untested:** only the Ollama paths (local + OpenAI-compatible pointed at Ollama)
|
||||
are actually exercised. OpenAI/Anthropic/Google come from majordomo's abstraction and are
|
||||
|
||||
Reference in New Issue
Block a user