Skip to content

probbit check: one command and a GitHub Action for the rule lock - #31

Merged
BitmapAsset merged 7 commits into
mainfrom
feat/check-action
Oct 14, 2026
Merged

BitmapAsset merged 7 commits into
mainfrom
feat/check-action

Conversation

@BitmapAsset

Copy link
Copy Markdown
Owner

probbit check turns the rule lock into one command and one CI step: vet the rules a persona must keep before its first task and after every policy update, then replay its strands.

probbit check PERSONA [--props FILE] [--strand FILE]... [--seeds LIST] [--depth N] [--hours LIST] [--json]

  • Composes existing pieces only: persona lint's pipeline (moved unchanged into one function both commands call) and live verify on each strand. No engine change, no new dependency.
  • One line per rule (held, held_by_construction, broken seed N, unproven), one per strand (ok N events / FAIL line K: ...), then check: held H · broken B · unproven U · strands S/T.
  • Exit 0 all held and replayed; 1 a broken rule, an unresolved habit contradiction or a failing strand (1 wins); 3 only unproven rules; 2 bad input. --json emits {persona, props, seeds, depth, hours, rules, strands, verdict}, with the persona lint document under rules.
  • In the command table, so --help, probbit help check, completions and docs/probbit.1 list it.

action.yml (composite, "probbit check")

  • Inputs persona, props, strands (newline-separated globs), seeds (0-99), depth, version (latest; install.sh), binary (a prebuilt probbit, used by the dogfood workflow until 0.8.3 is released), allow-unproven (false), json-artifact (true; actions/upload-artifact@v4, the only action it uses).
  • ::error per broken rule and failing strand, ::warning per unproven rule, with the seeds. Linux and macOS; Windows runners stop with one error line (README says so). A probbit without check (0.8.2) stops with a clear message.

.github/workflows/check.yml: uses: ./ on ubuntu and macos with the probbit built from the commit (the dispatch example with a strand, the shipped tutor), plus the install path (v0.8.2 must stop at the version gate). ci.yml is untouched.

examples/persona/dispatch-policy.yaml + dispatch-props.json: an agent that learns whether to act or ask first. All three rules are held_by_construction on seeds 0-99 (0.02 s). Without its routine habit, check exits 1: the bound proves the routine rule for 76 of 100 individuals, the search breaks it on 15 of the 24 left (9 with a single event); the other 9 alone exit 3.

Fixed: cargo +1.78.0 test --workspace --locked compiles again (a test used std::io::pipe, Rust 1.87; it now takes a readerless pipe from an exited child's stdin).

Tests: new probbit-cli/tests/cli_check.rs (6 tests: exit 0/1/3 and 1-over-3, strands ok/tampered/unreadable, the --json shape, bad usage, the table). Workspace 322 passed / 0 failed / 1 ignored on stable and on Rust 1.78 (--locked); Python 44 OK; MSRV release build OK.

CHANGELOG: ## 0.8.3 - unreleased. No tag, release or publish in this PR.

…line, exit 0/1/3, --json

One command for CI: prove + fuzz a persona's rules (exactly what persona lint does, its body
moved into lint_report unchanged) and replay every --strand. Added to the command table, so
--help, help, completions and the man page list it. The dispatch example the tests use ships
here; its README walk-through follows.
Installs probbit with install.sh (version input, or a prebuilt binary), runs probbit check
--json, annotates broken rules and failing strands as errors and unproven rules as warnings
with their seeds, uploads probbit-check.json (actions/upload-artifact@v4), and applies
allow-unproven to exit 3. Windows runners stop with one clear error.
uses: ./ with the probbit built from the commit: the dispatch rule lock with a strand, the
shipped tutor, and the install path (v0.8.2 must stop at the version gate).
…ured numbers

README walk-through: with the routine habit every rule is held by construction on seeds 0-99;
without it check exits 1 (15 broken seeds; the 9 unknown, unbroken ones alone exit 3).
… 1.78 again

std::io::pipe() is stable only since 1.87; the readerless pipe is now the stdin of a child that
has exited (Stdio::piped, Stdio::from). cargo +1.78.0 test --workspace --locked passes.
@BitmapAsset
BitmapAsset merged commit 6d6d28b into main Oct 14, 2026
15 checks passed
@BitmapAsset
BitmapAsset deleted the feat/check-action branch October 14, 2026 12:56
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