Skip to content

RFC 0002 wave 1a: needs, the omission let-down, valence (0.10.0) - #39

Merged
BitmapAsset merged 14 commits into
mainfrom
rfc2-wave1a-needs
Oct 17, 2026
Merged

BitmapAsset merged 14 commits into
mainfrom
rfc2-wave1a-needs

Conversation

@BitmapAsset

Copy link
Copy Markdown
Owner

RFC 0002 wave 1a, built against the frozen bench (bars v2): the needs block and the needs step, goals[].expect_by_hours
with the omission let-down, drives.valence with afterglow.liking. Stacked on rfc2-wave0-freeze. Draft, for CI on Linux,
macOS and Windows.

  1. Head 8e2600c0e5cd782a123d22c0f9362553662f8982 on rfc2-wave1a-needs; base rfc2-wave0-freeze at 889a993 (bars v2);
    version 0.10.0, unreleased.
  2. This draft PR, base rfc2-wave0-freeze; CI: the ci and check runs on the head (below).
  3. Suite and MSRV: cargo +stable test --workspace --locked --no-fail-fast: 32 targets, 384 passed, 1 failed, 1 ignored.
    The failure is probbit-decide's wall-clock test sample_on_budget_is_a_deadline_at_many_chains on a host at load 15–29;
    this branch does not change that crate, and release builds of this head and of the base, run side by side, both fail it
    in 10 of 10 pairs at that load (head median 769 ms, base 792 ms, limit 180). No limit was changed; CI decides.
    cargo +1.78.0 build --release --locked --workspace: exit 0, Cargo.lock unchanged, no new dependencies. P0
    (bench/individuality/p0.py check): 653 outputs, 0 differ (629 byte-identical, 24 equal but for stderr warning lines), 8 of 8 strands verify.
  4. Bench (python3 bench/body/run.py --only needs,valence,replay,habits,p0; nulls.py runs before it and no bar passes
    its null): 12 of 14 gated bars pass. n10 and n11 fail, as the bars' own reachability checks predicted from the RFC's
    rules; they are design findings and neither bar was changed. n10: context at cap 0.7771 h a day at τ 0, 0.4914 at τ 2
    (−37 %; the bar asks for ≤ 0.5×). n11: 0.02 report pursuits a day on the absence's second day (2 of 100 lives; the bar
    asks for 0). The p0 part's dispositions fixture (o5) is a setup error until wave 1b builds dispositions.
  5. Gates: privacy 0 and law words 0 over every new file and every added line; bench/body/fixtures/bars.md,
    bars.json and bars-v1.md byte-identical to the freeze head. Changes after the freeze: one bench script (needs.py,
    n7's MCP control, which sent YAML text that both tools refuse before reading the event) with its MANIFEST line, and a
    dated note at the top of the RFC (A.3 in two passes; pressure.s = 0 and pressure.pending = false at init; the quoted
    "n"; r_cap above win_max refused with N-R5, one need satisfied twice in one event refused with N-E1).

The gate, every bar with its number: BENCHMARKS.md §12.
The script change: bench/body/README.md, "Changes after the freeze".

…asurement

docs/rfcs/0002-neuromodulators-and-body.md: the RFC 0002 draft (needs and the omission let-down, surprise, pace,
dispositions, valence; part 2 rest and load) in RFC 0001's shape, references by author and year.

bench/body/: the benchmark that defines "done" for it, frozen: 9 fixture personas and 13 derived twins, 11 seeded streams
and their generator (fixtures/gen.py --verify regenerates them byte for byte), the bars (README tables, bars.md, bars.json),
run.py and the per-part scripts, and fixtures/MANIFEST (50 sha256 entries, manifest_check.py). arith_0002.py: 40 checks,
0 mismatches. No engine has the blocks yet: every part reports "setup error: this engine does not support <block>" and
run.py exits 2. No engine change; every bar unmeasured by design.
An independent review graded the 40 bench/body bars (12 sound, 10 weak, 18 vacuous) by naming a degenerate
policy or null that passes each. No engine with an RFC 0002 block has produced a number for any of them, so
they are repaired under the freeze rule (a bar is never edited after a number is seen). No pass value relaxed.

- Two-sided correctness and coverage: exact wins on a 15-cell needs1 grid (n1, n2); success-weighted order,
  odds magnitudes and released goals on a second probe (n3); contact ceiling also while the principal is away
  and every answered report paying (n8); non-positive wins, coverage and a deficit bound (n9); a positive
  baseline and recomputed deficits (n10); contact before the absence and after the return (n11); learning
  that must happen (s2) and an exact opening step (s3); E trajectories exact at every event (o1, o2); residual
  at lags 1-5 (v3); exact contraction plus a below-threshold control (r0); the lesson kept after the gap
  (r1); a non-saturated lineage probe with a 20 % reduction (r2); conflicts that bind (r4); each load
  channel's amplitude and time course (l1-l3).
- Nulls that fail inside their own fixture: the env control through the refused sources' transports (n7),
  an admissible burst above the pace cap (p6), constant-gain engine twins at the gate's movement budget (s1),
  planted corruptions for the replay bars, habit-free twins gated.
- Effects on decisions: released odds for v1/v2, changed pursue goals for o3, P(careful) for l1.
- nulls.py: a competent plain-Python null for every bar, judged by the parts' own gate functions; run.py
  stops with exit 2 when one passes. 51 null rows over 40 bars, 0 pass. The RFC's own rules run as
  non-gating references: they pass every bar they cover except n10 and n11 (kept as frozen; flagged).
- New streams return, bursts, burst, two-point-gaps; variants needs2-s02, gate-g1.25..3.0, load-effects;
  every v1 stream and variant regenerates byte for byte. bars.json/bars.md at version 2; v1 kept verbatim as
  bars-v1.json/bars-v1.md; MANIFEST regenerated (64 entries). arith_0002.py: 66 checks, 0 mismatches.
- run.py on an engine without the blocks still exits 2, one setup line per part.
At 1 h the deficit is 0.1 and the amount 0.2 overshoots it back to 0.1, so a correct engine shows no change and would
fail n7. Found by a dry run of needs.py against a Python model of RFC 0002 A.3-A.4 (not the engine), before any engine
measurement; pass value and bar text unchanged; logged under 'Changes after the freeze'.
…, v2's null within rounding

Found by dry runs of every part against Python models of RFC 0002 (not the engine), before any engine measurement:
- r1 is measured on the reversal draws without the lock turns: with them the stand-in learner re-learns in 6 turns
  after rest instead of 5 (6/11 = 0.545 against 0.5) because r4's lock habit shares the stream (rule 2); without them
  5/11 = 0.4545, the number the bar's reachability check cites. The locked ratio is reported.
- s3 checks the cap where the RFC puts it, on the step before recentring: the recentred changes come from a step
  within +-g_max x step_cap exactly when their range is <= 2 x g_max x step_cap (v1's script compared each recentred
  change with the cap, which a correct step exceeds in 968 of 1,800 lives of the dry run).
- v2's no-block twin moves by rounding residue (1e-6), so its move is gated at <= 2e-6, not == 0.
Pass values and bar text unchanged; logged under 'Changes after the freeze'.
…d events, v1's and v2's mood odds)

