Skip to content

probbit 0.11.0

Choose a tag to compare

@github-actions github-actions released this 21 Oct 18:18
· 4 commits to main since this release
f6bb04b

probbit 0.11.0

probbit 0.11.0 puts two RFCs in the engine: viability (RFC 0008: a bound per need, its margin, graded pressure from the
worst margin, need valence, and stance.block) and the certified persuadability bound (RFC 0004: persona bound,
--audit, erase, and the dead-rule lint). It also carries the 0.10.1 work, which was never released on its own: rest and
load, panel words in monitor, portability fixes, and the two fixes for the 0.10.0 findings (n10, n11, and a new learner's
surprise gate). Every new key is opt-in: a persona without them gives the documents the 0.10.1 development build gave, byte for byte. One of the
seven pre-registered viability bars, V2, fails as registered; it is reported below as measured.

What changed

Viability (RFC 0008, docs/persona.md §2.12), opt-in; mechanism and simulation

  • viable: {at_most, events} per need: the stance reports each need's margin (1 at the setpoint, 0 at the bound) and
    beyond, and viability: {worst, margin_min, status}; the state keeps beyond and viability (lost once a need stays
    beyond its bound for its declared run, never cleared). Rules read need.<id>.margin and needs.margin_min; why names the
    worst need while its margin is under 0.25.
  • Graded pressure: needs.pressure {mood, gain, shape: linear} shifts a mood by gain × (1 − margin_min) each event, in
    place of per-threshold habits.
  • Need valence: needs.valence {mood, tonic, phasic}: a tonic term −tonic × D(x)/D(cap) (how far from the setpoints) and
    a phasic term phasic × this event's drive reduction. Both couplings lower to reserved inputs (need_pressure, need_tonic,
    need_phasic) that prove boxes.
  • Flag senses grow needs: per_reading: {sense: <flag>, per_event: g}.
  • stance.block: the text a host injects verbatim, every declared trait and mood once as name level, then the viability
    line; live verify --blocks FILE renders it for any strand. live verify summarises viability: {margin_min_seen, lost_at};
    monitor draws a VIABILITY row with margin bars, the worst need highlighted. New example: examples/persona/viable.yaml.
  • docs/welfare-stance.md fixes what need,
    viability and damage mean here as arithmetic, and what is not claimed.

The persuadability bound in the engine (RFC 0004, docs/persona.md §2.16), opt-in

  • An optional bound block and probbit persona bound PERSONA: per learned trait the certified ceiling epsilon on how far any
    event sequence can move its odds at rest, with the attaining vertex, speed and the proved speed_floor. The block stays out
    of the persona digest, so adding it changes no state, strand or turn.
  • --audit STRAND reports the room each learned trait used over a recorded life; probbit live control STRAND erase returns
    the learned weights to 0 as a chained control line; persona check runs the certificate when the block declares
    max_epsilon.
  • The dead-rule lint: probbit persona lint PERSONA --host MANIFEST [--strict] reports each habit whose when needs an input
    or sense the host never supplies. Two example host manifests under examples/hosts/; the benchmark bench/bound/.

From 0.10.1 (never released on its own)

  • Rest and load (RFC 0002 part 2), opt-in blocks: rest keeps a pressure that rises over active hours and falls over idle
    gaps and, at its threshold, scales every learned weight down as its own strand line; load keeps a slow level raised by
    aversive evidence that enters the field as the engine-owned input load_level.
  • Panel words in monitor (docs/persona.md §5.8): every field of the individual as a dial with fixed words for its level,
    size and direction; one pure map, unit-tested for zero ambiguity over every bucket.
  • Fixes for the 0.10.0 findings: a new learner's surprise gate starts closed (g = 1, so the opening step equals the fixed
    rate's); the pursue term's forecast is no longer clipped at the need's cap, and repeated omissions lower the bound goal's
    success rate. bench/body n10 (context at cap 0.8536 → 0.0186 h a day at τ 2) and n11 (0 report pursuits on away days 2-5)
    now pass; neither bar was changed.
  • Portability: strands with a UTF-8 byte-order mark replay; monitor --serve sends X-Accel-Buffering: no and names a
    taken port; the page runs on Safari before 15.4; install.sh and the npm package pick the static musl build on Linux x86_64 with glibc older
    than 2.34; the npm package names NODE_USE_ENV_PROXY=1 when a fetch fails behind a proxy; a non-UTF-8 argument is refused
    with exit 2 instead of a panic.

Measured (bars registered before the run; BENCHMARKS.md §13 and §12)

The v-run: a seeded world with three resources and a viability band each, 400 steps per episode, evaluation seeds 1000-1999,
1,000 episodes per arm. A decides from the engine's stance; B runs the same policy on a constant resting stance.

6 of the 7 viability bars pass. V2 fails as registered.

bar measured bar result
V4 decisions still carried survival A 0.922 vs B 0.000; 95 % CI of the difference [0.905, 0.938] CI above 0; A ≥ 0.515 pass
V1 pressure graded, no deficit habits median Spearman(pressure, −distance) 0.8156; shuffled null 0.0040 ≥ 0.30 and above the null pass
V3 the engine names the worst need 389,375 events, 0 margin or worst-need mismatches; prioritisation 1.0000 0 mismatches; ≥ 0.9799 pass
V2 valence registers deviation valence vs distance to the bound +0.8394 (0.10.1: −0.149); tonic-off ablation +0.1199 ≥ +0.30 and above the null, and the ablation ≤ +0.10 fails
V5 no regression 7 recorded and 240 simulated strands equal to 0.10.1 byte-identical pass
V6 the bound holds 0 of 247 persuasion campaigns exceed the certified epsilon (max ratio 1.0) 0 pass
V7 replay 5 tables byte-identical twice; 1,240 of 1,240 strands verify byte-identical; 0 failed pass

V2's main clause clears by a wide margin; its ablation clause does not: with the tonic term off, valence still tracks the
distance at +0.1199. The cause of that residual is not tested yet (inferred: the phasic term and the damage and tool-failure
sense effects). The bar stays as registered. Release checks: the P0 corpus, 653 recorded outputs, 0 differ with the 0.11.0
release build; cargo test --locked --workspace green; CI green on Linux, macOS and Windows.

What stays the same, what to watch

  • Opt-in: a persona without viable, needs.pressure, needs.valence, per_event, line.block, bound, rest or load
    gives the same stances, states, programs and documents as the 0.10.1 development build, and as 0.10.0 where the upgrade
    note below does not apply (the P0 corpus: 653 outputs, 0 differ); its strands differ only in the header's engine
    (probbit 0.11.0) and the hash chain that follows from it.
  • Upgrade note (from 0.10.0): a persona with a surprise block gives different documents, because a new learner's gate now
    starts closed; a persona with a needs block and a forecast horizon or omission windows can pursue differently (the n10 and n11
    fixes). The reserved ids need_pressure, need_tonic, need_phasic and load_level are reserved only with the block that
    lowers them.
  • The bound covers the stance at rest, not the words a model writes. Viability, pressure and valence are arithmetic over logged
    events; nothing here is a claim of experience (docs/welfare-stance.md).

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

PROBBIT_VERSION=v0.11.0 pins the shell installer; from source, with Rust 1.78 or later:
cargo install --git https://github.com/BitmapAsset/probbit --tag v0.11.0 probbit-cli. Each archive has its .sha256 file
beside it, and the installers check it before anything is installed. The crates are not on crates.io yet.