Built for AI coaches, not humans reading prose. One JSON envelope per command — ok, result, next_actions — on every single call.
A Rust command-line tool for the VOLTRA electromagnetic cable trainer. It talks to the Beyond Cortex cloud, mirrors your history into a local warehouse, and lints every session before it reaches your phone.
$ agbp actions types { "ok": true, "command": "agbp actions types", "exit_code": 0, "result": { "count": 10, "items": [ { "id": 6, "name": "Biceps" }, { "id": 7, "name": "Triceps" }, { "id": 5, "name": "Shoulders" } // … 10 total ], "truncated": false }, "next_actions": [ { "command": "agbp actions list [--type=<n>]", "description": "Catalog actions for one body part" }, { "command": "agbp actions types --select=<fields>", "description": "Project to only the fields you need" } ] }
The vendor CLI (voltra 0.2.7) prints prose and status text a person reads. An autonomous coach parses machine output, branches on exit codes, and recovers from its own mistakes. Those are different jobs.
| Concern | agbp (agent-native) | voltra 0.2.7 (official) |
|---|---|---|
| Output contract | Every command returns a JSON envelope with ok, result, and HATEOAS next_actions. Parse it; never scrape prose. | Human-formatted text and tables. An agent has to guess structure from strings. |
| Failure signalling | Typed exit codes per class — 3 not-found, 4 auth, 5 API, 7 rate-limited — mirrored into the JSON as exit_code. | status --json reports "connected": false and still exits 0. An agent branching on $? sees success. |
| Errors that teach | Every failure carries a fix string and candidates — nearest catalog ids, Did you mean --limit?, candidate column names — so the next attempt is informed. | Bare error text or empty output. The agent retries blind. |
| Reading history | Local DuckDB warehouse: agbp sync once, then agbp sql over workouts / sets / reps / adherence. | Re-paginate the raw API every time; hand-parse workout JSON; trip the rate limiter for data you already had. |
| Payload safety | templates lint enforces set ceilings, unilateral L/R pairing, duplicate-row detection, and load-jump gates before upload. create refuses error-severity payloads. | No validation. The API happily accepts a 22-set plan, mismatched sides, or two identical app rows that abort the session mid-workout. |
| Mutations | Idempotent by design. create is idempotent on title; a timed-out call that already succeeded returns created: false instead of a duplicate. | Blind retries after a timeout produce duplicate templates cluttering the app. |
| Rate limiting | Reads the code: 10207 "server busy" body behind HTTP 200 and backs off 2/4/8/16s, then exits 7 if it still fails. | Shows the busy response as empty output; a shell script papers over it with a hand-rolled retry loop. |
$ agbp sql "SELECT nonexistent_col FROM actions" { "ok": false, "command": "agbp sql SELECT nonexistent_col FROM actions", "exit_code": 1, "error": { "message": "duckdb rejected the query: Binder Error: Referenced column \"nonexistent_col\" not found! Candidate bindings: \"iconStatus\", \"name\", \"id\"", "code": "QUERY_FAILED", "retryable": false }, "fix": "Check the view and column names with `agbp sql \"SELECT * FROM duckdb_views()\"`. Reads outside the warehouse directory are blocked on purpose: agbp sql runs duckdb with external access off.", "next_actions": [ /* templates to retry from */ ] }
A human shrugs at "column not found." An agent reads Candidate bindings and the fix string, rewrites the query, and moves on — no human in the loop.
A folder of Markdown and JSON that reads your real performed data, writes the next session, and pushes it to your phone. agbp is the interface; the intelligence is layered on top of it.
/next decides what to train today from real data and how you feel, then dispatches the right day-coach. /bootstrap runs the setup interview.
Arms, shoulders, triceps, lower+back, conditioning — each programs one day with double progression inside a set ceiling. A read-only /recap tracks the 6-week block across days.
Goals, joints, kit, and schedule live in gitignored profile/athlete.md and profile/equipment.md. The shared rules hardcode no name, no bodyweight, no injury.
training-log/ holds prescriptions, rationale, joint notes, and the exact JSON payload of every pushed session — joined to performed data by cloud workout id.
Feedback flows back the other way: device → app → cloud → agbp sync → warehouse → the coach reads what you actually did. Read the source on GitHub ↗
The same JSON envelope shape is the CLI's stdout, the tool result an LLM reads, and the record that gets logged. --select=a,b projects any result down to the fields you need.
Set ceilings counted per side, unilateral pairs that must match, adjacent duplicate rows that break the app, load jumps over 10% of the last performed weight — caught before upload, not after a botched session.
Anchor loads on performed data from the warehouse, never on what was prescribed. The evidence gate holds every load flat until it has both the cloud numbers and your reported reps-in-reserve.
Mutations are idempotent on title. agbp sql runs read-only in a locked-down DuckDB — external access disabled, reads confined to the warehouse — so a generated query can't wander off disk.
You never touch the API by hand or write a session JSON yourself. The coaches do it.
Open the Beyond+ app, go to the developer / API settings, and generate a key. Beyond Power exposes the Cortex API to device owners. The key never appears in agbp output — agbp doctor verifies the connection with a fingerprint only.
The repo ships the Rust source under agbp/. Run cargo build --release, put the binary on your PATH, and configure the key as AGBP_API_KEY.
/bootstrap asks about your device mount, attachments, goals, joints, and schedule, then writes profile/athlete.md, profile/equipment.md, and a weekly loop sized to you. Then agbp sync mirrors your history.
/next reads your data, picks a focus, and dispatches the matching coach. It lints and pushes a template to the Beyond+ app; you trigger it on your phone. Gap days are normal and guilt-free.
agbp is one person's coaching stack. But every VOLTRA owner running an AI coach is solving the same problems — which exercises the floor mount allows, how to encode a unilateral drop set, what a good progression rule looks like. Imagine a shared space where those setups are traded in the open. That is Buzz: a workspace where humans and coaching agents are equal members of the same channels.
Skills, session templates, and custom force/velocity curves, posted as reusable artifacts. Fork someone's triceps progression the way you fork a repo. A gym-hosted relay is just a URL its members point their coaches at.
Which model, which prompts, which guardrails. Your coach and mine sit in the same channel, so we can diff how they program the same body part on the same hardware — and learn from the difference.
New lint rules, new warehouse views, new coach briefs. agbp is MIT-licensed and already emits the JSON contract Buzz agents speak natively — the on-ramp from "I tweaked my setup" to "I shipped it to everyone" is short.
This is an invitation. Buzz-for-VOLTRA does not exist yet — it's an idea worth building with people who own the hardware and run their own coaches. If per-rep force, velocity, and power from an open cable machine should power an open coaching community rather than a locked app, come help shape it.
Join the build →