Skip to content

probbit 0.10.0

Latest

Choose a tag to compare

@github-actions github-actions released this 18 Oct 11:11
· 1 commit to main since this release
156a3aa

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 in satisfy_from (env, human; never self or clock), 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.
  • pursue gains want × s × (the expected reduction), capped at pursue.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 read need.<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.liking adds 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 carry surprise (each learned trait's gain above 1) and why says "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 inputs pace_up and pace_down (a host that sends them is refused); why says "pace brisk:
    average reward <R̄> an hour".
  • dispositions: optimism, patience and volatility genes, 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 verify summarises needs (deficit, hours at the cap), pace (rbar, max) and surprise (g_max_seen);
    monitor draws NEEDS, PACE and GAIN rows; lint, fuzz, prove and describe cover every new block.
  • New examples: examples/persona/body.yaml (with its golden and rules) and examples/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.py plays 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, pace or dispositions gives the same stances,
    states, programs and lint, fuzz, prove, describe documents as 0.9.0 (P0 above); its strands differ only in the
    header's engine (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 needs key: still an undeclared
    input, listed in ignored.
  • 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.