Repository navigation
probbit 0.10.0
probbit 0.10.0 adds part 1 of RFC 0002, the body: optional needs with an omission window, valence, a surprise
gate on learning, a pace level from recent reward, and three dispositions genes. A persona without these blocks
gives the documents 0.9.0 gave, byte for byte. Two of the 31 pre-registered bars fail (n10, n11); they are reported below
as measured.
What changed
Needs and the omission window (RFC 0002 Design A, docs/persona.md §2.12), opt-in
- A need is a deficit that grows with use or time (per stamped hour, per raw reading of a number sense) up to a cap. An
event that reduces it, from a source the need lists insatisfy_from(env,human; neverselforclock), pays a
win to the need's bound goal sized by the drive reduction: r = D(x) − D(x with x_j ← |x_j − a|), D = (Σ w x^4)^(1/3).
An amount of 0.2 pays 2.0229 times more at deficit 0.8 than at 0.2, and −0.117 at deficit 0. pursuegains want × s × (the expected reduction), capped atpursue.cap; s, the goal's success rate, rises on a win
and falls when the goal's window expires unanswered.- Goals take
expect_by_hours: a window opens when a released stance pursues the goal, counts down stamped hours, closes
on a win and fires once at 0 (why: "an expected win did not come"). Rules readneed.<id>.deficit. - Refused: undeclared amounts, amounts ≤ 0 or above the cap, the same amount twice, a source the need does not list,
engine-owned ids sent as inputs, amounts through the MCP turn tools.
Valence (Design E, docs/persona.md §2.9), opt-in; a simulation
drives.valence: {mood, expect, surprise}(0 < expect < surprise): the named mood moves by expect × the expected
value of the goal pursued before, plus surprise × the turn's prediction error.afterglow.likingadds a gain on the win
itself, with its gene.
Surprise, pace, dispositions (Designs B, C, D, docs/persona.md §2.13-§2.15), opt-in
- surprise: the learned step grows after a run of surprising feedback, at most 3 times and never past
total_cap;
stances carrysurprise(each learned trait's gain above 1) andwhysays "learning fast: feedback changed". - pace: an average of reward over recent hours, R̄ ← clip(R̄ × 0.5^(h/6) + 0.109101 × r, 0, 4), sets a pace level
through the engine-owned inputspace_upandpace_down(a host that sends them is refused);whysays "pace brisk:
average reward <R̄> an hour". - dispositions:
optimism,patienceandvolatilitygenes, fixed by name and seed. Optimism sets the step of a
window that fires; patience multiplies the credit half-life and the deadline.
Tools and examples
live verifysummarisesneeds(deficit, hours at the cap),pace(rbar,max) andsurprise(g_max_seen);
monitordraws NEEDS, PACE and GAIN rows;lint,fuzz,proveanddescribecover every new block.- New examples:
examples/persona/body.yaml(with its golden and rules) andexamples/persona/pacer.yaml(with its golden). - The benchmark
bench/body/(fixtures, seeds and bars v2, frozen before any engine measurement) and the RFC
(docs/rfcs/0002-neuromodulators-and-body.md).bench/body/nulls.pyplays a competent plain-Python null against every
bar: each bar rejects it.
Measured (bench/body, bars v2, PROBBIT_THREADS=1; BENCHMARKS.md §12)
29 of 31 bars pass. n10 and n11 fail.
| bars | measured | result |
|---|---|---|
| n1, n2 drive reduction | 9 and 6 cells within 1e-6 of the closed form; ratio 2.022863; r(0, 0.2) = −0.11696 | pass |
| n3 | 71/71 on both probes; ln-odds errors 4.403e-06 and 3.596e-06 | pass |
| n4, s4 replay | 100 and 1,800 strands: 0 live verify failures, 0 differing bytes in third and split copies; planted changes refused |
pass |
| n5, o4 habits | 0 breaks over 12,600 and 2,390 bound stances (the habit-free twins break 1,317 and 1,709 times) | pass |
| n6, s5, o5 P0 | the 0.8.2 corpus: 653 outputs, 0 differ; spread-0 dispositions: 4/4 pairs identical | pass |
| n7 | the amounts reach the state through turn 4/4, live 4/4, MCP 2/2 | pass |
| n8, n9 | 1.7629 report pursuits per waking day (a fortnight), 0.8429 (absent); context at the cap 0.7771 h a day; 0 non-positive wins | pass |
| s1-s3 surprise | gated / fixed median re-learning turns 0.5-0.6667 in all 9 cells (bar ≤ 0.75); stable-phase movement 1.0343-1.0719 (bar ≤ 1.5); 1,800/1,800 lives within the caps | pass |
| p1a-p1c, p6 pace | R̄ recomputed within 0.0 over 2,000 events; 0 changes from offered stakes; Spearman 0.8414 (bar ≥ 0.7); the loop host within 1.1e-5 of the closed form at gains 0.24, 0.60 and 0.84 | pass |
| o1-o3 dispositions | E settles at the expectile (pooled error −0.001417, bar ≤ 0.01); the gene's sign readable 100/100; twin distance 0.002753 at spread 0.3 (bar ≥ 0.001) | pass |
| v1-v3, om1, l5, r5 | as specified in bench/body/fixtures/bars.md | pass |
| n10 a short horizon pays | hours a day with the context need at its cap: 0.7771 at τ 0, 0.4914 at τ 2 (bar: τ 2 ≤ 0.5 × τ 0 = 0.3886); 0 overshoots | fails |
| n11 the principal away | report pursuits per day over the absence stream: 1.26, 2.15, 2.47, 0.02, 0.0, 0.0, 0.0 (bar: 0 on away days 2-5); after the return: 0.22, 1.13, 1.58 (bar ≥ 0.5 on return days 2-3: met) | fails |
n10 and n11 are design findings: the needs arithmetic matches its closed form (n1-n3), but a short horizon does not cut the
time at the cap by half (−37 %), and one pursuit a day in fifty still happens on the second day of an absence. The bars stay
as frozen; the fix is planned for 0.10.1. Also known: a new learner's surprise gate starts at its open value (g = 2.5), so
"learning fast" can appear before any feedback has changed; a later release decides that starting value.
What stays the same, what to watch
- Opt-in: a persona without
needs,drives.valence,surprise,paceordispositionsgives the same stances,
states, programs andlint,fuzz,prove,describedocuments as 0.9.0 (P0 above); its strands differ only in the
header'sengine(probbit 0.10.0) and the hash chain that follows from it. - New notice on stderr (once per run) when a persona without a needs block receives a
needskey: still an undeclared
input, listed inignored. - New reserved ids exist only with their blocks (
need_<id>,drv_expect,drv_omit,pace_up,pace_down).
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.10.0 pins the shell installer; from source, with Rust 1.78 or later:
cargo install --git https://github.com/BitmapAsset/probbit --tag v0.10.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.