The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Withvibe Voter listing page.
Turn any WithVibe env into a team-voted workspace. When this plugin is enabled, the AI doesn't apply a prompt straight away — it opens a proposal the team votes on, and only an approved proposal gets built. Enable it on any env and that env becomes a vote-gated sandbox.
It's content-agnostic — it knows nothing about what the env contains. Whatever the env is (an app, a doc, a 3D scene, a config), enabling Voter makes every change go through the team first. Multiple envs = multiple independent boards.
WithVibe auto-injects an enabled plugin's MCP tools into the agent's turn. Voter uses that to gate prompts without any change to WithVibe core:
voter_propose_change(prompt) — opens a proposal and tells the agent to
not touch anything yet.voter_await_decision(proposal_id) — long-polls the vote. The platform's
MCP bridge caps a single tool call at 60s, so this returns after ~45s with
STILL_VOTING and the agent simply calls it again until it's terminal.APPROVED, the agent makes the change and calls voter_record_change.
On REJECTED / EXPIRED it makes no change.Meanwhile every teammate votes in the plugin's own UI panel — independent of the agent. The gate is agent-cooperative (enforced via tool instructions), which is the right trade-off for a friendly workflow; hardening it to be unbypassable is a later option that would need a small core hook.
| Tool | Purpose |
|---|---|
voter_propose_change | Open a proposal for the requested change. Agent must call this instead of editing. |
voter_await_decision | Long-poll the team's verdict (APPROVED / REJECTED / EXPIRED / STILL_VOTING). |
voter_record_change | Record what shipped after applying an approved change. |
voter_report_failure | Mark an approved change as failed (e.g. build broke). |
voter_status | Show the current board: proposals in voting + recently resolved. |
Four tables in the plugin's isolated Postgres schema (shared-postgres storage):
settings (vote window + thresholds), proposal, vote, feed_event.
Resolution rule: a proposal passes when approvals reach the threshold, fails when rejections reach the threshold, and at the deadline the majority wins (ties expire). Defaults: 600s window, 1 approval / 1 rejection — tune them in the panel.
For the marketplace this is published multi-arch as ghcr.io/withvibe/voter:<version>.
Apache License 2.0. See NOTICE for attribution.