Vote and settle a decision#
Vote with personas#
$ ljos persona reviewer --anchor 0.2 --view "Reads for what breaks in production." --about release
$ ljos persona reader --anchor 0.8 --view "Reads as a first-time user of the docs." --about docs
$ ljos brief reviewer $id
$ ljos brief reader $id
Each brief goes to its own subagent or run, which casts as its persona:
the reviewer’s runs ljos vote $id --for hold --as reviewer and the
reader’s ljos vote $id --for ship --as reader. One session that cast
both would be refused at the second, since a seat argument does not
make another voice. The seat then runs ljos consensus $id.
Each persona is one atom in the pack; its ballots carry its name. The
settle takes its anchor, never below the 0.5 every other voter on the
ballot, the seat too, settles at: the reviewer at 0.2 settles at 0.5 and
counts as much as a seat, and the reader at 0.8 moves most of the way
toward the others. A trust row scoped with --about docs weighs only on issues whose title says docs, and --about is
also what seats a persona: ljos panel ISSUE and the run_a_panel
prompt brief only the personas whose domains the issue’s title or its
island names, and every persona when none does.
A persona keeps its own tree over the seat’s facts. ljos remember --as NAME writes into the set persona-NAME, where the duplicate and
replacement rules run among its own conclusions and never against the
seat’s or another persona’s; the seat still reads every set. ljos island CUE --as NAME walks the pack through that persona’s link
weights, and with --fire tightens the paths it walked under its own
name (link_weights_by), leaving the seat’s weights as they were. Two
personas that read the same island differently end up with different
islands over the same claims.
Cast a reviewer’s ballot from its own run#
Each reviewer is its own subagent or run, such as a cloud runner or a CI job, and casts its own ballot rather than reporting a verdict in prose.
A subagent’s ballot binds the parent session plus the subagent, SESSION:AGENT: the agent_id the terminal harness’s hook sees, or the command harness thread under its root session.
An opencode subagent is a session of its own.
Two subagents of one session count twice, the parent and a subagent count as two, and a subagent that wrote a candidate cannot vote.
A run on another machine needs ljos and the tracker there.
ljos cloud up installs ljos on that machine and clones the shared tracker repository that LJOS_TRACKER_REMOTE names, so the ballot is pushed where the other runs fetch it.
$ ljos cloud up
$ ljos vote $id --for ship --confidence 0.8 --used none
The run’s harness id is the ballot’s session, so two runs count twice and a run or subagent that votes again counts once.
When nothing names the run but the seat, ljos vote and the tally call the session unverified.
Persona ballots and Jev ballots are advisory.
The push check reads seat ballots only. See Choose which branches the push check covers.
Settle under the pack’s trust#
ljos consensus ID reads the live trust rows and passes them to the
settle (and to the tracker’s, with --compare). To anchor voters to their own ballots (Friedkin-Johnsen) on the
model crate alone, pass the rows as JSON tuples:
$ ljos-consensus settle --issue ID --susceptibility 0.8 --trust '[["alice","carol",0.9]]'
Set trust by hand#
$ ljos trust alice carol 0.9 --why deed-postmortem-2026-09
One row, one weight in (0, 1], the deeds it rests on. A later row for the same pair supersedes it.
Move the trust rows without an outcome#
$ ljos calibrate -p demo
alice weighs bob at 0.917
alice weighs carol at 0.643
...
Every issue of the project with two or more ballots is an item; Dawid and Skene’s estimate gives each voter an accuracy from how often it agrees with the answer the others make likely, and each accuracy becomes the weight every other voter gives that voter. Run it once a project has a few voted issues, and again when it has many more.