Skip to content

Run the reviewer swarm

Three reviews are done by agents: data classification, touchpoint declarations (+ grouping into activities), threat stamps. All three run through OpenCode with the model-wtf MCP server as their only way to write.

uv run model-wtf compliance data auto-review        [--unit api] [--workers 16] [--max-rounds 20]
uv run model-wtf compliance touchpoints auto-review [--unit api] [--group-only | --no-group]
uv run model-wtf compliance threats auto-review     [--unit api] [--by topic|touchpoint] [--elements a,b]

What a run looks like

Rounds: each round dispatches the pending items to --workers parallel sessions in batches; what a session wrote is on disk before the next round computes what is still pending. The command exits 0 when nothing is pending, 3 (FINDINGS) when items remain after --max-rounds — re-run to resume, nothing is redone. Ctrl-C is safe: stamps and lock entries are written per item under a lock.

The narration is one line per decision, with the id and the evidence:

  ✓ api:listRestaurants LB01 (API Manipulation) mitigated  api.py:44-45 response contracted by RestaurantListSchema…
  - api:getRestaurant DE02 (Double Encoding) n/a  the endpoint never decodes strings itself…
  ! F-0060 api:listRestaurants AC09 (Functionality Misuse) missing  api.py:104-108 — an anonymous caller with any address UUID…

Threats: per topic

The default --by topic gives one agent one security question across many touchpoints (with the topic's checklist and each touchpoint's open cells, code location, auth and flows); --by touchpoint gives one agent all the questions on one touchpoint. Measured on FAH, per topic completed in a third of the tokens and found the ownership gaps the other missed. Stamps carry by: agent; a !missing written by an agent is prefixed [agent].

Model and cost

--model provider/model (default openrouter/openrouter/auto); --max-tokens stops starting new rounds past a budget. The summary prints tokens, cost and the models actually used. Prompts are short on purpose: small models answer one narrow question well and fifteen badly.

What the agents cannot do

Everything else. The sandbox denies every tool but the read tools and the one or two model-wtf writes the role needs (review_model, touchpoint_set_data, threat_stamp, flow_report, party_add…). Their output is validated by the same schemas and rules as a human's, and the challenger later doubts it like any other review. CI secrets never reach the agent's environment.