Repository navigation
probbit 0.11.0
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'smargin(1 at the setpoint, 0 at the bound) and
beyond, andviability: {worst, margin_min, status}; the state keepsbeyondandviability(lostonce a need stays
beyond its bound for its declared run, never cleared). Rules readneed.<id>.marginandneeds.margin_min;whynames the
worst need while its margin is under 0.25.- Graded pressure:
needs.pressure {mood, gain, shape: linear}shifts a mood bygain × (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 termphasic ×this event's drive reduction. Both couplings lower to reserved inputs (need_pressure,need_tonic,
need_phasic) thatproveboxes. - 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 asname level, then the viability
line;live verify --blocks FILErenders it for any strand.live verifysummarisesviability: {margin_min_seen, lost_at};
monitordraws 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
boundblock andprobbit 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,speedand the provedspeed_floor. The block stays out
of the persona digest, so adding it changes no state, strand or turn. --audit STRANDreports the room each learned trait used over a recorded life;probbit live control STRAND erasereturns
the learned weights to 0 as a chained control line;persona checkruns the certificate when the block declares
max_epsilon.- The dead-rule lint:
probbit persona lint PERSONA --host MANIFEST [--strict]reports each habit whosewhenneeds an input
or sense the host never supplies. Two example host manifests underexamples/hosts/; the benchmarkbench/bound/.
From 0.10.1 (never released on its own)
- Rest and load (RFC 0002 part 2), opt-in blocks:
restkeeps 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;loadkeeps a slow level raised by
aversive evidence that enters the field as the engine-owned inputload_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 --servesendsX-Accel-Buffering: noand names a
taken port; the page runs on Safari before 15.4;install.shand the npm package pick the static musl build on Linux x86_64 with glibc older
than 2.34; the npm package namesNODE_USE_ENV_PROXY=1when 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,restorload
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'sengine
(probbit 0.11.0) and the hash chain that follows from it. - Upgrade note (from 0.10.0): a persona with a
surpriseblock 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 idsneed_pressure,need_tonic,need_phasicandload_levelare 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.