Repository navigation
probbit 0.9.0
probbit 0.9.0
probbit 0.9.0 adds two optional persona blocks from RFC 0001, senses and action-addressed feedback, a rule for
strands written by newer engines, and the probbit check gate with its GitHub Action. A persona without the new blocks
gives the documents 0.8.2 gave, byte for byte.
What changed
Senses (RFC 0001, docs/persona.md §2.11), opt-in
- An optional
sensesblock. The host sends measured readings in declared units with a named source; each reading is
compared with a learned normal per sense (mean, variance, count; a half-life in events; caps on how far the normal and
its variance may move from a declared prior) and moves moods and traits by its capped z-score.whynames the normal
and what the learned weights came from. Readings fromselfor through MCP are refused. live verifysummarises the normals;monitordraws a row per sense and an alert when a normal moved more than half its
cap within 50 events. New example:examples/persona/sensed.yaml(with its golden and rules).
Action-addressed feedback (RFC 0001, docs/persona.md §2.8), opt-in
- An optional
learning.creditblock. An event can mark its decision as awaiting an outcome (await), a reward can name
the decision it pays for (for: <turn>, orfor: {turn, stance}with the stance's digest), and decisions can be
cancelled (cancel). Credit goes to the paid decision's own odds, scaled by an eligibility that halves per
half_life_eventsof delay; at mostmax_opendecisions wait; ambiguous, duplicate, cancelled and unknown payments are
refused whole. Withoutfor, feedback pays the previous stance, as in 0.8.2. - Every stance of a persona with the block carries
credit(the payment, the decisions closed and still open, its own
digest).live verify --actions FILEcompares a host's action log with the released levels;monitordraws the open
decisions;fuzzsends late, reordered, duplicated, cancelled and unknown payments; the MCP turn tools refusecancel.
New example:examples/agent-harness/addressed.json.
Strands from newer engines (docs/persona.md §5.7) and the host contract (§7)
live verify(CLI, Pythonlive_verify, MCPprobbit_live_verify) reports a header key, a persona or state field, a
line kind or a line field this engine does not know asunsupported by this engine: <field>, exit 5, with
{ok: false, line, unsupported, engine, strand_engine}; never as a divergence. A tampered strand still diverges at its
line (exit 1).probbit checklists such a strand as unsupported, never as FAIL.- docs/persona.md §7 states the host contract in three paragraphs: one outcome per stance; host event ids and duplicate
delivery; restart time.
probbit check and the GitHub Action
probbit check PERSONA [--props FILE] [--strand FILE]... [--seeds LIST] [--depth N] [--hours LIST] [--json]: one gate
for CI. It runspersona proveon each rule (does the rule hold for every stance the persona can reach), fuzzes the rules
the bound leaves unknown, and replays every strand. Exit 0: every rule held and every strand replayed; 1: a rule broken,
an unresolved habit contradiction or a failing strand; 3: only unproven rules; 2: bad input.- The repository is a composite GitHub Action (
uses: BitmapAsset/probbit@v0.9.0): it installs probbit, runs
probbit check --json, annotates broken rules and failing strands as errors and unproven rules as warnings, and uploads
the report. Linux and macOS runners. - New:
examples/persona/dispatch-policy.yaml(an agent that learns whether to act or ask) and the rule-check demo
examples/rule-check/demo.py. - Fixed:
cargo +1.78.0 test --workspace --lockedcompiles again (the build's minimum Rust version was unaffected).
Measured (BENCHMARKS.md §10 and §11, a development build of 0.9.0; bars frozen before measurement)
| bar | measured | bar value | result |
|---|---|---|---|
| b1 habituation | zd at reading 20 / reading 1 = 0.304149; 4,522 values against an independent Python sense step, 0 differ | ≤ 0.35; 0 | pass |
| b2 a changed rate stands out | z after 40 quiet readings / after 40 at rate 0.3 = 3.422977 | ≥ 2 | pass |
| b3 genes | individuals 0-99 whose zd at reading 20 is below reading 1: 100 % | 100 % | pass |
| b4, b5 the named past | why equals its template: 100 % of 232; a cited value differs between two lives: 100 % of 116 |
≥ 95 % | pass |
| c1-c4 credit | the applied step equals the reference learner's: 100 % of 8,393 payments and of 15,000 events; open outcomes accepted: 100 % of 3,802; bad payments refused: 100 % of 2,793, 50 of 50 runs byte-identical without them | ≥ 99 % / 100 % | pass |
| d replay | 0 differing bytes over 80 lives (third and split copies); 0 live verify failures over 240 strands; the 0.8.2 strand verifies |
0 | pass |
| e habits | 0 violations and 0 independent breaks over 9,442 stances; 72 where a habit bound | 0; ≥ 50 | pass |
| a1 twins | share of 20 probes whose host action differs between one individual's two lives: 0.145 (95 % interval 0.096 to 0.199); with addressed feedback 0.1725 (0.1175 to 0.235) | ≥ 0.30, interval low ≥ 0.20 | fails |
| a2 twins | odds distance between two lives vs between two individuals in one room: 0.1307 vs 0.1329 (room A), 0.1411 (room B); addressed 0.1223 vs 0.1366 | ≥ the smaller | fails |
a1 and a2 are findings, reported as measured and not tuned: two lives of one individual differ less than the bars asked.
They do not touch the blocks' arithmetic, which bars b, c, d and e check against independent Python recomputations.
Unchanged for existing personas (P0). The frozen corpus recorded with the released 0.8.2 binary (every shipped
persona and example x seeds 0-2 x four committed scripts, plus init, check, describe, compile, lint, fuzz and
prove documents): 653 outputs, 0 differ. 629 are byte-identical; 24 are live stderr streams that gain one notice line
where a script sends senses, await, for or cancel to a persona without the matching block.
What stays the same, what to watch
- Opt-in: nothing changes for a persona without
sensesorlearning.credit. Stances, states, programs and the
lint,fuzz,proveanddescribedocuments are as in 0.8.2; a strand differs only in its header'sengine
(probbit 0.9.0) and the hash chain that follows from it. - New notices on stderr (once per run) when such a persona receives
senses,await,fororcancel: still
undeclared inputs, listed inignored. - New exit code 5 from
live verifyfor a newer engine's strand (0.8.2 answered exit 1, "diverges"). A gate that treats
every non-zero exit as a failure still fails on such strands. - The monitor's panel of the event's inputs is labelled INPUTS (it was SENSES).
Install
curl -fsSL https://raw.githubusercontent.com/BitmapAsset/probbit/main/install.sh | sh
irm https://raw.githubusercontent.com/BitmapAsset/probbit/main/install.ps1 | iex
npm i -g probbit
cargo install probbit-cli
PROBBIT_VERSION=v0.9.0 pins the shell installer; from source, with Rust 1.78 or later:
cargo install --git https://github.com/BitmapAsset/probbit --tag v0.9.0 probbit-cli. Each archive's SHA-256 is checked
before anything is installed. (cargo install probbit-cli works once the crates are on crates.io.)