Verdicts unchanged (51 null rows, 0 pass a v2 bar); the rows printed illustrative numbers where the null's outcome follows
from its definition, and now print the computed ones.
… windows, prove boxes, verify needs summary, monitor, MCP refusal) and unit tests
…cs (persona.md 2.9/2.12, cheatsheet, man page), CHANGELOG, RFC changes after the freeze, BENCHMARKS 12, bench n7 MCP shape fix
Base automatically changed from rfc2-wave0-freeze to main October 17, 2026 06:58
@BitmapAsset BitmapAsset mentioned this pull request Oct 17, 2026
…ows needs, #40 knows state.pace)

R117 semantic-conflict fix. #38's tests use RFC 0002's needs block (next-needs.strand; the unit test's header case) and a state.pace field as what this engine does not know. Since #39 the engine knows needs (the strand's header is refused at line 1: a needs block needs a drives block) and since #40 a pace state field (this persona has no pace block): divergences, not unsupported. next-load.strand is derived the same way (R111's make_next_fixtures.py helpers) with the load block of docs/rfcs/0002 Part 2, which no engine has yet; the unit test uses a load block and state.load; docs/persona.md 5.7 names load. Tests, fixtures and one docs sentence only; no engine code, no bar.
… 0.11.0-dev

0.9.0 is released, so main moves to 0.10.0-dev: Cargo.toml, the internal path dependencies, Cargo.lock (cargo update
--workspace --offline) and docs/probbit.1 (regenerated with probbit man); one CHANGELOG line under 0.10.0. The derived
newer-engine strands stay one version up: next-load.strand and next-rest.strand re-derived at probbit 0.11.0-dev with the
same derivation (it reproduces the 0.10.0-dev files byte for byte), and the five test strings in tests/live.rs and the two
Python tests that pin their engine follow. No engine code.
@BitmapAsset
BitmapAsset marked this pull request as ready for review October 17, 2026 08:06
@BitmapAsset
BitmapAsset merged commit 5e7fdb4 into main Oct 17, 2026
16 checks passed
@BitmapAsset
BitmapAsset deleted the rfc2-wave1a-needs branch October 17, 2026 08:27
BitmapAsset added a commit that referenced this pull request Oct 17, 2026
One line under the "What's new in 0.9.0" block: what main carries after #39 and #40 (opt-in, measured in
BENCHMARKS.md section 12) and that it ships as 0.10.0 after the fix wave.
BitmapAsset added a commit that referenced this pull request Oct 17, 2026
* WIP RFC 0002 wave 1b: surprise gate, pace step, disposition genes in the engine (compiling state)

* WIP RFC 0002 wave 1b: unit tests (closed forms, refusal rows, state fields, surfaces), pacer example with golden, live tests

* WIP RFC 0002 wave 1b: docs (persona.md 2.13-2.15 and surfaces, cheatsheet, man page, changelog), RFC changes after the freeze item 5, monitor PACE and GAIN rows

* WIP RFC 0002 wave 1b: prove-box and refusal-property unit tests, monitor pace and gain rows test

* RFC 0002 wave 1b: BENCHMARKS.md section 12 extended with the measured gate, pace and dispositions bars

* Merge branch 'main' into rfc2-wave1b-surprise-pace-dispositions

* README: RFC 0002 part 1 on main, unreleased

One line under the "What's new in 0.9.0" block: what main carries after #39 and #40 (opt-in, measured in
BENCHMARKS.md section 12) and that it ships as 0.10.0 after the fix wave.

* Docs: probbit check shipped in 0.9.0 (0.8.3 was never tagged)

The README's rule-lock example is re-measured with the released 0.9.0 binary (the same verdicts, broken seeds and exit
codes, and the nine seeds checked alone are unproven, exit 3); the cheat sheet's check heading and the action's error
message for a release without the check command name 0.9.0, the version that ships it.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant