Skip to content
Merged
28 changes: 28 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,34 @@
All notable changes to this project are documented here. The format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## 0.8.2 - unreleased

### Added
- `probbit monitor STRAND --open` (and `--serve`) shows an Activity Monitor for one individual: a sortable, filterable table of
the persona's declared traits, moods and, when present, drive channels, with each channel's reported level or value, a trace
over recorded events and a change against exactly the preceding event (a gap when that document is missing); an inspector
with the full distribution, units, declared range, source field and the event's `why`; holding a past event while new ones
arrive; and separate states for replay divergence, stale receiver age, a held view, a paused or retired strand, a
persona-confidence hold, an engine-unreleased trait and a lost connection. It works for any persona read from the strand.
The page is embedded in the binary with no external assets; the terminal view (`--once`, `--follow`, `--plain`) is unchanged.
The monitor's layout gains `caps.prediction_error` from the persona's `expectation.pe_cap`. docs/persona.md §5.8.

### Changed
- `persona lint` with rules (`--never RULE` / `--props FILE`) no longer reports green on a rule it could not settle. When
`prove` leaves a rule `unknown` and the default `fuzz` search finds no counterexample, the rule is **unproven**: the lint
document gains `"unproven": [{id, rule, seeds_unknown, searched}]`, `ok` is false, stderr says "unproven, not broken", and the
exit code is the new **3** (0: every rule held or proved; 1: an unresolved contradiction or a counterexample, which wins over
3; 2: bad input, as before). Up to 0.8.1 the same case exited 0 with `ok: true`. docs/persona.md §5.5.
- `persona fuzz`, MCP `probbit_persona_fuzz` and `lint`'s search add every threshold the rule's `when` and the habits' `when`
read on a number input to the grid (as a fraction of that input's max, after the given points, each once; `search.grid` lists
them). A rule in force only between two default grid points (for example stakes 0.7 to 0.8) is now reached by the random
search too. Personas whose rules and habits read no number thresholds off the grid get the same search, byte for byte.

