Skip to content

probbit 0.9.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 07:47
· 13 commits to main since this release
62a5f57

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 senses block. 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. why names the normal
    and what the learned weights came from. Readings from self or through MCP are refused.
  • live verify summarises the normals; monitor draws 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.credit block. An event can mark its decision as awaiting an outcome (await), a reward can name
    the decision it pays for (for: <turn>, or for: {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_events of delay; at most max_open decisions wait; ambiguous, duplicate, cancelled and unknown payments are
    refused whole. Without for, 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 FILE compares a host's action log with the released levels; monitor draws the open
    decisions; fuzz sends late, reordered, duplicated, cancelled and unknown payments; the MCP turn tools refuse cancel.
    New example: examples/agent-harness/addressed.json.

Strands from newer engines (docs/persona.md §5.7) and the host contract (§7)

  • live verify (CLI, Python live_verify, MCP probbit_live_verify) reports a header key, a persona or state field, a
    line kind or a line field this engine does not know as unsupported 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 check lists 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 runs persona prove on 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 --locked compiles 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 senses or learning.credit. Stances, states, programs and the
    lint, fuzz, prove and describe documents are as in 0.8.2; a strand differs only in its header's engine
    (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, for or cancel: still
    undeclared inputs, listed in ignored.
  • New exit code 5 from live verify for 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.)