Watch
0
0
Fork
You've already forked hyperhive
0
hyperhive/swarm-review-classifier
Repository files (latest commit first)
Filename Latest commit message Latest commit date
atlas 2c6ae15383 swarm-review-classifier: test that Otel::record exports the run's cost
Nothing exercised the real record path: the acp tests use a mock sink and
the cost tests only covered amount(). Split the counter construction and
the add out of Otel::record so a test can run them against an in-memory
exporter, and assert the counter name, the amount and the four labels.

Dev-dependency: opentelemetry_sdk's `testing` feature (same crate; adds
tokio to its lockfile entry).
2026-10-14 10:14:36 +02:00
..
src swarm-review-classifier: test that Otel::record exports the run's cost 2026-10-14 10:14:36 +02:00
tests review classifier: run on ACP when the swarm settings choose it 2026-10-14 10:14:36 +02:00
Cargo.toml swarm-review-classifier: test that Otel::record exports the run's cost 2026-10-14 10:14:36 +02:00
README.md docs: review-classifier truncation sentences in active voice 2026-10-13 21:23:03 +02:00

swarm-review-classifier

The review classifier's try-out service, in the swarm-review-classifier container on the host that sets deploy.review-classifier.enable. The design is docs/swarm/review-classifier.md.

swarm-controller reads a PR (its head commit, its commits and its diff) and sends it, with the operator's classifications, as a request on the queue. This service asks a small model one classification at a time and answers with the result table and the overall verdict. It writes nothing to the forge and holds no forge credential.

What a run is

  • The shared context first: a system prompt, the PR's commits with their full messages, and the diff with lockfiles collapsed as hive-forge diff does. Every classification's prompt starts with the same bytes.
  • One claude --print per classification, with no session, no tools (--tools ""), no MCP server, its own empty directory and ANTHROPIC_API_KEY in its environment only.
  • An answer is a JSON object with a verdict, a certainty and a reason; the classifier truncates a reason over 500 characters to 499 plus …. A failed run, a timeout or an answer that doesn't validate leaves that row without a verdict, and it doesn't count.
  • A run with no API key, or with no classification answered, fails as a whole: the caller sees an error, never a verdict.

Credentials

The container holds one credential: its own store certificate, which nspawn hands in at start without a copy on disk. With it the service reads its queue client secret at start and the API key at every run, so a key written or removed in the store takes effect on the next run. Its store role reads exactly those two paths.