### Fixed
- `install.sh`: when the install directory is not on `PATH`, the hint names the file the user's shell reads: `~/.zshrc` for
zsh, `~/.bash_profile` for bash on macOS and `~/.bashrc` elsewhere, `~/.profile` for any other shell (it said "your shell
profile"). The clean-prefix install test checks each case.

## 0.8.1 - 2026-10-10

### Fixed
Expand Down
25 changes: 16 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,8 @@ probbit persona prove examples/persona/tutor.yaml --seeds 0-99 \
# held by construction (habit no_play_when_upset) (exit 0; the tutor now ships with that one habit)
```

`probbit persona lint PERSONA --props rules.json` runs both in CI (exit 1 when a rule breaks); MCP `probbit_persona_fuzz` and
`probbit persona lint PERSONA --props rules.json` runs both in CI (exit 1 when a rule breaks, exit 3 when a rule is
unproven: unknown to the bound and unbroken by the search); MCP `probbit_persona_fuzz` and
Python `probbit.persona_fuzz` / `persona_prove` give the same documents. Both commands test the stance the host gets, not the
words a model writes; "none found" from `fuzz` is evidence over the scripts it searched, not a proof
([docs/persona.md](docs/persona.md) §5.6 has the bound and its limits).
Expand Down Expand Up @@ -524,19 +525,25 @@ A persona without the block gives the same documents as before, byte for byte. M
cues, rewards and praises fun on this persona, 100 individuals x 10,000 turns: 0 habit breaks, all 6,743 must-do turns pursued
the due chore, and the safety floor (0.1) held on every turn its habits allowed (least odds 0.141), while fun took 85 % of turns.

### Watch it live: `probbit monitor` (0.8.0)
### Watch it live: `probbit monitor` (0.8.0; Activity Monitor page 0.8.2)

`probbit monitor pip.strand` replays a strand with the rules of `live verify` and draws the individual's inner state as live bars:
each trait's levels with their odds, the moods, the event's inputs, the habits that bound, the learned weights and the line, in the
terminal (`--follow` redraws as the strand grows) or as a page on 127.0.0.1 (`--serve`). It reads the strand and sends nothing
anywhere ([docs/persona.md](docs/persona.md) §5.8). No strand yet? The tutor's week, in under a minute:
`probbit monitor pip.strand --open` opens a compact, read-only **Activity Monitor** for one individual: a sortable,
searchable table of declared traits, moods and drives, with reported probabilities, event-history traces, and a selected-channel
inspector. It reads any compatible persona from the strand; no preset character or agent integration is required.

```sh
probbit monitor --demo --open
probbit monitor --demo drives --open # synthetic goals/drive demo (0.8.1)
probbit monitor pip.strand --once --plain # native CLI snapshot; no browser or server
probbit monitor pip.strand --follow # live terminal bars
probbit monitor pip.strand --open # browser-rendered utility on 127.0.0.1
probbit monitor --demo --open # no strand yet: the tutor's synthetic week, in under a minute
probbit monitor --demo drives --open # synthetic goals/drive scenario
```

![probbit monitor: the tutor's week in the browser, the bars moving with every event](docs/probbit-monitor.gif)
Select a channel to inspect its units, range, distribution, source and the engine's `why`. Hold an event while new ones
arrive, or follow latest. History means **recorded events, not seconds**. This is declared engine state, not thoughts or
CPU/GPU/memory usage. Replay verification, stale event age, held view, paused/retired strand and lost connection are distinct.
Everything is embedded in the CLI: no dependencies, external assets, telemetry or Electron installation.
See [the monitor guide](docs/persona.md#58-monitor-watch-an-individuals-inner-state) for the data and replay boundaries.

## After any judge: `probbit evaluate`

Expand Down
4 changes: 2 additions & 2 deletions docs/CHEATSHEET.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ The exact tiers run before the sampler:
| `live PERSONA [--seed N \| --state FILE] [--strand FILE] [--events FILE]` | JSONL events in, one stance per event out |
| `live PERSONA --demo week [--seed N] [--plain]` | a scripted week: learning to a cap, a night, rules that hold |
| `live verify STRAND` | replay a strand; the earliest line that differs |
| `monitor STRAND [--follow] [--plain] [--serve] [--open] [--port N]` | the strand replayed as live bars: the terminal, or a page on 127.0.0.1 |
| `monitor --demo [--open]` | the tutor's week, paced, in under a minute |
| `monitor STRAND [--follow] [--once] [--plain] [--serve] [--open] [--port N]` | the strand replayed as live bars in the terminal, or the Activity Monitor page on 127.0.0.1 (channel table, event-history traces, inspector) |
| `monitor --demo [week\|drives] [--open]` | synthetic data: the tutor's week, paced, in under a minute; `drives`: a short goal-signal scenario |

## Testing a character
- `lint`: contradicting habits; with `--props`, every rule proved or fuzzed;
Expand Down
2 changes: 1 addition & 1 deletion docs/agents.md
Original file line number Diff line number Diff line change
Expand Up @@ -216,5 +216,5 @@ Practical notes for agent use:
(on Linux and macOS) `--priority low` keep it from crowding the agent's own process.
- `--top`, `demo --live` and the hero screen draw only on a terminal; an agent's pipes never see them.
- A persona's character rules in CI: `probbit persona lint PERSONA --props rules.json` proves each rule or, when the bound
cannot decide it, fuzzes it (exit 1 when one breaks); `probbit persona fuzz` / `prove` with `--json` give the documents
cannot decide it, fuzzes it (exit 1 when one breaks; exit 3 when one stays unproven: unknown and no counterexample found); `probbit persona fuzz` / `prove` with `--json` give the documents
(docs/persona.md §5.6). They test the stance a host gets, not the words a model writes.
Loading
Loading