From 8b72d22710a71445e79953863de7cefd7b8dc90e Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 05:11:24 -0700 Subject: [PATCH 01/14] bench/individuality: P0 corpus frozen with the released 0.8.2 binary Every shipped persona and example (tutor, ops-engineer, trader-assistant, the agent-harness retry policies, the monitor's drives demo persona) and two engine test fixtures x seeds 0-2 x four committed random scripts of 100 events (9,600 live turns and as many replayed), plus init, check, describe, compile, lint --seeds 0-99, and lint/fuzz/prove documents of the shipped rules: 653 outputs, recorded with probbit 0.8.2 before any 0.9.0 change. The scripts carry the keys 0.9.0 adds (senses, await, for, cancel) as undeclared inputs, which a persona without the new blocks must keep listing in ignored. fixtures/MANIFEST records the binary's sha256 and every frozen file's; p0.py check compares the binary under test. --- bench/individuality/common.py | 181 +++++ bench/individuality/fixtures/MANIFEST | 56 ++ bench/individuality/fixtures/gen.py | 182 +++++ bench/individuality/fixtures/p0/EXPECTED | 654 ++++++++++++++++++ .../fixtures/p0/personas/scout.json | 98 +++ .../fixtures/p0/props/retry.json | 1 + .../fixtures/p0/props/tutor.json | 1 + .../fixtures/p0/scripts/adaptive-0.jsonl | 100 +++ .../fixtures/p0/scripts/adaptive-1.jsonl | 100 +++ .../fixtures/p0/scripts/adaptive-2.jsonl | 100 +++ .../fixtures/p0/scripts/adaptive-3.jsonl | 100 +++ .../fixtures/p0/scripts/drifter-0.jsonl | 100 +++ .../fixtures/p0/scripts/drifter-1.jsonl | 100 +++ .../fixtures/p0/scripts/drifter-2.jsonl | 100 +++ .../fixtures/p0/scripts/drifter-3.jsonl | 100 +++ .../fixtures/p0/scripts/guarded-0.jsonl | 100 +++ .../fixtures/p0/scripts/guarded-1.jsonl | 100 +++ .../fixtures/p0/scripts/guarded-2.jsonl | 100 +++ .../fixtures/p0/scripts/guarded-3.jsonl | 100 +++ .../fixtures/p0/scripts/ops-engineer-0.jsonl | 100 +++ .../fixtures/p0/scripts/ops-engineer-1.jsonl | 100 +++ .../fixtures/p0/scripts/ops-engineer-2.jsonl | 100 +++ .../fixtures/p0/scripts/ops-engineer-3.jsonl | 100 +++ .../fixtures/p0/scripts/scout-0.jsonl | 100 +++ .../fixtures/p0/scripts/scout-1.jsonl | 100 +++ .../fixtures/p0/scripts/scout-2.jsonl | 100 +++ .../fixtures/p0/scripts/scout-3.jsonl | 100 +++ .../p0/scripts/trader-assistant-0.jsonl | 100 +++ .../p0/scripts/trader-assistant-1.jsonl | 100 +++ .../p0/scripts/trader-assistant-2.jsonl | 100 +++ .../p0/scripts/trader-assistant-3.jsonl | 100 +++ .../fixtures/p0/scripts/tutor-0.5.0-0.jsonl | 100 +++ .../fixtures/p0/scripts/tutor-0.5.0-1.jsonl | 100 +++ .../fixtures/p0/scripts/tutor-0.5.0-2.jsonl | 100 +++ .../fixtures/p0/scripts/tutor-0.5.0-3.jsonl | 100 +++ .../fixtures/p0/scripts/tutor-0.jsonl | 100 +++ .../fixtures/p0/scripts/tutor-1.jsonl | 100 +++ .../fixtures/p0/scripts/tutor-2.jsonl | 100 +++ .../fixtures/p0/scripts/tutor-3.jsonl | 100 +++ .../fixtures/p0/strands/adaptive-s0-0.strand | 100 +++ .../fixtures/p0/strands/drifter-s0-0.strand | 105 +++ .../fixtures/p0/strands/guarded-s0-0.strand | 97 +++ .../p0/strands/ops-engineer-s0-0.strand | 105 +++ .../fixtures/p0/strands/scout-s0-0.strand | 105 +++ .../p0/strands/trader-assistant-s0-0.strand | 105 +++ .../p0/strands/tutor-0.5.0-s0-0.strand | 105 +++ .../fixtures/p0/strands/tutor-continue.jsonl | 20 + .../fixtures/p0/strands/tutor-s0-0.appended | 20 + .../fixtures/p0/strands/tutor-s0-0.state.json | 1 + .../fixtures/p0/strands/tutor-s0-0.strand | 105 +++ bench/individuality/p0.py | 220 ++++++ 51 files changed, 5461 insertions(+) create mode 100644 bench/individuality/common.py create mode 100644 bench/individuality/fixtures/MANIFEST create mode 100644 bench/individuality/fixtures/gen.py create mode 100644 bench/individuality/fixtures/p0/EXPECTED create mode 100644 bench/individuality/fixtures/p0/personas/scout.json create mode 100644 bench/individuality/fixtures/p0/props/retry.json create mode 100644 bench/individuality/fixtures/p0/props/tutor.json create mode 100644 bench/individuality/fixtures/p0/scripts/adaptive-0.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/adaptive-1.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/adaptive-2.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/adaptive-3.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/drifter-0.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/drifter-1.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/drifter-2.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/drifter-3.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/guarded-0.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/guarded-1.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/guarded-2.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/guarded-3.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/ops-engineer-0.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/ops-engineer-1.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/ops-engineer-2.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/ops-engineer-3.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/scout-0.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/scout-1.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/scout-2.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/scout-3.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/trader-assistant-0.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/trader-assistant-1.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/trader-assistant-2.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/trader-assistant-3.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/tutor-0.5.0-0.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/tutor-0.5.0-1.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/tutor-0.5.0-2.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/tutor-0.5.0-3.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/tutor-0.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/tutor-1.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/tutor-2.jsonl create mode 100644 bench/individuality/fixtures/p0/scripts/tutor-3.jsonl create mode 100644 bench/individuality/fixtures/p0/strands/adaptive-s0-0.strand create mode 100644 bench/individuality/fixtures/p0/strands/drifter-s0-0.strand create mode 100644 bench/individuality/fixtures/p0/strands/guarded-s0-0.strand create mode 100644 bench/individuality/fixtures/p0/strands/ops-engineer-s0-0.strand create mode 100644 bench/individuality/fixtures/p0/strands/scout-s0-0.strand create mode 100644 bench/individuality/fixtures/p0/strands/trader-assistant-s0-0.strand create mode 100644 bench/individuality/fixtures/p0/strands/tutor-0.5.0-s0-0.strand create mode 100644 bench/individuality/fixtures/p0/strands/tutor-continue.jsonl create mode 100644 bench/individuality/fixtures/p0/strands/tutor-s0-0.appended create mode 100644 bench/individuality/fixtures/p0/strands/tutor-s0-0.state.json create mode 100644 bench/individuality/fixtures/p0/strands/tutor-s0-0.strand create mode 100644 bench/individuality/p0.py diff --git a/bench/individuality/common.py b/bench/individuality/common.py new file mode 100644 index 0000000..882d13c --- /dev/null +++ b/bench/individuality/common.py @@ -0,0 +1,181 @@ +"""Shared helpers for bench/individuality (Python 3.9, standard library only). + +The binary is PROBBIT_BIN, else `probbit` on PATH. Every document is compared as canonical JSON (docs/persona.md section +5.2): keys sorted, no whitespace, whole numbers as integers, other numbers as Python's repr of a float. +""" +import hashlib +import json +import math +import os +import random +import shutil +import subprocess +import sys +import tempfile + +HERE = os.path.dirname(os.path.abspath(__file__)) +REPO = os.path.dirname(os.path.dirname(HERE)) +FIXTURES = os.path.join(HERE, "fixtures") + + +class SetupError(Exception): + """A missing binary or fixture: run.py exits 2.""" + + +def binary(): + b = os.environ.get("PROBBIT_BIN") or shutil.which("probbit") + if not b or not os.path.exists(b): + raise SetupError("no probbit binary: set PROBBIT_BIN or put probbit on PATH") + return b + + +def version(b=None): + out = subprocess.run([b or binary(), "--version"], capture_output=True, text=True).stdout.strip() + return out.split()[-1] if out else "?" + + +def sha256_bytes(data): + return hashlib.sha256(data).hexdigest() + + +def sha256_file(path): + with open(path, "rb") as f: + return sha256_bytes(f.read()) + + +def _num(x): + if isinstance(x, bool): + return "true" if x else "false" + if isinstance(x, int): + return str(x) + if x != x or x in (float("inf"), float("-inf")): + raise ValueError("not a finite number") + if x == int(x) and abs(x) <= 2 ** 53: + return str(int(x)) + return repr(float(x)) + + +def _str(s): + out = ['"'] + for ch in s: + o = ord(ch) + if ch == '"': + out.append('\\"') + elif ch == "\\": + out.append("\\\\") + elif ch == "\b": + out.append("\\b") + elif ch == "\f": + out.append("\\f") + elif ch == "\n": + out.append("\\n") + elif ch == "\r": + out.append("\\r") + elif ch == "\t": + out.append("\\t") + elif o < 0x20: + out.append("\\u%04x" % o) + else: + out.append(ch) + out.append('"') + return "".join(out) + + +def canon(v): + """Canonical JSON text of a value (docs/persona.md section 5.2).""" + if v is None: + return "null" + if isinstance(v, (bool, int, float)): + return _num(v) + if isinstance(v, str): + return _str(v) + if isinstance(v, (list, tuple)): + return "[" + ",".join(canon(x) for x in v) + "]" + if isinstance(v, dict): + return "{" + ",".join(_str(k) + ":" + canon(v[k]) for k in sorted(v)) + "}" + raise TypeError(type(v)) + + +def run(args, stdin=None, cwd=None): + """Run the binary; returns (exit code, stdout bytes, stderr text).""" + p = subprocess.run([binary()] + list(args), input=stdin, capture_output=True, cwd=cwd or REPO) + return p.returncode, p.stdout, p.stderr.decode("utf-8", "replace") + + +def jsonl(data): + return [json.loads(line) for line in data.decode("utf-8").splitlines() if line.strip()] + + +def write_jsonl(path, events): + with open(path, "w", encoding="utf-8", newline="\n") as f: + for e in events: + f.write(canon(e) + "\n") + + +def read_jsonl(path): + with open(path, encoding="utf-8") as f: + return [json.loads(line) for line in f if line.strip()] + + +def live(persona, events, seed=None, state=None, strand=None, checkpoint_every=None, extra=()): + """`probbit live --clock fixed` over a list of events. Returns (exit, stances (list of documents), stderr).""" + tmp = tempfile.mkdtemp(prefix="pbit-bench-") + try: + ev = os.path.join(tmp, "events.jsonl") + write_jsonl(ev, events) + args = ["live", persona, "--clock", "fixed", "--events", ev] + if state is not None: + args += ["--state", state] + else: + args += ["--seed", str(seed)] + if strand is not None: + args += ["--strand", strand] + if checkpoint_every is not None: + args += ["--checkpoint-every", str(checkpoint_every)] + code, out, err = run(args + list(extra)) + return code, jsonl(out), err + finally: + shutil.rmtree(tmp, ignore_errors=True) + + +def init(persona, seed, out): + code, _, err = run(["persona", "init", persona, "--seed", str(seed), "--out", out]) + if code: + raise SetupError("init failed: " + err) + + +def turn(persona, state, inputs, out): + """One `persona turn` from a saved state, written to `out` (the saved state is not touched).""" + code, data, err = run(["persona", "turn", persona, "--state", state, "--inputs", canon(inputs), "--out", out]) + return code, (json.loads(data) if data.strip() else None), err + + +def verify(strand): + code, out, _ = run(["live", "verify", strand]) + return code, (json.loads(out) if out.strip() else None) + + +def tv(p, q): + """Total-variation distance between two odds mappings over the same levels.""" + return 0.5 * sum(abs(p.get(k, 0.0) - q.get(k, 0.0)) for k in set(p) | set(q)) + + +def bootstrap(values, stat=None, n=2000, seed=20261014, level=0.95): + """Percentile bootstrap interval of a statistic (default the mean) over `values`.""" + stat = stat or (lambda xs: sum(xs) / len(xs)) + rng = random.Random(seed) + k = len(values) + reps = sorted(stat([values[rng.randrange(k)] for _ in range(k)]) for _ in range(n)) + lo = reps[int(math.floor((1 - level) / 2 * n))] + hi = reps[min(n - 1, int(math.ceil((1 + level) / 2 * n)) - 1)] + return lo, hi + + +def r6(x): + v = round(x, 6) + return 0.0 if v == 0 else v + + +def fail(msg): + print("setup error: " + msg, file=sys.stderr) + sys.exit(2) diff --git a/bench/individuality/fixtures/MANIFEST b/bench/individuality/fixtures/MANIFEST new file mode 100644 index 0000000..70c78f2 --- /dev/null +++ b/bench/individuality/fixtures/MANIFEST @@ -0,0 +1,56 @@ +# bench/individuality fixtures: sha256, bytes and path (relative to this directory) of every frozen file. +# Frozen: a later change is logged in ../README.md with its reason. run.py checks this file before any metric. +# +# P0 corpus, recorded 2026-10-14 before any 0.9.0 code change, with the released probbit 0.8.2 binary +# (aarch64-apple-darwin release archive) whose sha256 is: +binary probbit-0.8.2 2c3455ef93092fd5036be766b19e96954cc4d164c15773f1411759fc26b93669 +# Re-record: PROBBIT_BIN=<0.8.2 binary> python3 ../p0.py record (gives these bytes); check: python3 ../p0.py check +82bb5b3d140739addac6dcde8e3d31e70d15e46bdb7ece9bb48e2a712286f744 7029 gen.py +c68f9d2dff98e57cf43ebaa91d6737b497e6c04d67d1efc04e5503e529f08d16 65059 p0/EXPECTED +82e6748f463f6ab7f93a1959176fcf2c7a1cc709d271dd20cae14e0eb731f783 1300 p0/personas/scout.json +d7b6541670ac26f143c757f5bcf4ef3151db3452fb80d7a2d604497394f13875 102 p0/props/retry.json +c4b513d05a1e0273e8e865104ac8185fcc0648f60319129fc9f49f6a3751f5ee 122 p0/props/tutor.json +7d1b88e0759b8251752bb0b3c7dd7ed97fd313200b5b8e3f838ab101b2e141c8 3568 p0/scripts/adaptive-0.jsonl +238c0a8157becc11e1199ff2d83215b2bd5f9e0ed3953b29708edf3e1d790f67 6997 p0/scripts/adaptive-1.jsonl +bfd0a743af0d7b66ab609aa72f66e6e233b9ac9527de4593ed1c8dc6b0e245c3 3921 p0/scripts/adaptive-2.jsonl +4b0ddf34887d5cd9464df46f96557d83d4e502dc94f23e8ff28b5b20444becf0 3431 p0/scripts/adaptive-3.jsonl +5c7611d44119fa4cc7218b6d8e126867f628f4089bbc3e30ff1fb2c729574749 7171 p0/scripts/drifter-0.jsonl +4027c6a65f04129b3cf3a11dcfae1be175c5dd50b7d407d26df9b1484488cb93 10265 p0/scripts/drifter-1.jsonl +2eba66ca3bc484dc79df88456dbcf6f289e3f8dfaedf07a6ea081a9acaf7b89f 7930 p0/scripts/drifter-2.jsonl +9264e0b97b6ae1967d3734f841cd11ef7fd7cac6f15cbd78a1d090c31fbdd629 6274 p0/scripts/drifter-3.jsonl +3bc6e6f446ed032d2c573ef42f9e4a6a0407f110453b3e57cef21d17b28e8a36 3248 p0/scripts/guarded-0.jsonl +fd8f28282ff30b492c629a481da19b89bd73decba12d7aa42db98579a9edaa27 7155 p0/scripts/guarded-1.jsonl +a532afe0634ad9777ebf1b47565658274db1390739c421c44708c7095b95ecc6 4091 p0/scripts/guarded-2.jsonl +0d88a58c33346bc274fad765883c5af48f2b35eb45b15e348008f874febe85ec 3351 p0/scripts/guarded-3.jsonl +b2de6f68547b2384863d018902fefbe3ae2459b5e79e5bad0e0ed4613004914d 7382 p0/scripts/ops-engineer-0.jsonl +01d0e99877a9b4135cef0f2290b37d1a961dcec0a45a29271e2ce89131844f57 11090 p0/scripts/ops-engineer-1.jsonl +e57a6e7b70309c4897eb2d0cd3cedf60da9a96248eb95a7241eba0eff2fc43ff 8636 p0/scripts/ops-engineer-2.jsonl +9a3892c02d0ee78ed25a8529233b5644db49ccccf461ebf880fa01a92a672b8c 7137 p0/scripts/ops-engineer-3.jsonl +cf2eec060a1cce9468aacd6949f2eae504078015799edd39ee3244a78c9e8ce6 4196 p0/scripts/scout-0.jsonl +7a07126fa61a9ec3f1b0521dc742eae837f5e1aad938956f59107bc7762fef5d 7589 p0/scripts/scout-1.jsonl +666dd5cefb81bb236f21c1761449c74fb3ce00ce1cf3b1a2ac36aebcaba345e9 4201 p0/scripts/scout-2.jsonl +decae76811f86a1bc78ebb19f490228b605bda5ecb01737be31148f683bce0fc 3982 p0/scripts/scout-3.jsonl +48e6308dbab99892c64678d22d7d92b503423bcff02cf6f740050bf2774a95d9 6162 p0/scripts/trader-assistant-0.jsonl +fcce0f599ed004242aaa2aba1db2bcd4e6086f4b83bde36d5e5569d257b84eac 9585 p0/scripts/trader-assistant-1.jsonl +1a3ede0cc74f3ae6dd2bc0f13d876730d9068d6be08ac6b06824ad938d68909c 7119 p0/scripts/trader-assistant-2.jsonl +8c3f02a80122a96370cf0cede574e1d9331d60dda3d201257ad597c8e37dfdaf 5946 p0/scripts/trader-assistant-3.jsonl +fd8944ce971f1ea4c4ee5413c5b11a247515098306cf520a9f1004bcaa5f4e91 6422 p0/scripts/tutor-0.5.0-0.jsonl +47fcb09c24546ff12c328984885e3f986aa75186d6276b11f0265829a7f9b972 11241 p0/scripts/tutor-0.5.0-1.jsonl +63d6f81ad31955700c9cedc1bd7d4e9fb71431be9ab088695c6e56512b6a6fec 8463 p0/scripts/tutor-0.5.0-2.jsonl +baa2868af66564326e55718fe33f4f19aaab4cda3ddfdaae17116736af504a5e 7206 p0/scripts/tutor-0.5.0-3.jsonl +d03f19415cee190444aeb8f159e196d8620583ffbf471ebe5af4888b78ec7be6 6561 p0/scripts/tutor-0.jsonl +c2ba8570cfdbf7939fd3a3866af0136e4a41be4a515e527aa5c956862c5f5c46 10513 p0/scripts/tutor-1.jsonl +12a29a2d83a7616d80f0048cdca73649cd3111d86c6ea7555991b01f95d08506 8735 p0/scripts/tutor-2.jsonl +f7eaafcd29bb41e3fda7c371c5947ce88c30e9359aa10434a04bd5d313534cfa 7023 p0/scripts/tutor-3.jsonl +24a476b77b90a3427a3b1142028ec851a65768ae34950fa15a6c06d7906fe8ed 34841 p0/strands/adaptive-s0-0.strand +bca21358807f251145324902049ae6c49df021b6462fe82292e7309c4de060e2 52132 p0/strands/drifter-s0-0.strand +6a1f88b0b38a1e6f82c3cf5dbd1effc5f00cffed83cb7fa36159569d2ab478ee 33827 p0/strands/guarded-s0-0.strand +c6ee7faef7e62c599029a312f5322da4a6b9b98b40ab84fa64a1baed2637573b 54478 p0/strands/ops-engineer-s0-0.strand +a88d3b20b41e9843f2b9ac9b117d5b462ec6b1095c762da531cb98481ff48432 43389 p0/strands/scout-s0-0.strand +8e5927a3036c7925e06ef0be99dc1a44fc8fd9ad25cc5347510070567df9110c 52377 p0/strands/trader-assistant-s0-0.strand +639250f4b06f3cadca29136720ac90fb48072be850cf84692efa0e3ef6708158 54709 p0/strands/tutor-0.5.0-s0-0.strand +0419480b5c2e13a2567e26188f2142bb7c2c8a269a3adcc282be1747f63d8242 1390 p0/strands/tutor-continue.jsonl +615978432a80e6b8be7fdf6e2382438516dc67acae56c562221c89654cae479e 6815 p0/strands/tutor-s0-0.appended +cf9073507dad98bedc4f09ca2e49f34862919240c64c548b7a1dcf58fda4804b 1160 p0/strands/tutor-s0-0.state.json +4db5f3d83a0e6df0ea632c35957cdb0970665422af9054fa50e5468e13a888ab 55008 p0/strands/tutor-s0-0.strand +b7b5480175773766932226a0872c3aa1495fcca070ab5bd326d62c40ea30f627 10629 ../p0.py diff --git a/bench/individuality/fixtures/gen.py b/bench/individuality/fixtures/gen.py new file mode 100644 index 0000000..a2511f5 --- /dev/null +++ b/bench/individuality/fixtures/gen.py @@ -0,0 +1,182 @@ +"""Seeded generators for bench/individuality (Python 3.9, standard library only). + + python3 gen.py p0 # the P0 corpus scripts: fixtures/p0/scripts/*.jsonl + python3 gen.py streams # the sensed fixture's streams and probes: fixtures/streams/*.jsonl + +Every output is a pure function of this file: the seeds are fixed below. The outputs are committed, and fixtures/MANIFEST +records their sha256, so a changed generator shows as a changed fixture. +""" +import hashlib +import json +import os +import random +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, os.path.dirname(HERE)) +import common # noqa: E402 + +# P0: the shipped personas (and two engine test fixtures) whose documents must not change. key -> path, repo-relative. +P0_PERSONAS = [ + ("tutor", "examples/persona/tutor.yaml"), + ("ops-engineer", "examples/persona/ops-engineer.yaml"), + ("trader-assistant", "examples/persona/trader-assistant.yaml"), + ("adaptive", "examples/agent-harness/adaptive.json"), + ("guarded", "examples/agent-harness/guarded.json"), + ("scout", "bench/individuality/fixtures/p0/personas/scout.json"), + ("drifter", "probbit-cli/tests/fixtures/persona/drives-adversary.json"), + ("tutor-0.5.0", "probbit-cli/tests/fixtures/persona/tutor-0.5.0.yaml"), +] +# the same personas in their other shipped form (describe and check only: one digest, one individual) +P0_ALIASES = [ + ("tutor-json", "examples/persona/tutor.json"), + ("ops-engineer-json", "examples/persona/ops-engineer.json"), + ("trader-assistant-json", "examples/persona/trader-assistant.json"), + ("demo-tutor", "probbit-cli/src/demo-tutor.yaml"), +] +P0_SCRIPTS = 4 +P0_EVENTS = 100 +# keys a persona without the new blocks must list in `ignored` exactly as 0.8 does +UNDECLARED = ["senses", "await", "for", "cancel", "control"] + + +def rng_for(*parts): + h = hashlib.sha256("|".join(str(p) for p in parts).encode()).hexdigest() + return random.Random(int(h[:16], 16)) + + +def describe(path): + code, out, err = common.run(["persona", "describe", path]) + if code: + raise common.SetupError("describe %s: %s" % (path, err)) + return json.loads(out) + + +def number_max(path, iid): + if path.endswith(".json"): + doc = json.load(open(os.path.join(common.REPO, path), encoding="utf-8")) + for i in doc.get("inputs", []): + if i["id"] == iid: + return i.get("max", 1) + return 1 + + +def drives_doc(path): + if not path.endswith(".json"): + return None + return json.load(open(os.path.join(common.REPO, path), encoding="utf-8")).get("drives") + + +def reward_sources(path): + if not path.endswith(".json"): + return None + return json.load(open(os.path.join(common.REPO, path), encoding="utf-8")).get("reward_from") + + +def senses_value(r): + """A plausible readings object for a persona that has no senses block: it must stay an ignored key.""" + pick = r.random() + if pick < 0.4: + return {"tool_fail": r.random() < 0.3} + if pick < 0.7: + return {"tool_latency": {"v": round(r.uniform(0, 8), 3), "src": "env:runner"}, "tempo": r.randrange(0, 40)} + return {"silence": round(r.uniform(0, 30), 2)} + + +def p0_event(r, info, path, k, turn): + ev = {} + for iid, spec in sorted(info["inputs"].items()): + kind = spec["kind"] + if kind == "flag": + if r.random() < (0.45 if k == 2 else 0.25): + ev[iid] = True + elif r.random() < 0.1: + ev[iid] = False + elif kind == "level": + if r.random() < 0.5: + ev[iid] = r.choice(spec["levels"]) + elif kind == "number": + if r.random() < 0.5: + mx = number_max(path, iid) + if k == 3: + ev[iid] = r.choice([0, mx]) + else: + ev[iid] = r.choice([0, mx, round(r.uniform(0, mx), 3), round(mx / 2.0, 3)]) + gaps = [0, 0, 0.1, 0.5, 1, 3, 10] if k != 3 else [0, 24, 720] + if r.random() < 0.6: + ev["elapsed_hours"] = r.choice(gaps) + drives = drives_doc(path) + if drives and r.random() < 0.6: + goals = {} + win_max = drives.get("expectation", {}).get("win_max", 2.0) + for g in drives["goals"]: + if r.random() < 0.4: + s = {} + c = r.random() + if c < 0.25: + s["win"] = r.choice([0, 0.5, 1, win_max, round(r.uniform(0, win_max), 3)]) + elif c < 0.5: + s["progress"] = round(r.random(), 3) + elif c < 0.65: + s["cue"] = r.random() < 0.7 + elif c < 0.8: + s["setback"] = round(r.random(), 3) + elif c < 0.9: + s["novelty"] = r.choice([True, False, round(r.random(), 3)]) + else: + s["deadline_hours"] = r.choice([None, 0, 1, 12, 30, 100]) + goals[g["id"]] = s + if goals: + ev["goals"] = goals + rf = reward_sources(path) + if rf is not None: + # a reward-bearing event needs an accepted source; script 1 also carries refused ones (live only) + if k == 1 and r.random() < 0.2: + ev["src"] = r.choice(["self", "clock", "human", "env:", "nonsense"]) + elif r.random() < 0.8: + ev["src"] = r.choice(["env", "env:runner", "env:ci"]) + elif k == 1 and r.random() < 0.3: + ev["src"] = r.choice(["env", "self", "human:a", "clock"]) + if k == 1: + for key in UNDECLARED: + if r.random() < 0.3: + if key == "senses": + ev[key] = senses_value(r) + elif key == "await": + ev[key] = r.random() < 0.8 + elif key == "for": + ev[key] = max(0, turn - r.randrange(1, 4)) + elif key == "cancel": + ev[key] = [max(0, turn - r.randrange(1, 6))] + else: + ev[key] = r.choice(["pause", "resume"]) + if drives is None and r.random() < 0.15: + ev["goals"] = {"fun": {"win": 1}} + return ev + + +def gen_p0(): + out_dir = os.path.join(HERE, "p0", "scripts") + os.makedirs(out_dir, exist_ok=True) + total = 0 + for key, path in P0_PERSONAS: + info = describe(path) + for k in range(P0_SCRIPTS): + r = rng_for("p0", key, k) + events = [p0_event(r, info, path, k, t) for t in range(P0_EVENTS)] + common.write_jsonl(os.path.join(out_dir, "%s-%d.jsonl" % (key, k)), events) + total += len(events) + print("p0 scripts: %d personas x %d scripts x %d events = %d events per seed" % + (len(P0_PERSONAS), P0_SCRIPTS, P0_EVENTS, total)) + + +if __name__ == "__main__": + what = sys.argv[1] if len(sys.argv) > 1 else "" + if what == "p0": + gen_p0() + elif what == "streams": + import streams # noqa: E402 (fixtures/streams.py: the sensed fixture's generators) + streams.main() + else: + print(__doc__) + sys.exit(2) diff --git a/bench/individuality/fixtures/p0/EXPECTED b/bench/individuality/fixtures/p0/EXPECTED new file mode 100644 index 0000000..4fbdc59 --- /dev/null +++ b/bench/individuality/fixtures/p0/EXPECTED @@ -0,0 +1,654 @@ +# P0 corpus: sha256, bytes, exit code, output; recorded with probbit 0.8.2 +03b64f6d167d61f6cbff9c0e79c1c5a3e621258310230f25beff11949b40d9e3 228 0 check/tutor +01754fbc91541cdb433a1a771877e637c01a1d82eaec3562fe5173f39e0103eb 1663 0 describe/tutor +c7361dc1c86560e819b97ac50d170d0657639d3d3d1faf2be2042aed1633a535 229 0 check/ops-engineer +bdd3deb0e7840fd9060f2d8fdbbf1c6a2f1af66c01708579d40c7e144d3a88c6 1644 0 describe/ops-engineer +c65501110711bb7187d856d0fdd794ffec881414bb50c0e5931f6b35770f04f8 229 0 check/trader-assistant +0123b78cfe8016a9814a0cba6db600d410e8023c2d188c6870a7077bd1672e46 1394 0 describe/trader-assistant +9c7a17a5d9ef3f39292ba641c9b7d3e90b64823b6db32eede8160a5f94bfefbd 232 0 check/adaptive +2f1c097690411411cd9063e31f90231cf85b27bb9418c45fd54af44a4a7d431f 458 0 describe/adaptive +1076fc36b1a95b7c5d89d3eab4486e66d784d6c6e1d6c8f9a1d57857bc5e5f0b 232 0 check/guarded +9dee8307c5c5c80256ee55935df6390f588b6542c3cdaf3b2c758c6e39967131 485 0 describe/guarded +f36fa8efcf0eeb13c494f06779a926a268957659039fe2534adf968ec0875f2f 239 0 check/scout +e432bc6af9ae2c39b5af6d134e7fca36bc97230c0890950db60544b515398ea0 690 0 describe/scout +9e6555a61b125da0bb7af7a2ff65ecf9631ffb2b721e2d1389f26c306be4946d 242 0 check/drifter +2f9a9db652f52e347fcd0a3bbebfdb0dc0ab25ecde731d2a338631fbe0d307a8 1069 0 describe/drifter +f8b37b0c29ff44449e00562ab89a6475749609bab34a2a808dad071427cf5acf 228 0 check/tutor-0.5.0 +47a4c4afe6d5689cfa01cb1dc8869e0c1ed85e39711e059c106b1a75a9a2e9d9 1642 0 describe/tutor-0.5.0 +03b64f6d167d61f6cbff9c0e79c1c5a3e621258310230f25beff11949b40d9e3 228 0 check/tutor-json +01754fbc91541cdb433a1a771877e637c01a1d82eaec3562fe5173f39e0103eb 1663 0 describe/tutor-json +c7361dc1c86560e819b97ac50d170d0657639d3d3d1faf2be2042aed1633a535 229 0 check/ops-engineer-json +bdd3deb0e7840fd9060f2d8fdbbf1c6a2f1af66c01708579d40c7e144d3a88c6 1644 0 describe/ops-engineer-json +c65501110711bb7187d856d0fdd794ffec881414bb50c0e5931f6b35770f04f8 229 0 check/trader-assistant-json +0123b78cfe8016a9814a0cba6db600d410e8023c2d188c6870a7077bd1672e46 1394 0 describe/trader-assistant-json +03b64f6d167d61f6cbff9c0e79c1c5a3e621258310230f25beff11949b40d9e3 228 0 check/demo-tutor +01754fbc91541cdb433a1a771877e637c01a1d82eaec3562fe5173f39e0103eb 1663 0 describe/demo-tutor +bab24d2c5eccabe89aed85455d692a225f732c95bd6cb8bd08c367f3753d25bc 1083 0 init/tutor/s0 +843bcdf8171364889dfc02768629220db315ee3392bdd09a9f432a2b5bffeb4d 1081 0 init/tutor/s1 +c9b182972242a051b429a7f3b33df16191dd21757fb98eca9569183ef0db56a5 1079 0 init/tutor/s2 +b8394ab32d6c6c1c538844e89a834d4cd42ae4a36bc721138a51d6c13525582f 5950 0 compile/tutor/s0 +5702b3f3e1f7b0687b67b1f4f15292b10a52d395894d4272db0000162c862e38 2220 0 lint/tutor +8fc069ac343a6c6d2985d9257edda5db2d5f7528ecb938c743b8b38d6312d09a 2448 0 lint-props/tutor +0504f2eb6f4e244aba89efbb2bf65d9bceddb9af576d33e9319588102c46be44 662 0 prove/tutor +66a30d67fbdb30a4b7e82b117919ed3237c7ac9cc4d844ea0b70526e21582ef1 823 0 fuzz/tutor +091e31623c9f401c2d06d007bd094ac21f6d9bfa2c62860bd500354ef69c5415 246609 0 replay/tutor/s0/0/stdout +c17b0885ab3bc9bced377cdbf4388efd74db08fef4c59b8941fc6f37a4d1ace4 182 0 replay/tutor/s0/0/stderr +091e31623c9f401c2d06d007bd094ac21f6d9bfa2c62860bd500354ef69c5415 246609 0 live/tutor/s0/0/stdout +cb0c52c9f11346ee5021ea4f82800102e9666d9cfe65c89f45f48afc6a89f009 117 0 live/tutor/s0/0/stderr +cf9073507dad98bedc4f09ca2e49f34862919240c64c548b7a1dcf58fda4804b 1160 0 live/tutor/s0/0/state +74565b09e2d77947adcf1cc33a2df98abcf22eb78ef8f18bfceca96c73e49eb8 47724 0 live/tutor/s0/0/strand-masked +fe35eb8298c6c362df17c3704202a9b923fc932e0bf04f1c95017782109c7261 246029 0 replay/tutor/s1/0/stdout +0f7c0fef5e8277409199ffa3892114e8ed79d9cf2bc300cfbba935b61a7fbf02 182 0 replay/tutor/s1/0/stderr +fe35eb8298c6c362df17c3704202a9b923fc932e0bf04f1c95017782109c7261 246029 0 live/tutor/s1/0/stdout +a0da9ca9bbc3468913bfac36a30e732104b7a25fe5d3f503ddb9e2e4044a4f87 117 0 live/tutor/s1/0/stderr +3a4ef0ba97871dfe7b2c07b929cae0a50b102b7feb5a7634bfacbedf62fcdfcc 1158 0 live/tutor/s1/0/state +916e338030ecf3979ee37baa35d6ace22658df91bbaced7804a090962da558a7 47663 0 live/tutor/s1/0/strand-masked +25724de6e8ca9b80fc96ddf0a6d3aa269412e24eca79f24f5cd59c32b7bc1686 243633 0 replay/tutor/s2/0/stdout +30fa57def4534f3eba07aa9586e050dc4b53bf5cd8d4fb8db314cc45c388802f 182 0 replay/tutor/s2/0/stderr +25724de6e8ca9b80fc96ddf0a6d3aa269412e24eca79f24f5cd59c32b7bc1686 243633 0 live/tutor/s2/0/stdout +e88c4c33e1a341ae918676b710004f02d215017cbe45a8892d7777ee99e49548 117 0 live/tutor/s2/0/stderr +3dd8d42e1b3b7d44821ce50f9c7b060184c1581129aa2a7809d67c2688eb1f1a 1160 0 live/tutor/s2/0/state +f8ba741b269cf52397c45e4256271ceeea3942a801784bde0f529ca0297f8e28 47654 0 live/tutor/s2/0/strand-masked +daa01d2d4f66f81995de68fdf6704578d3394895752315e241b022bb09b79e64 247977 0 replay/tutor/s0/1/stdout +71fe900c7d1c723a0ecbbfaec92e9e188099b382736550f64272bffff4798aa7 182 0 replay/tutor/s0/1/stderr +daa01d2d4f66f81995de68fdf6704578d3394895752315e241b022bb09b79e64 247977 0 live/tutor/s0/1/stdout +73e7f56e14ccaebf87a27f598e546f9dc0eb7eadc019d7d0e3c0b3c0ac5cccd5 117 0 live/tutor/s0/1/stderr +844a082abd0f6955152b8765f7c76bc79c141b9dd5ad9c51dd744253f56b7fee 1165 0 live/tutor/s0/1/state +b870e32c5315e3a8612c62d50a45562f76f0247893bc588550f357e91f451c1b 51795 0 live/tutor/s0/1/strand-masked +156222b8d10cc4485c2d00353138fbc6ca8124fd2c39866d1d4e7fd533cd66f6 247974 0 replay/tutor/s1/1/stdout +03b5fc6b34dff28beb004cd707bc00888a9b797972569beb80e010414ddd6b7c 182 0 replay/tutor/s1/1/stderr +156222b8d10cc4485c2d00353138fbc6ca8124fd2c39866d1d4e7fd533cd66f6 247974 0 live/tutor/s1/1/stdout +4db7f5b696994847e62d730e33a31774ef282cfed531e3ea38b6cbc7d7f5bc7a 117 0 live/tutor/s1/1/stderr +0689d657fee117182247179c574ddec208ffc5eef82c59a29cf6ba7f2e20d068 1161 0 live/tutor/s1/1/state +216de56a92a58ab4c15a82be75e0b6a4eebffae74a55af586e9aaf0b321bd7d9 51742 0 live/tutor/s1/1/strand-masked +b79b3d3e06f81b4319df7d8384ef2af423bb08bb5e75d1e4de30dffce250121b 245051 0 replay/tutor/s2/1/stdout +5b207f1cecc3797a5f8005fcec8c05d397cee03d34ad00f07b23578e6f4a721e 182 0 replay/tutor/s2/1/stderr +b79b3d3e06f81b4319df7d8384ef2af423bb08bb5e75d1e4de30dffce250121b 245051 0 live/tutor/s2/1/stdout +af9cacbace923d6ec8fd19b992a6b208e9cc17a74d25b99c5f155d3959ed6ab1 117 0 live/tutor/s2/1/stderr +2550598e6841ce710d987ae737b79db107d2bc19a2607556cbc5c7e5b1891264 1157 0 live/tutor/s2/1/state +95ad3e6d9d009dd4cbf5bc6d7265e4ac3a186807275cc1c7f8a2e63324b606d4 51634 0 live/tutor/s2/1/strand-masked +f8750fdac92eed3d302818747bb486ecd309d151966ec15eead0ba67255e0bef 247531 0 replay/tutor/s0/2/stdout +2baf3e7fef233ca7dc56b58084fb53069481f1e7b75a6be8cbad07987aa66bf0 182 0 replay/tutor/s0/2/stderr +f8750fdac92eed3d302818747bb486ecd309d151966ec15eead0ba67255e0bef 247531 0 live/tutor/s0/2/stdout +ad835c51347ada6670bab427e9581447c72dd7e0a819aedf38a70f214079faff 117 0 live/tutor/s0/2/stderr +d33693f134c7d2ec65e4a0edfe69c2ad13a745832cde2e94464b98816154473a 1159 0 live/tutor/s0/2/state +5aebfa9f1df37443eda57d6a131b0c433f5f6e91e965ab234113776f24ad085a 49741 0 live/tutor/s0/2/strand-masked +cef8dfff5a10dbf9d7fa31f9cc0145a2feeadee7e1f0eb37c57e22685ca53cc3 248707 0 replay/tutor/s1/2/stdout +aca24146200f43c4ed2af1497b69e78f1eb49081c16970e932688f234463674c 182 0 replay/tutor/s1/2/stderr +cef8dfff5a10dbf9d7fa31f9cc0145a2feeadee7e1f0eb37c57e22685ca53cc3 248707 0 live/tutor/s1/2/stdout +614667c3f091be48bda7fd0f450b00b3e843aeb0d63202b70d2eb8359fbfc13d 117 0 live/tutor/s1/2/stderr +f3a49e30d0caceb8d685e8e98c1f06c811a61cf32ea9d789fc48aa4d82923a1e 1157 0 live/tutor/s1/2/state +f4642144e39aa4c295c682e0a58aa534283932877116e6de7639b28e205906af 49658 0 live/tutor/s1/2/strand-masked +b93fec029b22f1ffbf31553a8cb3b68ffbd7a4aa933106cddd7f23e241626e19 245137 0 replay/tutor/s2/2/stdout +4efdb2f0f6086ec53662626ce31c6f063415e7f93b904d5ff0ef97dd67288aa6 182 0 replay/tutor/s2/2/stderr +b93fec029b22f1ffbf31553a8cb3b68ffbd7a4aa933106cddd7f23e241626e19 245137 0 live/tutor/s2/2/stdout +3ce74599e8a1444c2178e2eb7a8d4aff8d61230af68e53912f7cad7acc54e7e0 117 0 live/tutor/s2/2/stderr +40a6a4bcdde7683da86c97c7ccb6f6ad1fb55455cd59a6ae918dc5d2e8f839a5 1157 0 live/tutor/s2/2/state +48a4655107a5fc1a6fc487c20a9554622ddf91a522bda5464618f9ee7c265da4 49676 0 live/tutor/s2/2/strand-masked +d45c531e617935b29408e628c4b454ecb809ec47af49b2d805f4e620b288c931 245965 0 replay/tutor/s0/3/stdout +f37d5dbf0a41f9e25a78c1ce19b5399888f9577754c3e0e563ef6b21eae5f040 182 0 replay/tutor/s0/3/stderr +d45c531e617935b29408e628c4b454ecb809ec47af49b2d805f4e620b288c931 245965 0 live/tutor/s0/3/stdout +1efef17a301090c0840ddda2aeeb1c710649316a5562191cfb47365b33cafd1b 117 0 live/tutor/s0/3/stderr +a4a73156f86e3c3b18608eca7308bf5bf2588ebf6d0e6cefb970090d1ffc9086 1153 0 live/tutor/s0/3/state +1a34cbc3221b0fc06ddd39170e47ffe0cc87094837ebcba7e6103f87866136f7 47971 0 live/tutor/s0/3/strand-masked +05bb143c9351ce65eecb8b3fdd76590ca55777c92248de284a898c5dd20a4221 246117 0 replay/tutor/s1/3/stdout +01b897693f3c30041fd40439ca76e729ae5aaaf5caf5dc085214b4845cc2e9a7 182 0 replay/tutor/s1/3/stderr +05bb143c9351ce65eecb8b3fdd76590ca55777c92248de284a898c5dd20a4221 246117 0 live/tutor/s1/3/stdout +a33611f62907c3d910f2dcf7a7c3ad9a006af80d50cf7c40c0ee3a2524e90aed 117 0 live/tutor/s1/3/stderr +becb598b646766d1e9cad623b05b020e7f14f15e17db1ff715fd6bf8a995c488 1149 0 live/tutor/s1/3/state +def7aa36d653df64ac2f9dfd12c30fd71deb988071befc7661e7731f0b200d13 47920 0 live/tutor/s1/3/strand-masked +8bde7083442cb9a78807d2d393cdc17da98b53557d8dcd03ee908118d8e20fa9 243709 0 replay/tutor/s2/3/stdout +64dbd9529b83a7fe33488eda38af02c8d6eea125d49e7c56bf64d07408e83478 182 0 replay/tutor/s2/3/stderr +8bde7083442cb9a78807d2d393cdc17da98b53557d8dcd03ee908118d8e20fa9 243709 0 live/tutor/s2/3/stdout +04325776731ba78c71d107194ba6333d8846ef2f1c5bace247ee630a9789820c 117 0 live/tutor/s2/3/stderr +e9401946925d994a17256c79b85e897a829441d15ecf4fc9481b4a1746cca1ec 1153 0 live/tutor/s2/3/state +5b4a04e77188f2071fb0ac8f2b916501a70e0127401f456a841f303503b1bed4 47950 0 live/tutor/s2/3/strand-masked +94bcbdd4cee61a7fbbd03224ab43d5876c74175f78a243e63d719559136dfd76 1034 0 init/ops-engineer/s0 +ce22b3d13c2f64b628c2d61afb0c7bb0686f4e9293b1dfea0c97afbd09f75949 1040 0 init/ops-engineer/s1 +84eccac696aa52f7a6651ce7ca1918d1fb9aecbf33908cc7b2f4ace043a0668a 1036 0 init/ops-engineer/s2 +77d6a7d51e2963868304a72485cc19d36e8e4653ede3c2cd7ee80e0fe6d54093 6783 0 compile/ops-engineer/s0 +f746f4504850459123fff02d880417ef5fa17d6a4abde1f52ec38c296a7fbef8 2259 0 lint/ops-engineer +ae02d1bc55c93f4d8edf8f240a6a434fc309b0b408a86bbcdc24e5f1e7312f7e 226739 0 replay/ops-engineer/s0/0/stdout +de23828ba47a181e3e61f5adede2aadcf52fa3db5b56c023c7b79315b83721fa 182 0 replay/ops-engineer/s0/0/stderr +ae02d1bc55c93f4d8edf8f240a6a434fc309b0b408a86bbcdc24e5f1e7312f7e 226739 0 live/ops-engineer/s0/0/stdout +639a5c74e4759c04b1524fc30375612f398465c86a88354f0c63ecdfb3c0750a 117 0 live/ops-engineer/s0/0/stderr +a52a92b3763b648101afcfb16766037965c351da1dddf9a2cbcc63567fd71c8d 1094 0 live/ops-engineer/s0/0/state +53811e3d2d8e1811e01c555def3ff27e904e2d9e22b1e1679cccedb074ff3717 47194 0 live/ops-engineer/s0/0/strand-masked +87692a6f9a331348ad17d7297f26235875fb1e97da3c110801494d54f3f57a95 226999 0 replay/ops-engineer/s1/0/stdout +5fc6e139605812be0e31792da7754f079fb68d887df87800aa3acd44424db7e9 182 0 replay/ops-engineer/s1/0/stderr +87692a6f9a331348ad17d7297f26235875fb1e97da3c110801494d54f3f57a95 226999 0 live/ops-engineer/s1/0/stdout +bc9c740ef195642981c8a1d60b3a943c62fda6da07f4e66b93890c1f8f69b733 117 0 live/ops-engineer/s1/0/stderr +eb37423f899357c573fc58e2227261b786c5f98ab25d6834048fab9386abd1e7 1100 0 live/ops-engineer/s1/0/state +2827b6e0094e9bd41d581beb9184ee8d7af656a5ad0f0694c16c8a5b098a723f 47213 0 live/ops-engineer/s1/0/strand-masked +7a62a9599aab08bc38aeb7ea467264e0e49b39146e53f34e5ffaf17de40a7837 227467 0 replay/ops-engineer/s2/0/stdout +ad807a29be5b08f1719516c15166b6f4d2feb4e8589ea5fa911d30ac9adfb5b7 182 0 replay/ops-engineer/s2/0/stderr +7a62a9599aab08bc38aeb7ea467264e0e49b39146e53f34e5ffaf17de40a7837 227467 0 live/ops-engineer/s2/0/stdout +2ecdf20c93c2f2eedb4e820adad2dd01b1ac3fd847cb5fd24a8eda0701841c19 117 0 live/ops-engineer/s2/0/stderr +9cfee53bb47eb31f3f89d9be135cd9b0d42ca0a07b98fc627bd1fdb064851d25 1096 0 live/ops-engineer/s2/0/state +be7ab11fa821efb36d2a7fc2a88fb6301552db2ea8ebe61b4ded27b6708ddae2 47252 0 live/ops-engineer/s2/0/strand-masked +969f1500fda27aa721b0cf0c2ef89c8e7540a9f93b367a20038368a5eab10940 228644 0 replay/ops-engineer/s0/1/stdout +30e4a2667f2db6cd12abec0ae0063f1f9801ebb06d690e03fc6fea699807834e 182 0 replay/ops-engineer/s0/1/stderr +969f1500fda27aa721b0cf0c2ef89c8e7540a9f93b367a20038368a5eab10940 228644 0 live/ops-engineer/s0/1/stdout +22e64e4800b2dfdd2f8e45c4b84890150ed7d5bacc9b516a8de60a3774754045 117 0 live/ops-engineer/s0/1/stderr +bbf6b29fcf6550e9661c446a6d50900f8e40b320b885b111cf7defbe0be2422f 1091 0 live/ops-engineer/s0/1/state +9dba8bfd8ca7384cb211e421050f4eeec2092d5596ade8d3a144d03e474b39fc 51011 0 live/ops-engineer/s0/1/strand-masked +bb07d50b07df28a93830cecb06dea3fb6223a9d5dfa3fa349b1cdbc238bed9a2 228924 0 replay/ops-engineer/s1/1/stdout +4d7a9ee0ec774c5b7c63a277f268da01c79cf4c57b79fadb359f38391e7a5ea0 182 0 replay/ops-engineer/s1/1/stderr +bb07d50b07df28a93830cecb06dea3fb6223a9d5dfa3fa349b1cdbc238bed9a2 228924 0 live/ops-engineer/s1/1/stdout +96117ac39ae412f681892dcfd3fdded742815ebbd8611675a6d43bd2c2e4f286 117 0 live/ops-engineer/s1/1/stderr +989305eeb4f15f078a425c387d78425cffa11c4a93246c75f505e0dc53e281d8 1097 0 live/ops-engineer/s1/1/state +d411f2ae9ddaaec6e208684d9a609becbd065a227296288ba1443d4c6de00db7 51103 0 live/ops-engineer/s1/1/strand-masked +22ca4ab1c25ea224bebb7d10a657ad68ccb2fd02005d66b62567ab842eb0a505 229669 0 replay/ops-engineer/s2/1/stdout +286618f03117592d8dd137d39bb0a5bce023d0ce03cf11952f7ffd1a5c035d9f 182 0 replay/ops-engineer/s2/1/stderr +22ca4ab1c25ea224bebb7d10a657ad68ccb2fd02005d66b62567ab842eb0a505 229669 0 live/ops-engineer/s2/1/stdout +d701082ebcdd211b12d870c12d75e127937a03fb925f3d9a0ba01687aaa94615 117 0 live/ops-engineer/s2/1/stderr +592066466c77951fb41406478bb134ecebb23f3653ec0b04e9d865acc011e073 1094 0 live/ops-engineer/s2/1/state +13bfaae719f9a56d3357521da287486d3e7b47bc7944dc153a9a7138ad86d0e7 51026 0 live/ops-engineer/s2/1/strand-masked +bbffa5664975fc159aab153d44bda304fe99b5eda85c1d91b75f32a5ceab0068 227482 0 replay/ops-engineer/s0/2/stdout +8187f819f3324f58d3abd9f4262ac973b51e05e2620185968da99d85a3b4f9a4 182 0 replay/ops-engineer/s0/2/stderr +bbffa5664975fc159aab153d44bda304fe99b5eda85c1d91b75f32a5ceab0068 227482 0 live/ops-engineer/s0/2/stdout +ee677551307581602921dd124ffab0338f3588e877d157557cc1dc6435704e00 117 0 live/ops-engineer/s0/2/stderr +45caadd3dc867ac12f22d64b0ffd2b0abe39337d43162a0cb8e5e73c2c186db0 1089 0 live/ops-engineer/s0/2/state +e3c0e85eed27d8f66bba5fa0b26a9fba2b011082de8fc885b7483f2e3f105bb0 48593 0 live/ops-engineer/s0/2/strand-masked +b63dbe51c6263573bd4a2a6f6969a433871def71d1458ceaf1db12a8302b9479 227558 0 replay/ops-engineer/s1/2/stdout +86ef1aaaeab3b8d0840a07920f4cd8cd7859f7368cd7ec650bdfc7a9b11fcb40 182 0 replay/ops-engineer/s1/2/stderr +b63dbe51c6263573bd4a2a6f6969a433871def71d1458ceaf1db12a8302b9479 227558 0 live/ops-engineer/s1/2/stdout +7bd1982febdbc336308977d7184a1f54f5dd861be0199abe033573455179fc0f 117 0 live/ops-engineer/s1/2/stderr +ec6e51a3bfdd304bea4d8b827951c963e0b3ca2a66c3f1d06c1d66ce1dff09d5 1099 0 live/ops-engineer/s1/2/state +ff383c4225528e12db00e4a6b08274f06e168aa467d5bbaf0c134e113288737c 48612 0 live/ops-engineer/s1/2/strand-masked +9d83d40be062720eca90b282610cc4104cd7d361cd5a7b7834c59a0cf65c6fb0 229471 0 replay/ops-engineer/s2/2/stdout +73b43f5d60c92fcb3b106ce4f9443e8730d03da1040eb186ea767113cb71db3e 182 0 replay/ops-engineer/s2/2/stderr +9d83d40be062720eca90b282610cc4104cd7d361cd5a7b7834c59a0cf65c6fb0 229471 0 live/ops-engineer/s2/2/stdout +12dbb77d456385bf4ed6689fbeb73458a89422b025c4bcc8bf7cecfb5951ddd5 117 0 live/ops-engineer/s2/2/stderr +09c6e2380c1735784fba340a60fd99ac405c2cc15abf83bdf486c4ae8c1fe5bb 1092 0 live/ops-engineer/s2/2/state +132982391e6ad82922df9c4eeea52551e0feb8a3bb8b2484595087551ab128a7 48672 0 live/ops-engineer/s2/2/strand-masked +1558e5b0171eb29cc84d715e131a8cbbd0d74a6389fe7c4cd66d9c4cc02ea2f5 225850 0 replay/ops-engineer/s0/3/stdout +b28654872279b28ec7cc05bc5621f208aba4128ee81d86f8bddb6a99ca01d6ec 182 0 replay/ops-engineer/s0/3/stderr +1558e5b0171eb29cc84d715e131a8cbbd0d74a6389fe7c4cd66d9c4cc02ea2f5 225850 0 live/ops-engineer/s0/3/stdout +c14547c2bf91c96842dadeb522e0c89abed22398f52c943b629a36e7f9e09b64 117 0 live/ops-engineer/s0/3/stderr +a43c479cdc914052dfc71e66cea516df1d54e44a2e5a2331f4ced81e391a0be3 1089 0 live/ops-engineer/s0/3/state +dd57c08e8a56f52d159c3df3d0d408736959dff71d50380924879534b9b284a2 47012 0 live/ops-engineer/s0/3/strand-masked +c1b5e004ced76408813a4f7c88246e7cd0ff837236a7b5600a3e51f23065a016 226488 0 replay/ops-engineer/s1/3/stdout +8375d804ad90434ab0738165655712f86f988d40bf304a2d391048b9d1bcebc9 182 0 replay/ops-engineer/s1/3/stderr +c1b5e004ced76408813a4f7c88246e7cd0ff837236a7b5600a3e51f23065a016 226488 0 live/ops-engineer/s1/3/stdout +8ed18fb7fbbf5cde5bec1bfa2480dd7cb168abde9a33f0f5445300986a43a75b 117 0 live/ops-engineer/s1/3/stderr +ec16bc153a6148442e0b10de91cfc4b5dcb6967328b7d6145eab9d8567acc72f 1099 0 live/ops-engineer/s1/3/state +6284ff938b54d65fd9fd9906a6d50e67ce180848b2c7e0f93f66e5e36cd3e601 47094 0 live/ops-engineer/s1/3/strand-masked +ab169398ab04dab17c7fc37839f2c17c9927f52883d71e5a58bae8e5cfb6bb37 227179 0 replay/ops-engineer/s2/3/stdout +fc6602fdad0c277c3ac84a2f9600c892065c28490f417207834a34a65c72082e 182 0 replay/ops-engineer/s2/3/stderr +ab169398ab04dab17c7fc37839f2c17c9927f52883d71e5a58bae8e5cfb6bb37 227179 0 live/ops-engineer/s2/3/stdout +5b3ca4a4c7872103135e59aa2aeb6e5bc7a9223da3c8c78aed69226a70420e37 117 0 live/ops-engineer/s2/3/stderr +7e751828567e1db16bbdb7a30df3f4f3a23250d7fed9eb2d0f982156975cae98 1095 0 live/ops-engineer/s2/3/state +6a1a396b69be10f4becf49a6f3f5990c0352821fe8893325c7c306286124b52a 47075 0 live/ops-engineer/s2/3/strand-masked +3df5408b6b46a7e738d0aa400bebafb16e07dfa3034667b86af6cb84c03a292b 1006 0 init/trader-assistant/s0 +9de1bc6c0d10cef55dc806f4d7a4a968b49ae1c297ed4c3e16e603484bf99045 1001 0 init/trader-assistant/s1 +f76e2d2a83bcabae69e8bae58619900dab9555bdc9af5a816e50793d996ccef9 1003 0 init/trader-assistant/s2 +ff3b4d3b0fca1eed802b22f09c5cb37e33547f2f51a9bdc391dbbda55d95484a 4460 0 compile/trader-assistant/s0 +19cbf598f0ac63eea721d54201950e88acecd95f0c5747e7aa6688eff65f6f0e 790 0 lint/trader-assistant +2a85379b95ef8771de2fd8cae74267d4193c7e82dee7cfffc52e43423120d006 220885 0 replay/trader-assistant/s0/0/stdout +848262a4d2a9eba84715d4c6d92a82dd8036e06e8e2e86fd0d1f1bd63f7fbf1f 182 0 replay/trader-assistant/s0/0/stderr +2a85379b95ef8771de2fd8cae74267d4193c7e82dee7cfffc52e43423120d006 220885 0 live/trader-assistant/s0/0/stdout +64a0de534a072006554dad2d2128143ca8a6f03943b38d575820c8a5ea3dd9d4 117 0 live/trader-assistant/s0/0/stderr +458af99f5fe3cee3f8b542197806081fb19ac05cde29a79829c93e5b7dddc505 1097 0 live/trader-assistant/s0/0/state +3c52e8c537a3a0bd506bc7b6268b52cb028c5dae89b4e81b6ce92533c1166221 45093 0 live/trader-assistant/s0/0/strand-masked +98c12e385029ab01dda7317fa5c3d58b9dbea4ab276a777050e2f4d58844c685 220881 0 replay/trader-assistant/s1/0/stdout +dc26d77bf500107238d5f0fcdcb31c1de10149493b0680d421da60ebce7cd5c4 182 0 replay/trader-assistant/s1/0/stderr +98c12e385029ab01dda7317fa5c3d58b9dbea4ab276a777050e2f4d58844c685 220881 0 live/trader-assistant/s1/0/stdout +8812beaff17378a49225bf8aa9a39c99ae600381c137540ad4c574e864016fe7 117 0 live/trader-assistant/s1/0/stderr +a15f192af06c53c1c671e7f04177c3e5dd06cc6eea6e805447c1dfc5a6d82976 1092 0 live/trader-assistant/s1/0/state +5af8e2b44ca61f0903be38c287fb22d4a432c6e1db3bfe6e13a5358e1fb6edbe 45063 0 live/trader-assistant/s1/0/strand-masked +bacb0e62b903f5b07853ea1ca59abeed19abc2dc9d3e5d08c9b7824d330bdec7 220476 0 replay/trader-assistant/s2/0/stdout +2d545c16c968a0ceda348239c0d89f98b66ce61caae7fc76cf836c8090f33bca 182 0 replay/trader-assistant/s2/0/stderr +bacb0e62b903f5b07853ea1ca59abeed19abc2dc9d3e5d08c9b7824d330bdec7 220476 0 live/trader-assistant/s2/0/stdout +10e06f453ce6a17be647a9e4d71620bff37c94a710e285a8dd218142f509d9e5 117 0 live/trader-assistant/s2/0/stderr +68678683bb4dea90cc81cdcb532cf6245f4dd063ea1cba6a420c02d2f5ac2e95 1089 0 live/trader-assistant/s2/0/state +c557b8f88682f4468d4159ec3ba7df29fd7e5546844a1b22402733dfd250d2cb 45037 0 live/trader-assistant/s2/0/strand-masked +2e0d1bc7ef34fb3841acb0394e2b169f8be06e1c01824048a7dd8f4037574d20 222939 0 replay/trader-assistant/s0/1/stdout +89367ec6e45011434492641796c5c3fa8a7a64874b971d47385311ef29cf6641 182 0 replay/trader-assistant/s0/1/stderr +2e0d1bc7ef34fb3841acb0394e2b169f8be06e1c01824048a7dd8f4037574d20 222939 0 live/trader-assistant/s0/1/stdout +89809cd7231a63018e108ac1f04aa5b8af3fc017551fd22a5cfd142feeb8859c 117 0 live/trader-assistant/s0/1/stderr +aca34bc5745fdc7e291f722f6fb4d45e7888aed018c09ee760e463e945bfe6ee 1093 0 live/trader-assistant/s0/1/state +592a28f36b9f044bbdf0b6ddfb7bb0590f93c13e8f958f522299c76b24e95cb9 48603 0 live/trader-assistant/s0/1/strand-masked +82c76a5f922f149e20440c61dafa4da61eacaa15cbaeeb70ce21da851ffb30b5 222841 0 replay/trader-assistant/s1/1/stdout +2f469c23f13c5da97d1bbca9fe17ffbc3bb8d9c81040c9efb6de74f5d3afe3a5 182 0 replay/trader-assistant/s1/1/stderr +82c76a5f922f149e20440c61dafa4da61eacaa15cbaeeb70ce21da851ffb30b5 222841 0 live/trader-assistant/s1/1/stdout +89a9989648ebe052edc713b24ee9173b7e221e1d2cedfb0f73439c31e2345cda 117 0 live/trader-assistant/s1/1/stderr +363bcfe0c22899c0939593f03cde112275ed77f4f1ca2c21421bb8bd4cc0e042 1088 0 live/trader-assistant/s1/1/state +ac676dbb191f653346125b23bff7d0d9997a228615e963c70115eaae86abca16 48572 0 live/trader-assistant/s1/1/strand-masked +12a5089f57b3b7d18c6a6f50482067d05f05ad1dc2736d3f57c7fb6d4904566c 222681 0 replay/trader-assistant/s2/1/stdout +6edd858573708a6691393768f196f15aaa33ea7e2b55581fb1eba884bb3d3842 182 0 replay/trader-assistant/s2/1/stderr +12a5089f57b3b7d18c6a6f50482067d05f05ad1dc2736d3f57c7fb6d4904566c 222681 0 live/trader-assistant/s2/1/stdout +b50654e35332e02fe7f6cd91880787988d0323ad2239dd2a8921fd32d9991957 117 0 live/trader-assistant/s2/1/stderr +79ac829fef77fbea82a2dadbe15baccf8358a5ceb7e41c11dc0d705ef9fa26b4 1090 0 live/trader-assistant/s2/1/state +dcf3649a2a9ae8108ccff24516ad1e0a2e41bdc6a47a10ebdcb935bc7f642bdc 48560 0 live/trader-assistant/s2/1/strand-masked +44f5524e69484831022776f63a2da0ce2c98f1be936632601b179facbf848c3f 220568 0 replay/trader-assistant/s0/2/stdout +258bc7c960091aec210aa5d13cee82b4a3302885fbe65cc925fcaa05ee9862dc 182 0 replay/trader-assistant/s0/2/stderr +44f5524e69484831022776f63a2da0ce2c98f1be936632601b179facbf848c3f 220568 0 live/trader-assistant/s0/2/stdout +f1d3a558ccb77a2f7e26618d20e379f16ae8c39c4f617dd5935a5ab608c7f087 117 0 live/trader-assistant/s0/2/stderr +9574e820f99f0cfd13bb6c960004acf6435c8b81b92236f7d4b92a4e479c9c12 1094 0 live/trader-assistant/s0/2/state +8ea04dc158dc45b63cf017bfbeac2bd4adf26837abbdce0214a42bfdd712e4b2 46035 0 live/trader-assistant/s0/2/strand-masked +6bbe667a3fcf685945d103c550b63f550dd0b8b9e4402808cda18554e206be32 220618 0 replay/trader-assistant/s1/2/stdout +8aa5d6184565de78aa1a7c48968facddbf22d164c0d5e2a3f6643b612493596d 182 0 replay/trader-assistant/s1/2/stderr +6bbe667a3fcf685945d103c550b63f550dd0b8b9e4402808cda18554e206be32 220618 0 live/trader-assistant/s1/2/stdout +17ec63a21c14d115f733e8a16c3b1be5b6792f6ea5f91a90128cfcbd1fbcd2dd 117 0 live/trader-assistant/s1/2/stderr +931d0ccdadb951eb764fef7f896d77f227334b4f2cfe646154eb72e17c65de0e 1089 0 live/trader-assistant/s1/2/state +12c125ddd2e6c7eaeec65a4d19575637525977f54815498249adfbbac1f3a149 45997 0 live/trader-assistant/s1/2/strand-masked +9781d2383da56bca59234164412c4563159de46a3a8ab125917e0199ee8957eb 220383 0 replay/trader-assistant/s2/2/stdout +a71c67ecec10513bf29f6eb509e436aee077f477e344c66a61f5a527e0fd1e52 182 0 replay/trader-assistant/s2/2/stderr +9781d2383da56bca59234164412c4563159de46a3a8ab125917e0199ee8957eb 220383 0 live/trader-assistant/s2/2/stdout +4be189628b3b71287d787c028f1b2eab992025272cc376c4ba09e53f20f7d42d 117 0 live/trader-assistant/s2/2/stderr +80775ffa30c2acfbed9edde47af13e42e8ecbdb799e8b698092d6982f5897ab4 1091 0 live/trader-assistant/s2/2/state +30d296ed46b788b158237931ee4f0e60ad954198b3afdfe6daa985f1ecc91127 46020 0 live/trader-assistant/s2/2/strand-masked +d136ac8ce4234557f130eb70d1d31abd7a4c34129946920dae53b0f053615fcc 220363 0 replay/trader-assistant/s0/3/stdout +70e6e647c6d07e78bbbd14d983edbe6ebb3ca106b2ff777bbce3e7f4c2a749c3 182 0 replay/trader-assistant/s0/3/stderr +d136ac8ce4234557f130eb70d1d31abd7a4c34129946920dae53b0f053615fcc 220363 0 live/trader-assistant/s0/3/stdout +069f7b5465eb654f022691dae85ba0546a39928b0cb658b094f9502d31b6bdfb 117 0 live/trader-assistant/s0/3/stderr +677f621325b25871afb0cfa3b803ad4de7722ecf3261547a252980a68cd1377c 1097 0 live/trader-assistant/s0/3/state +612e3516766e2ad25ca9e0d721c57187c171e8f86ed19fcb622a339a32b24dde 44743 0 live/trader-assistant/s0/3/strand-masked +5ef3f84b99f998d4e76328c41dafa07841ee242c4a826a981323ecc61816579a 220323 0 replay/trader-assistant/s1/3/stdout +e8b50cfd4aaa7fe59d4feb787bd55b93eefc65ddfcc0e03e373a1085ffceb147 182 0 replay/trader-assistant/s1/3/stderr +5ef3f84b99f998d4e76328c41dafa07841ee242c4a826a981323ecc61816579a 220323 0 live/trader-assistant/s1/3/stdout +063d6a78dcbf7ff8ab8a0dd5bbcae7b216a325d87858758f6b54b6e40964163a 117 0 live/trader-assistant/s1/3/stderr +3a1471f4cb9d07c74bd16496753958324e344d4230fc1b8f2ffb1b42ddc4ec69 1090 0 live/trader-assistant/s1/3/state +d767ecce4062ca665a27b1c46f7eaa8b6460a9003b012d0798ad1d6669c60cab 44712 0 live/trader-assistant/s1/3/strand-masked +13de9bf5e7a7734102c8e3c7e3d4487de586b7fd8e733f7a6c738e049bacae90 219877 0 replay/trader-assistant/s2/3/stdout +ff42b8a14057a16eb7b4b4eb0dd1327cd02b907e81eb831adf9d36e4f48b561e 182 0 replay/trader-assistant/s2/3/stderr +13de9bf5e7a7734102c8e3c7e3d4487de586b7fd8e733f7a6c738e049bacae90 219877 0 live/trader-assistant/s2/3/stdout +18a7f1429339d36935883ed0130b236ef7378e5152d60ee89ede056a11164d86 117 0 live/trader-assistant/s2/3/stderr +242e259aec10d258929fc257cee403b8d699ad090a0c857ec4a7c0f2f2f1a8d5 1091 0 live/trader-assistant/s2/3/state +fb47f75a0b3445d1e702e061409249f56138df6511a6cc5a1b3ba0d6ad96b008 44703 0 live/trader-assistant/s2/3/strand-masked +63c1cbeefb94c321932b19a5dd87b8607dda91f65cf8ec716423d43281fe9aba 430 0 init/adaptive/s0 +40c7f6ea468be6d2fabed00eb6d72dd5d85948bae4b81b3ac0f134bd9dcff5ae 430 0 init/adaptive/s1 +76d7f40d47c589587ddd9ebeeb9491abc9e70f6ad5194008991b367bc4bf13b1 430 0 init/adaptive/s2 +9b8b3596cf03a76b9f40ace12615e3bf80047784faf06d2e0bba95ec8e6dff02 236 0 compile/adaptive/s0 +81597f96db0d2e02964faf9a53690b871f432924abc8da50e1697ef365e7c5a0 81 0 lint/adaptive +a96ee464b86d944e1c4f7c11c872dd2129ba84440be21749de21ea1d72309080 56676 1 lint-props/adaptive +18d60819c1a02a1f728a83abb975020b1a9c2d798937136862850fc48cfefa11 19428 1 prove/adaptive +0d68b3964806df677843dd5bbdad11486b9de286e6f9904985807c504e7e0419 38190 1 fuzz/adaptive +3d1b673e8deb25141fc624e96fd7482921047820aa76a196df4b838bca9a7a7e 43726 1 fuzz/adaptive-fixture +49cbf7d0b001f2402878869fc3819f0f75d82566e59ae9b8736ebbd43d5abe1e 149 2 replay/adaptive/s0/0/stdout +85baec52b2402bb25cd588afe5cf6bc7968ead30e4946ebef90a72275aa770e2 118 2 replay/adaptive/s0/0/stderr +4abb654491c0478d2a4db69af040bfbe3986c615c1acee3c90eec8b8cca8696a 79162 2 live/adaptive/s0/0/stdout +d85c3a4ff1d92bcb2a0c85e49108b4d66092184097250020bad1dc11d64981ee 552 2 live/adaptive/s0/0/stderr +196bd5d04e923cdc48c56504b02f9c55d25880ebcee563ed0f048f0c2604afb7 478 2 live/adaptive/s0/0/state +21330bea8b92e26bf96fe6cdfb0a8646deb7d29485c91a02a6e2d51ec2740727 27907 2 live/adaptive/s0/0/strand-masked +49cbf7d0b001f2402878869fc3819f0f75d82566e59ae9b8736ebbd43d5abe1e 149 2 replay/adaptive/s1/0/stdout +85baec52b2402bb25cd588afe5cf6bc7968ead30e4946ebef90a72275aa770e2 118 2 replay/adaptive/s1/0/stderr +051be70a4f603ff4aa65ae971bb5ea042394b10837afaa3f4cbacb063be5103b 79162 2 live/adaptive/s1/0/stdout +70bd793b4d2def463a33da69071b4314476639bdd1b07ca784932a93be6cea97 552 2 live/adaptive/s1/0/stderr +ddf50358cf56dea6c7e5ec004c8795cdfad482f0fb65967770431109699987c4 478 2 live/adaptive/s1/0/state +08863b28c9df18a5c3105522ca049c87a06616ba13d9e3a45ed37c5c7041e16e 27907 2 live/adaptive/s1/0/strand-masked +49cbf7d0b001f2402878869fc3819f0f75d82566e59ae9b8736ebbd43d5abe1e 149 2 replay/adaptive/s2/0/stdout +85baec52b2402bb25cd588afe5cf6bc7968ead30e4946ebef90a72275aa770e2 118 2 replay/adaptive/s2/0/stderr +2e33e834671fa71ddd729bc97215bdbd729866eaa5a880bc50b557ac3f7feca3 79162 2 live/adaptive/s2/0/stdout +2db0b2390a821596625d0fd6ebec4bb7615148aa20e0abb95ae267e068eeac18 552 2 live/adaptive/s2/0/stderr +2105dd592f17c35aa8e57f9bd738278d088bad8064e33002f3a7185b0c124048 478 2 live/adaptive/s2/0/state +81f82ff0db5857bba0a51a9f6faefa34fb58323358fd4afbb16c03f1c6a656da 27907 2 live/adaptive/s2/0/strand-masked +aee13291b1a51206014172e6e3dd2c60c06eaca6b960bd6c633f4c6d599dd0eb 148 2 replay/adaptive/s0/1/stdout +5094df0abe4c6ca62ae2c4229408f711a7fc97a4f4da755abfd968b2fbfdaa19 117 2 replay/adaptive/s0/1/stderr +db4a3eb8eb10234d030c45dc751ddeeea656c366ee5c1190f57c7c3286da4429 71376 2 live/adaptive/s0/1/stdout +0bf96921bb5ebdde1645d34f855cbdb667d2bb84d9e3f9c9ce4e32bf016af7ef 2061 2 live/adaptive/s0/1/stderr +ac69ee7e08f9eb394010a75586fcade99063d0d41a675df2926c0bc293e9e760 479 2 live/adaptive/s0/1/state +2d316a3f9fadbb3995f013644ff3d1d4a68a1267a15de0ffa9777c7239614a48 27426 2 live/adaptive/s0/1/strand-masked +aee13291b1a51206014172e6e3dd2c60c06eaca6b960bd6c633f4c6d599dd0eb 148 2 replay/adaptive/s1/1/stdout +5094df0abe4c6ca62ae2c4229408f711a7fc97a4f4da755abfd968b2fbfdaa19 117 2 replay/adaptive/s1/1/stderr +005e46d0f63c50a744c0e9d1030302b4e8df8ce8e1903403ee686436057e73ea 71376 2 live/adaptive/s1/1/stdout +2791d860d7d2b72268d4eff25a91197cb9dbbb5331181b7f87bafdfba15689ab 2061 2 live/adaptive/s1/1/stderr +818c171a95a489abde856f5af739bcda6fd62a80c3fb2f6af2d508e9222890b5 479 2 live/adaptive/s1/1/state +2bb336e74d2f40f36072b7c30e2a736bd23b498d6e640f9aafde1a78031a3c49 27426 2 live/adaptive/s1/1/strand-masked +aee13291b1a51206014172e6e3dd2c60c06eaca6b960bd6c633f4c6d599dd0eb 148 2 replay/adaptive/s2/1/stdout +5094df0abe4c6ca62ae2c4229408f711a7fc97a4f4da755abfd968b2fbfdaa19 117 2 replay/adaptive/s2/1/stderr +4773c87e1362f05a1b27808fc9eee5504d0c1dd5dfec8674b7788f369d9e151b 71376 2 live/adaptive/s2/1/stdout +ed858b7d1d3925a7b21cb602eb6391f10bee64e378d87018b620e571229f31fe 2061 2 live/adaptive/s2/1/stderr +8db79ce8679fb200d137995399b3bbc4470333bbedc69f1d3acafc9433740716 479 2 live/adaptive/s2/1/state +36e6e4e275507693e4c37f76f0d6b85ad7e25e82d9f71e8bcf658a8e7acbcd1f 27426 2 live/adaptive/s2/1/strand-masked +426ef6053aebe5792b8d73fe2ef5204f8dbefca17b23d568ef176a0e19ee34a8 148 2 replay/adaptive/s0/2/stdout +8d12d511a8e2df2f34d949b6ac328c0935a086f7ac050fd281238f110ac06b92 117 2 replay/adaptive/s0/2/stderr +24f4254cbba29b0a7e3158ba1485cdfb92f05953f46c4809e3714356aa0e3063 76279 2 live/adaptive/s0/2/stdout +a16fd44afef5f782ec52e41b6a24e5276e62570a2eea5cdc8ae706bc57a97b12 987 2 live/adaptive/s0/2/stderr +0526d718feed35ea5cc3ee39a90838c3a25f3d83406a1c5b29f07c9dc8fd04da 477 2 live/adaptive/s0/2/state +a98328af4aa743c18d5e824373f3aeb3e1e8b0cd8d0b4fcee4b6f983f150ae2d 27300 2 live/adaptive/s0/2/strand-masked +426ef6053aebe5792b8d73fe2ef5204f8dbefca17b23d568ef176a0e19ee34a8 148 2 replay/adaptive/s1/2/stdout +8d12d511a8e2df2f34d949b6ac328c0935a086f7ac050fd281238f110ac06b92 117 2 replay/adaptive/s1/2/stderr +1f87a8913e8d7033168f8c80f096fbda9776492968cfa84df7a0b470558c709b 76279 2 live/adaptive/s1/2/stdout +d431c19864f1d31cc9c45d582f55a32a945749d85573c1af648b3b7f4c19a709 987 2 live/adaptive/s1/2/stderr +4c78150eb3ee3a6aaa0a9f59dde681d95b275e08712637be9b6ffac29781c8a2 477 2 live/adaptive/s1/2/state +65f48116601ae6ac5127d472d9137205f08f2c16221226e07f5a0e843c455b75 27300 2 live/adaptive/s1/2/strand-masked +426ef6053aebe5792b8d73fe2ef5204f8dbefca17b23d568ef176a0e19ee34a8 148 2 replay/adaptive/s2/2/stdout +8d12d511a8e2df2f34d949b6ac328c0935a086f7ac050fd281238f110ac06b92 117 2 replay/adaptive/s2/2/stderr +e2a768eeb32f87ea64572b70da963fc4210d0780021df71322853f2cdc83dd75 76279 2 live/adaptive/s2/2/stdout +b58d5a61856197d8ee7b81913403b434e2a2af2e0b1dfe0024a60d08bb2e6cb8 987 2 live/adaptive/s2/2/stderr +3239ceb3461c1b12c57d678e942c370f895a029732cae3c9eb891129ad5d5d75 477 2 live/adaptive/s2/2/state +edd7c63cdf69ebb3a2f8c47f8085b4fed6c85cfdd97d9522ad5a2461a0e3b613 27300 2 live/adaptive/s2/2/strand-masked +f607c300687ebd3c5aa60d0e6f3c10af875ebe81b8a9fb0ea8bbae40ff82c6ca 149 2 replay/adaptive/s0/3/stdout +54917a4104b0c7109c65e5d8d43195b00249403b23f9a54c01d72d320c15b9f6 118 2 replay/adaptive/s0/3/stderr +2a3065301f72d9adc4a1ab9d7e7b4d6d1e9449cda2ef6833cabebb3019a31138 78364 2 live/adaptive/s0/3/stdout +1ae8397327a07da2c7a9243830e9acde55944f70d985f3d4e0836e187fe6f078 661 2 live/adaptive/s0/3/stderr +a1432cda0a98965c92130389a6750e37f0393c6218b440202e0ababa85bc9877 475 2 live/adaptive/s0/3/state +0ff951b1f5ab58975ed3d1d5f91c501c237597c9b67f9ba09a7c0cb2315c2ec6 27523 2 live/adaptive/s0/3/strand-masked +f607c300687ebd3c5aa60d0e6f3c10af875ebe81b8a9fb0ea8bbae40ff82c6ca 149 2 replay/adaptive/s1/3/stdout +54917a4104b0c7109c65e5d8d43195b00249403b23f9a54c01d72d320c15b9f6 118 2 replay/adaptive/s1/3/stderr +9eb9e8aeb233a6fd50f9c7113ce5ae429d4640bfcc08d6a76561fc315c6c51e7 78364 2 live/adaptive/s1/3/stdout +f0a8994cc63a3f673cb0457ec8dd6876b6462ced69cf6f9be99acf582e5d581c 661 2 live/adaptive/s1/3/stderr +bb7df25c4a9ce87c4abf173ef20a157728b20a7e9118036507de4501b9e925f8 475 2 live/adaptive/s1/3/state +92902c05ab881e409a66b19219a71123dfaa0f06fd8f5baeceb313028ce1d80b 27523 2 live/adaptive/s1/3/strand-masked +f607c300687ebd3c5aa60d0e6f3c10af875ebe81b8a9fb0ea8bbae40ff82c6ca 149 2 replay/adaptive/s2/3/stdout +54917a4104b0c7109c65e5d8d43195b00249403b23f9a54c01d72d320c15b9f6 118 2 replay/adaptive/s2/3/stderr +2b172adafb9d922c6a7e3389907138de2420427bea5ed5aea58508660d343d88 78364 2 live/adaptive/s2/3/stdout +b9b41413ad6da098b25ddfafd143ead82f8b358276adfac5e6ec6d60c72342e8 661 2 live/adaptive/s2/3/stderr +c93cf648faf815fa472214f9297776c151b9cdb149c16a45e90ae6f00d4b77a3 475 2 live/adaptive/s2/3/state +4c2a7806188f19221cc03193739369e24f1dc65291078704cdc3e2c4ff29a41e 27523 2 live/adaptive/s2/3/strand-masked +602ba028aa37aeb3dbd712d6edbe460428d2b5e712d4f3cf74f91a98cc8f07e0 430 0 init/guarded/s0 +fc1e5b287a562f7a4db63e8cc60a452508b55e674cbce0690149135bb2e37f24 430 0 init/guarded/s1 +f8ffda61225b6098b278187fcba389d35aff11f4f5b28e3aa38e167715502447 430 0 init/guarded/s2 +9b8b3596cf03a76b9f40ace12615e3bf80047784faf06d2e0bba95ec8e6dff02 236 0 compile/guarded/s0 +81597f96db0d2e02964faf9a53690b871f432924abc8da50e1697ef365e7c5a0 81 0 lint/guarded +c34b50e5422bc56f696ab63579e8b8f3e9cff5486e94bd924d4aa0583c4510ae 297 0 lint-props/guarded +fee49673fb6c25f4573a9ca15861f6860538ec8465b23958c2ebca4069b98538 655 0 prove/guarded +cee9cd01d6f33769541950358ef25a3f68eb44933d4af3226badad94be8dbb10 808 0 fuzz/guarded +cee9cd01d6f33769541950358ef25a3f68eb44933d4af3226badad94be8dbb10 808 0 fuzz/guarded-fixture +79fb2e242f21d41afecbc1e5dafffcbc4cb585369aa8a09f2a280e2c608df649 149 2 replay/guarded/s0/0/stdout +083e51fa835791194183b69f2e87c533ca4f76c5a255e61d5a8372242774287b 118 2 replay/guarded/s0/0/stderr +ea584565b7fc8f96196d16fea039351ca0876b13a5c002318f039c3970072496 77671 2 live/guarded/s0/0/stdout +e978906af2ca3b994af5acb8c06ac9c56fdf18942dbb6c8fa060683af757b4b9 879 2 live/guarded/s0/0/stderr +3a1aec5601b2930d098956583eba6dfd1cdc1adaed0b98e24a9841691919c7ce 479 2 live/guarded/s0/0/state +ac2ec4f06e07abd0047af7786a45a7de1213392e91066dc6fe2660cfbc6c7737 27103 2 live/guarded/s0/0/strand-masked +79fb2e242f21d41afecbc1e5dafffcbc4cb585369aa8a09f2a280e2c608df649 149 2 replay/guarded/s1/0/stdout +083e51fa835791194183b69f2e87c533ca4f76c5a255e61d5a8372242774287b 118 2 replay/guarded/s1/0/stderr +cd2a3ded41b9c65d43993774f47c4e46bef51b14ec5275d18e91a088c3f0afe7 77671 2 live/guarded/s1/0/stdout +54782111f71a000fad80d25247513610f0c51d344f9c2ce3558f89f55a5079f9 879 2 live/guarded/s1/0/stderr +117c5dee831028d5dd8a15339042f10357a8a8316250012278e08b6a29fc3738 479 2 live/guarded/s1/0/state +04df575bcba0b3db9f7cda38af1310016086409ab291dfbb92cf6230c6206d71 27103 2 live/guarded/s1/0/strand-masked +79fb2e242f21d41afecbc1e5dafffcbc4cb585369aa8a09f2a280e2c608df649 149 2 replay/guarded/s2/0/stdout +083e51fa835791194183b69f2e87c533ca4f76c5a255e61d5a8372242774287b 118 2 replay/guarded/s2/0/stderr +86fa8923cd1769bfd6360c7b16164dc956f1be8fbd1a5792bd7b67610cdeaf33 77671 2 live/guarded/s2/0/stdout +cd5d1da7b94b074675dbc0bcaf419a89a79ff59b335dfcd8db8a4479f84240ed 879 2 live/guarded/s2/0/stderr +52643f280cd3800d2f0f51be9df2c9de0d7ceb875e8c3c291e6ceb9c6116753f 479 2 live/guarded/s2/0/state +4d9f2008268a110913d79719040b8f0801acba18b6b358eff8473c98d096c5ef 27103 2 live/guarded/s2/0/strand-masked +4ab63115260d8db20a2cb9a1405af91c65b4c0fd193c6ba0558f47e9201bebf9 148 2 replay/guarded/s0/1/stdout +2638cca9bca31a2a2ef99939d155a6f6148d2d17c35922fbfe728b2f05b1c84e 117 2 replay/guarded/s0/1/stderr +e6620bb1b57ca95ccbfbb6025c1c1ca8db3e32cf9a203ad64c442890fdceee1f 70553 2 live/guarded/s0/1/stdout +e363c8a4260fef732b4c94020409aa322d406e32d97b60ddc56cbe931a52ca22 2319 2 live/guarded/s0/1/stderr +e0f70b42c7147cc0d5d86de37d5dec3dd90b3a447f4a244fa9dd80bbac1ed8bc 480 2 live/guarded/s0/1/state +f93344afc282ca1a3e318ba3212bfe19bf6069dddc6b2acdda7f71d2e7830541 27503 2 live/guarded/s0/1/strand-masked +4ab63115260d8db20a2cb9a1405af91c65b4c0fd193c6ba0558f47e9201bebf9 148 2 replay/guarded/s1/1/stdout +2638cca9bca31a2a2ef99939d155a6f6148d2d17c35922fbfe728b2f05b1c84e 117 2 replay/guarded/s1/1/stderr +b2e71082f53686bd168bacdc9e4e8f70c9bb8ff1201222318f11887989fd1c67 70553 2 live/guarded/s1/1/stdout +618b1d4f4992c6809a4b68237c9009a559445cabad5dac22f8067daaae16c04e 2319 2 live/guarded/s1/1/stderr +46b5350383b0778f791d5e8b798899befb1fb2abf13f26a780ed86c43f8ec5f1 480 2 live/guarded/s1/1/state +daa7cf081926f197cbff40714a26d927652e419b7c3c2dafd29ae8c3a3773350 27503 2 live/guarded/s1/1/strand-masked +4ab63115260d8db20a2cb9a1405af91c65b4c0fd193c6ba0558f47e9201bebf9 148 2 replay/guarded/s2/1/stdout +2638cca9bca31a2a2ef99939d155a6f6148d2d17c35922fbfe728b2f05b1c84e 117 2 replay/guarded/s2/1/stderr +5736c9f73f4d7a854759f54160848b37b435808841bce78e2228b2f721f301e0 70553 2 live/guarded/s2/1/stdout +2654776fb570744ece5ddddf93875e522298cc4171f8bbdb789376b72bf43659 2319 2 live/guarded/s2/1/stderr +3e9c94b2b2d6d1f526174065230de436d7b358fa5ae49cc90efce571f3d5bc3f 480 2 live/guarded/s2/1/state +b66d2519cd4bafd62e966c681ff2005e08850eaaa089bd4b0f7b381298c19b58 27503 2 live/guarded/s2/1/strand-masked +7b8e604dcc36bc674f083370be6221840ba69e4e281128d5ade1d01c81337360 148 2 replay/guarded/s0/2/stdout +5117ddc7df0f296d91d156bd3d04a9be5d90f811983476e6c9d3bdf4d4ab3133 117 2 replay/guarded/s0/2/stderr +a9f364ec1d184206094a3205afb8c816e18c6a92ebec437253d126831ce03bb9 80316 2 live/guarded/s0/2/stdout +4760a271da5f95e415bab889d26066a97ce84316d08e328aedd2fe50847fea7e 660 2 live/guarded/s0/2/stderr +e110a6eb2c15bb051cd57c16e0eac13c1270fec8b6219bbabab69a1ae7024c84 480 2 live/guarded/s0/2/state +2c430e9c3416c86772f790271dc08e6be758e0578bc3bbd3c32900b44b514e2c 28203 2 live/guarded/s0/2/strand-masked +7b8e604dcc36bc674f083370be6221840ba69e4e281128d5ade1d01c81337360 148 2 replay/guarded/s1/2/stdout +5117ddc7df0f296d91d156bd3d04a9be5d90f811983476e6c9d3bdf4d4ab3133 117 2 replay/guarded/s1/2/stderr +08f857df80ddad59ad0ac18ad996e732520d7796ef0731baf111f39e52b910d8 80316 2 live/guarded/s1/2/stdout +77b90f8102286373ef53b18394a616aceb1fd24e56965cb2d73c16c26e9d318a 660 2 live/guarded/s1/2/stderr +37f0ca8a08b73d3bf63e5c0fa929a5cf928f151ff2afa5395e710d2c7a937797 480 2 live/guarded/s1/2/state +8b281c205bc97dbbd8d33d551cc3d7a642fea54fab1735d43170f9a9b5c476ab 28203 2 live/guarded/s1/2/strand-masked +7b8e604dcc36bc674f083370be6221840ba69e4e281128d5ade1d01c81337360 148 2 replay/guarded/s2/2/stdout +5117ddc7df0f296d91d156bd3d04a9be5d90f811983476e6c9d3bdf4d4ab3133 117 2 replay/guarded/s2/2/stderr +01ea19e947c0fcdf0219ba821957e1c670696faa7e3d2bb7777a453df6526bb4 80316 2 live/guarded/s2/2/stdout +3242d12ee3dc4d488ca8dac1295b1db4b213634cc9895fc09a83fde71494faa3 660 2 live/guarded/s2/2/stderr +690b59a47481e4e08b43122beb317b96b7d939b933589f2e46dfff1b0b417a24 480 2 live/guarded/s2/2/state +2bde671ee91e7981962f8bbec22655f0cb2287101a9b4bc8e3adf27c539c2328 28203 2 live/guarded/s2/2/strand-masked +aee13291b1a51206014172e6e3dd2c60c06eaca6b960bd6c633f4c6d599dd0eb 148 2 replay/guarded/s0/3/stdout +5094df0abe4c6ca62ae2c4229408f711a7fc97a4f4da755abfd968b2fbfdaa19 117 2 replay/guarded/s0/3/stderr +b8b90de32e44170091b6378af2f278ac40937c1338a966bac8ce12e2a0028761 78854 2 live/guarded/s0/3/stdout +be0e99ad68a570fe7dc4aff41236e9b960c488fc9584b91c0b24c29fb2177c26 660 2 live/guarded/s0/3/stderr +edd8e907a397800cf6c0436357f778e4c30063e1a302c67ac5dc2c34d7f77a9f 479 2 live/guarded/s0/3/state +5cf4a5953f3813fda72d87eb5a4dcec8fb0f3162ed613dd7ed1897deb6f95cb6 27707 2 live/guarded/s0/3/strand-masked +aee13291b1a51206014172e6e3dd2c60c06eaca6b960bd6c633f4c6d599dd0eb 148 2 replay/guarded/s1/3/stdout +5094df0abe4c6ca62ae2c4229408f711a7fc97a4f4da755abfd968b2fbfdaa19 117 2 replay/guarded/s1/3/stderr +a805e3d8d4388997e39000d698d6ffbbd0f6c38365e9c9b37e93a0bd3ad250eb 78854 2 live/guarded/s1/3/stdout +c9655ab1604704ac2926418e72c1b374cf61c313ef234d1739eae7068dab7ad5 660 2 live/guarded/s1/3/stderr +c35cfb85e3a512e28ca8a7f3e7deddfc508d11200bb0c3c75b7509869776700e 479 2 live/guarded/s1/3/state +d5323fdae729b1952df95c6beaec3097f0dfab64e90f9357ddfd12b28724d7a0 27707 2 live/guarded/s1/3/strand-masked +aee13291b1a51206014172e6e3dd2c60c06eaca6b960bd6c633f4c6d599dd0eb 148 2 replay/guarded/s2/3/stdout +5094df0abe4c6ca62ae2c4229408f711a7fc97a4f4da755abfd968b2fbfdaa19 117 2 replay/guarded/s2/3/stderr +f0a85fcb5f508ac03709f9a527302907ba80b0f5909c66767634f8e250e62fd7 78854 2 live/guarded/s2/3/stdout +f439b7302f06d156e5d139676825a773a0a9d619c23446035223222c640890e8 660 2 live/guarded/s2/3/stderr +3072c60d80ad6089a7a67e9d190185a4694e6f521548cb95b0c62a5b7f422ab2 479 2 live/guarded/s2/3/state +edfd4c2a22a867697365d8a8a567fb9f56ed5d6e6b17c8e08278d8102ef4cc5d 27707 2 live/guarded/s2/3/strand-masked +da4054e7bd05e6d49a6f8c8c3ff2eb4e65ca24b762ceb80b3012d535f0b95cbb 786 0 init/scout/s0 +c1e3224c0ae79f107da52a4e73749a3640e6ff8ce903a353f2f130570eef95c1 786 0 init/scout/s1 +8da515f2f7fc269fb7ca023568e04e6dc7e235bcc435fec771028d1d2214214a 786 0 init/scout/s2 +3fb39f917f5c76666a1b3af2da160b84aea6a7e733d1048567e2e447e8086a36 647 0 compile/scout/s0 +852b9c9e43eed1f51a48d8e003374f9556ea591b94efc0dbc8ac9e047edf4e57 86 0 lint/scout +a7f7772fba1c7b27f2af454edae60dd1eeaf692204a18f3fa7837fc70c58c549 158725 0 replay/scout/s0/0/stdout +954469a9e1dc9f8a3f72ba059a5d284c9a776af337704aacf7a3db3826ef75a7 182 0 replay/scout/s0/0/stderr +a7f7772fba1c7b27f2af454edae60dd1eeaf692204a18f3fa7837fc70c58c549 158725 0 live/scout/s0/0/stdout +bcc36e153851f83223c0ff8ebae049a462ba786a548732e74574ca17a4b421d4 117 0 live/scout/s0/0/stderr +4dd03967c5d134d7a21b8beffadee4381dafa10ce73f7f8ab348c979c272b914 861 0 live/scout/s0/0/state +d08dc3559a43209f2014dd6fb4441a6bf32277f063b584d01042159abe7d41fc 36105 0 live/scout/s0/0/strand-masked +71ed37f6eb1087be6d3d21724cc6998baefc7b4fc8edb15afb9584087b10132a 158725 0 replay/scout/s1/0/stdout +b28c18646d75dffeeaed6d5399cf618897def31beaa31699f3d1b41969646701 182 0 replay/scout/s1/0/stderr +71ed37f6eb1087be6d3d21724cc6998baefc7b4fc8edb15afb9584087b10132a 158725 0 live/scout/s1/0/stdout +ed33a6a1564c48bb1fde12899b171448618b3552bf57d353fc459da9d243d23d 117 0 live/scout/s1/0/stderr +110fa6e0f259a9f98055562ff47ec0cf2eb50c9a2e0fa4390fa2810796d157b5 861 0 live/scout/s1/0/state +68fb67ca546b8d66c41d9c272b1a8410f86303edb3e9c35c09c3c994c2c0dabd 36105 0 live/scout/s1/0/strand-masked +a7a37eafeaab695f5d13520f1f64f62d3a88bd39c1041fa8d3a46fa539412d90 158725 0 replay/scout/s2/0/stdout +4bd1ca1f656b988045b82d1fbb36a18e0b36c9ea9b2edfe2670c9d11e105a1ea 182 0 replay/scout/s2/0/stderr +a7a37eafeaab695f5d13520f1f64f62d3a88bd39c1041fa8d3a46fa539412d90 158725 0 live/scout/s2/0/stdout +bb16f95ac610530bc100028ed46aac8566f0dab186e18a1eb0cd8c2cc0a684a7 117 0 live/scout/s2/0/stderr +1e47afa85fb2e8a626527dc491eefd980355d2ff4b70c86914884f8f897f71b1 861 0 live/scout/s2/0/state +5c502c43c60e087e601e54c988b1dfef0511e8cddfa6dcf0f893152a8d7ae711 36105 0 live/scout/s2/0/strand-masked +a3292a977fa90802521acd429981b7499be5aaf41868e31249f1d7c278ac69c6 160589 0 replay/scout/s0/1/stdout +813b55b7abac746318321b54270e63262160990d55d7b9655987d1a05ebcd268 182 0 replay/scout/s0/1/stderr +a3292a977fa90802521acd429981b7499be5aaf41868e31249f1d7c278ac69c6 160589 0 live/scout/s0/1/stdout +d3ebc59238118c78ab027e06f77f136b46b204385bac1655e9e29f6a7db06e29 117 0 live/scout/s0/1/stderr +6b104785ffc6bb7d732600fe03826f3593d64909a09f21cae276d045dd5b26c6 854 0 live/scout/s0/1/state +5edd99ea8991555f7e448b5fe5f641d846ddaef82d3bd617585ff583a8f00219 39612 0 live/scout/s0/1/strand-masked +0d9381c6537556d6b7213da7790649539c18e8a1e443226564e0bdbce8f8af45 160589 0 replay/scout/s1/1/stdout +f0969ab6f3f5e67a5804d99781d8264694ef845d7cb4f43bff5a02243bf62230 182 0 replay/scout/s1/1/stderr +0d9381c6537556d6b7213da7790649539c18e8a1e443226564e0bdbce8f8af45 160589 0 live/scout/s1/1/stdout +b51712ff25121e31800c3aee2b80c01a3de7eb4c64d89ca118349ca847955307 117 0 live/scout/s1/1/stderr +b027f2492da2c6e3630e42c13d0fc50f681cf849c1d66b72e6f0ced94cd9d1d1 854 0 live/scout/s1/1/state +093f7c5f8da3ccd83f36d2f60244296a438859d15beb15895f25aa9eb94e7838 39612 0 live/scout/s1/1/strand-masked +b493b003bfe427e8e159ab08dd021614836b80e7b75df7597be3ef55c90bce06 160589 0 replay/scout/s2/1/stdout +8d6db6a3b73fa6ab633e32770672e02ec602e8262782c9b834a747596c3acccd 182 0 replay/scout/s2/1/stderr +b493b003bfe427e8e159ab08dd021614836b80e7b75df7597be3ef55c90bce06 160589 0 live/scout/s2/1/stdout +8886a1d25258cee9d63c348415ffa251a83d5d98b2791271a61a5993ddb07319 117 0 live/scout/s2/1/stderr +71835bfb40e35f9d044cd6504424993ea3c480b0b37cabb2113922c6234ba94d 854 0 live/scout/s2/1/state +f7b36ee50e6becae3aff3a94d5b8acf34027c214fe0e6623461138788dff6075 39612 0 live/scout/s2/1/strand-masked +8cfa2c836e70f0b864392a9a4661a9b31aa278c2dbc4575831c9a4877f196a2b 159214 0 replay/scout/s0/2/stdout +984c15f0061f5f96a8b97bec57bcc3df3f1e97cde919b53bb00e85d0fb44bc2a 182 0 replay/scout/s0/2/stderr +8cfa2c836e70f0b864392a9a4661a9b31aa278c2dbc4575831c9a4877f196a2b 159214 0 live/scout/s0/2/stdout +49618cdc93e1cdc589e0d8819f74b2c34d58f9b82f656bb22fe1de53fc65f7c8 117 0 live/scout/s0/2/stderr +e6427ba11ce03075e9c8ca9bd8df2dc9f3467fb8c1f4ebcfe65ac054fde56c6d 852 0 live/scout/s0/2/state +e426a6650a978f0d0c657f52fa2a4f7b26ac6df4e8df649e756e767172f39402 36348 0 live/scout/s0/2/strand-masked +dc25997e8dd3e524a9ba26d68dca22b65bc3249776b74fb526f78ab28c859543 159214 0 replay/scout/s1/2/stdout +ba5813adc4d806bf5c1a28c24f929c4d34f3f5571376d3ca517580efc8105941 182 0 replay/scout/s1/2/stderr +dc25997e8dd3e524a9ba26d68dca22b65bc3249776b74fb526f78ab28c859543 159214 0 live/scout/s1/2/stdout +d280c46a5f8718256c1599afb6d634f2a0da8fe30ed7c73a712d105e4cae54b3 117 0 live/scout/s1/2/stderr +8fd7e17ecc68658eb1674277ab407cfaf1a22e75491131b9630acf9ad9783b5d 852 0 live/scout/s1/2/state +ebfec41330bad6b1bc86d33d32961dbf67caf6971688439c5f201bf9f541a3fe 36348 0 live/scout/s1/2/strand-masked +4b8095c09eeb401f3cc4c4e962d2deac5fb0e9fb87bbc21fc911fedf6e1b936b 159214 0 replay/scout/s2/2/stdout +af69966555ede017d066725b438c6f9541f1fb5c07e75d4060f91db13bb96dd6 182 0 replay/scout/s2/2/stderr +4b8095c09eeb401f3cc4c4e962d2deac5fb0e9fb87bbc21fc911fedf6e1b936b 159214 0 live/scout/s2/2/stdout +062a68722489897c2ad5b0fe8fc62784f3667296aa9a681bc035cdcfc146bb7c 117 0 live/scout/s2/2/stderr +135e7dcfde93e83a83629b1981082b5595065e95e8646beb07a8686a0c2f2057 852 0 live/scout/s2/2/state +e186766adffbcde4052c9d6092a803bc7c12912ac710800b4104f34149e3f7d8 36348 0 live/scout/s2/2/strand-masked +ca7ac79706e6123c2213d06bb512b42f3aa68ea674390e0ed97ded193ac31b20 153568 0 replay/scout/s0/3/stdout +dc382a7e87c1308524ef662f8499b25c04687bd9a02c5ebba2d2dab4199bb591 182 0 replay/scout/s0/3/stderr +ca7ac79706e6123c2213d06bb512b42f3aa68ea674390e0ed97ded193ac31b20 153568 0 live/scout/s0/3/stdout +abac5060ed32c88ac7f1e6c72e67bba7240471bf3582384888dce76056a490d0 117 0 live/scout/s0/3/stderr +b78a81d3296cf97edae90aa02558adf3d677f46b7c08ea67db6338ccc7bf82f8 825 0 live/scout/s0/3/state +2d3fdcc0542bd0f76e8b5b77baca516a255fab24d0dad77c9c79d2a7bcc7c105 35551 0 live/scout/s0/3/strand-masked +7adaa895adaa59aecdef416c417dc433e35b27b65f492401624bc3344b6e02d9 153568 0 replay/scout/s1/3/stdout +125016db53a6d72199e646681d29bafbde5e509296bb930cae70175128f26be8 182 0 replay/scout/s1/3/stderr +7adaa895adaa59aecdef416c417dc433e35b27b65f492401624bc3344b6e02d9 153568 0 live/scout/s1/3/stdout +be5a402f875497a24777e154edf9f05f4dd6e485c61d5adc87adac7909031e94 117 0 live/scout/s1/3/stderr +bf0faaa4f90518529cb673141db8b1a344c690c71e2eef661a455c424078f13a 825 0 live/scout/s1/3/state +7c670c34d02c09ffd714b57c7334a50df8e2a0eb3919b2096fc4940622d4d275 35551 0 live/scout/s1/3/strand-masked +12ce24de99e4672e5502a9f770d60fa5c5e9d558c84e9b2c38d51de64fdd9eea 153568 0 replay/scout/s2/3/stdout +88b51416cf1e9d20e4b3b0c50667e0645e6075dacbb8409d508f9fcc1586723a 182 0 replay/scout/s2/3/stderr +12ce24de99e4672e5502a9f770d60fa5c5e9d558c84e9b2c38d51de64fdd9eea 153568 0 live/scout/s2/3/stdout +285fb17e3dc526125f3da47b9805c08eda1fe9199a6714d81b26b3aa38c71a97 117 0 live/scout/s2/3/stderr +278ef52de0c8b3f8fb168ca93efa256e125c82f886de14f1da26b80bc1c63d16 825 0 live/scout/s2/3/state +9f6a461b6551fdf9fe7942ba6d63e3d13a6593992d819874801e7e1e9bc10d3e 35551 0 live/scout/s2/3/strand-masked +c1d82fdb4376ceb55fbc402d169049eb8c62bc57e3a2f706898a2fd2a31339c3 1205 0 init/drifter/s0 +5958ba89d0f3c10d89d6767a171decb578dc0e7abacfc17f6bb53c65f8150f57 1207 0 init/drifter/s1 +5209d7be11c24e185bc1133a6b9d8fd84c4c4ee7ce1edc180796586172d3de7d 1210 0 init/drifter/s2 +3da5d534622be5e2f6f4e2d7c7b95054407217928264bc6ad04fb087bf4ad4c4 1736 0 compile/drifter/s0 +228a1effd8e08fb622dcde314c8f4765dca130de25fe56d05b550728345244ea 1269 0 lint/drifter +4a00d2bef4161fc680b5a219d43bcde6665d9249438f9c656164eb95087b7327 202047 0 replay/drifter/s0/0/stdout +875314ed2378a8129c8324ea98af30584c2fa2e2c2a7fc33fcf1082711c9ae42 182 0 replay/drifter/s0/0/stderr +4a00d2bef4161fc680b5a219d43bcde6665d9249438f9c656164eb95087b7327 202047 0 live/drifter/s0/0/stdout +8e40d656c07f724d6633622de69dad2a523beda83d88321a4022129591f313ed 117 0 live/drifter/s0/0/stderr +b307f2831cace03e895ff9a4a519f97165e4dc5c6cc9169469606cf67ecf88ac 1407 0 live/drifter/s0/0/state +136726b51856def1d5d8c5f276d00549cd1c34817330f906fd8d48b8c1b4045b 44848 0 live/drifter/s0/0/strand-masked +ada571781b221cca5efee6e7c149e05fb7a9a33fa19b566c72c880ba4478a5c2 202095 0 replay/drifter/s1/0/stdout +e1ddadb80b28096782119de2819b729a4f0958d61d39d27687727668a68a81ce 182 0 replay/drifter/s1/0/stderr +ada571781b221cca5efee6e7c149e05fb7a9a33fa19b566c72c880ba4478a5c2 202095 0 live/drifter/s1/0/stdout +260025153bcf8445577e59424efec69e25182c125f6538c8b0f9d0a45cf5b171 117 0 live/drifter/s1/0/stderr +a564ceedcf9f5fa785e5528ff8bd2306eaefb6d74e2c815585fec6a346959293 1399 0 live/drifter/s1/0/state +cd3f4580382c91dcd5c26a57b20f43ab908483ce790a9979c7cea2bdad549b08 44837 0 live/drifter/s1/0/strand-masked +2c4cdfe4a404a703c118c9e70e96acb531fefe56521dc3651d42fa30ae8200ba 202243 0 replay/drifter/s2/0/stdout +9abbf9bc5dd34d05c89dc89b83b8865ecb868dfa0b2358a1aa98ef7c63a4bbd7 182 0 replay/drifter/s2/0/stderr +2c4cdfe4a404a703c118c9e70e96acb531fefe56521dc3651d42fa30ae8200ba 202243 0 live/drifter/s2/0/stdout +7ac26181a546a2ed59ab8db5169dc5fab393813e599eb73f4b0404925ba43f7d 117 0 live/drifter/s2/0/stderr +f2cfd2142a8b527a6270be6e6450d3e991fc897b71f435800d3e52c8fb53bd5d 1411 0 live/drifter/s2/0/state +3a2fb54e8bc5bdb8ee5dbf4654f0fc4a40ad9058ad82939c56ff4012b8337f06 44850 0 live/drifter/s2/0/strand-masked +9e09f4e17f02e8a720d3aa9e08c265942e35e90521b8b4ac4b940ed1ebb49f17 201457 0 replay/drifter/s0/1/stdout +6027a7b2051731665c99f6751d9c115b9fd82ec70f6fdae23ec6e490acbf7b7e 182 0 replay/drifter/s0/1/stderr +9e09f4e17f02e8a720d3aa9e08c265942e35e90521b8b4ac4b940ed1ebb49f17 201457 0 live/drifter/s0/1/stdout +c25818e1680b03bc7017a180fd73e07ea7c03b9f88ce521ada40d8292e0195a8 117 0 live/drifter/s0/1/stderr +a48e127cc6d22270ec1878bdd9098d1d0800a66ad292fab8fc74e4d1f7cb6db7 1369 0 live/drifter/s0/1/state +9ed7628e4a54988b16c55d251dc4825ed574464de450fb37d4c5b61df7361f26 48032 0 live/drifter/s0/1/strand-masked +43c84c6be873c2da50750a95f0b6cb2aaf8c7e7f157ce1afc0f7fee43567f123 202685 0 replay/drifter/s1/1/stdout +5653b627050c892e2c52b962c746aea72e6fd75f2bff2dbd5e5782cc6a58f31f 182 0 replay/drifter/s1/1/stderr +43c84c6be873c2da50750a95f0b6cb2aaf8c7e7f157ce1afc0f7fee43567f123 202685 0 live/drifter/s1/1/stdout +0398a6e9cc003f449104c19dc3812c4b5b128c5af13ac45eed6fa1e75a8ca065 117 0 live/drifter/s1/1/stderr +d6a0e304bca973780f82acb57b7be8308fa959af5aa9bf78c27210f5df0113dd 1378 0 live/drifter/s1/1/state +67e6e8e604049a4e3cfb05ef3c3c06fcd7def5d35863881201f8b515a5450cab 48049 0 live/drifter/s1/1/strand-masked +9cc1dce9e0c5b1771add10f51f57af1a703720fa04c817720112a2347d7929cb 203638 0 replay/drifter/s2/1/stdout +7174ec0f74e23c78556a5f0e79e51e867f52767bb55c71ed561c21e2502a2b04 182 0 replay/drifter/s2/1/stderr +9cc1dce9e0c5b1771add10f51f57af1a703720fa04c817720112a2347d7929cb 203638 0 live/drifter/s2/1/stdout +e98350cf843b1fe3d8a64323a9baed03fa626ddf5bb60f7159acb682addcb434 117 0 live/drifter/s2/1/stderr +e51436b4dc3607d25bb93495055d5563cb64ef0a80473eeddbeb1b02d48a626f 1374 0 live/drifter/s2/1/state +3023d5af76cf9f5721c4ae7046c3c3568de3952a2cc18695515f1c4b0c38faf5 48182 0 live/drifter/s2/1/strand-masked +7f13fc3d7763cf94111e26b52bddccfe83008790690ca2bd86316854fedec2b0 201429 0 replay/drifter/s0/2/stdout +9b8c8e6bb3fceb2a85c03b93dfc6d8a477f7e65e3250cc8a5d4f3d02eaef0d9d 182 0 replay/drifter/s0/2/stderr +7f13fc3d7763cf94111e26b52bddccfe83008790690ca2bd86316854fedec2b0 201429 0 live/drifter/s0/2/stdout +0a15ff103fe1d4b9ab42c8fdd4b0917d552f3dfe402534ef23ba0114a2ba9e8a 117 0 live/drifter/s0/2/stderr +5c8d701af887a6784b56fea8a7e638f58b5b8178d03441ae36ee548f0101f168 1360 0 live/drifter/s0/2/state +88739c0b356db12041d4037aa3549b6b9df4507bcbf48ba8c9a844382cb01731 45826 0 live/drifter/s0/2/strand-masked +b131dcd293362a545c22652d4bad48a2467414a9929810b49811f07fecf4be51 203644 0 replay/drifter/s1/2/stdout +71636f63bcb8eca7e34c84ddcb892bab5fadc7e185695fca85db5f28582cd4e9 182 0 replay/drifter/s1/2/stderr +b131dcd293362a545c22652d4bad48a2467414a9929810b49811f07fecf4be51 203644 0 live/drifter/s1/2/stdout +32969a3f11b864a873b6b67fde98c4bada9dd44edebf61cc33fb478642eefd63 117 0 live/drifter/s1/2/stderr +8f3210ab8578eabf3d487656c70093509af339efd4d91a6cc5efb0dfc8d0b77d 1368 0 live/drifter/s1/2/state +ffc46c83b8b94f4fb9808c3f8b57b363a30e67fa6bea00fdf5dbb7e7d84124d4 45915 0 live/drifter/s1/2/strand-masked +6eb7cf0574271db0c988d0993c6d75dcf86c4e3b80c492417be589ce798102aa 202602 0 replay/drifter/s2/2/stdout +1486fc19038bbcf59d81895d6385a447ad89602bf64b35e9febcb9ba9471c567 182 0 replay/drifter/s2/2/stderr +6eb7cf0574271db0c988d0993c6d75dcf86c4e3b80c492417be589ce798102aa 202602 0 live/drifter/s2/2/stdout +b32cafdef8518f6c145d860b9545eec9a104a49c013efba2a2ef5f54e2c9d6ea 117 0 live/drifter/s2/2/stderr +3885835640a5317cf6656299b1e4135ab10287de35a3a01582f6e02acfdde653 1369 0 live/drifter/s2/2/state +212c0fe05b3d8e63d4c99526a0a06690ff5a524f14fbfa102e9aa13b299d3659 45918 0 live/drifter/s2/2/strand-masked +585ab550a1de53b6308df9be5195f56f16338b1b75c872c031218002a6725db6 193961 0 replay/drifter/s0/3/stdout +280383d55da059f4d94bef985b7feabd586c944df739b41a163e7b760f2e8b16 182 0 replay/drifter/s0/3/stderr +585ab550a1de53b6308df9be5195f56f16338b1b75c872c031218002a6725db6 193961 0 live/drifter/s0/3/stdout +e3533ee3fe146f25320a46674c00145780b3cda39411321eabdad9e72dd4b71b 117 0 live/drifter/s0/3/stderr +f2df9f08cd9a3cdcd60393ef3a61d085fad850531c2078bfb814029383427c1b 1285 0 live/drifter/s0/3/state +3603e1e5a0a82fd7f756cfdfa80e2bfd5e49477755f57ea225aba5c8e6ee1d01 43379 0 live/drifter/s0/3/strand-masked +1fdd8d0dfbe991140482a05f1dd21a09ba386bab4e14e9e9aa6004dc6df3b5dc 195606 0 replay/drifter/s1/3/stdout +7f41258789ef8db36be7f383332ff25b1783f763cf4c0c1c336956fad59a2694 182 0 replay/drifter/s1/3/stderr +1fdd8d0dfbe991140482a05f1dd21a09ba386bab4e14e9e9aa6004dc6df3b5dc 195606 0 live/drifter/s1/3/stdout +3f01331be8ece12cf70d2e78aa2b1b0fa22be4e1c2f3fc2e5b7983e4fce2f6a0 117 0 live/drifter/s1/3/stderr +383a6b9ef1a5a5af8f5a10534a7eef9c2aa4951df2779ead0faa9adbcbf8c3bb 1292 0 live/drifter/s1/3/state +3bda4cba9bf0d2f027107094644b01f06bc10c5c92c0a3b62fb70a6871bee032 43449 0 live/drifter/s1/3/strand-masked +51bacdb6f967d262a348c5124f646569ce08d54f6bf82e2395aad48cc1aebd18 195858 0 replay/drifter/s2/3/stdout +c7daf7e6a5c1ef07d99df42bcb898b2c2ee9eb35d35bd74c99f4c17224fa735b 182 0 replay/drifter/s2/3/stderr +51bacdb6f967d262a348c5124f646569ce08d54f6bf82e2395aad48cc1aebd18 195858 0 live/drifter/s2/3/stdout +5b073a7bf3edf4c9f1b2b091291fee46ce1508bf48938774570e81cc84b7d8c0 117 0 live/drifter/s2/3/stderr +751b2d3bcf8aea4ed6325260d3e28d9371b23b4080a2238e0341be58479cc57c 1294 0 live/drifter/s2/3/state +2645a126d2c21bb545d3ebe5d3c3639677b6a57db757c85d76a99e0e34e76696 43492 0 live/drifter/s2/3/strand-masked +e063c93def4f65104e2e0b9424b738b2ac158dffc0f245a7ced7e1c143053277 1083 0 init/tutor-0.5.0/s0 +8a2ed0612168838ca766fb47895573c2d28e634b9b5a974ebe24acd3b853b38f 1081 0 init/tutor-0.5.0/s1 +9aa1314c777e29dcbecfbaa6a52d981502fd6673b06557dc2f14947e579ce439 1079 0 init/tutor-0.5.0/s2 +f4a0e314c7c34438536f31ac8dd5e09888294836f8c95e1e6263da2cdcb5c318 5950 0 compile/tutor-0.5.0/s0 +84f83236576befc7c7cd2dc61de1916552b4ddc33c72abf63d3d3e934a6cfbfc 2220 0 lint/tutor-0.5.0 +86ff6bc58358fe25ae2c9b8d86b27403bbb0bb1b3c72d38844bcba57f6ad311a 245677 0 replay/tutor-0.5.0/s0/0/stdout +2fdeb0dd4c75d6099ccacbf8179f900281a2a43a8b797be256022174be61b505 182 0 replay/tutor-0.5.0/s0/0/stderr +86ff6bc58358fe25ae2c9b8d86b27403bbb0bb1b3c72d38844bcba57f6ad311a 245677 0 live/tutor-0.5.0/s0/0/stdout +8c5e482ddc47d866eea8f915a6477a077bfdd59d21cfd0fdd6fbc2ee65ec12a7 117 0 live/tutor-0.5.0/s0/0/stderr +5a333bf9d3a25af20b1b2f90ab1398518be93b21eeca7c9a21a67eda53d9b3d2 1160 0 live/tutor-0.5.0/s0/0/state +d001e6a7bfc48b2de7104b159c52eb1a5376a6dafb3e8f380003559b01d941ab 47425 0 live/tutor-0.5.0/s0/0/strand-masked +c7639e7ecc8d1f530a24ee615dc940529a6f2a5e9d93fa7b11fd153bdfda51f8 245665 0 replay/tutor-0.5.0/s1/0/stdout +0e8d7384402d1d553d6881bdb1790477a454a9a688f0679826d96916d98ab7ed 182 0 replay/tutor-0.5.0/s1/0/stderr +c7639e7ecc8d1f530a24ee615dc940529a6f2a5e9d93fa7b11fd153bdfda51f8 245665 0 live/tutor-0.5.0/s1/0/stdout +6af649e9cc42a7cc5b8e26122b5aac556c90a9f655412e1d70089d863064205d 117 0 live/tutor-0.5.0/s1/0/stderr +f8265529f650ef9c3d5b337c916816d71749877e4144fac2d8b7b21c38a1d457 1156 0 live/tutor-0.5.0/s1/0/state +d853f50a15927c06b0039fd9c374b18ee0a1735bb2113207714a9767aff62853 47419 0 live/tutor-0.5.0/s1/0/strand-masked +e1c4371e1afaba0d8a77b173cb58f60dec45cfbdbea1e236cba00f9f0172c9fa 242994 0 replay/tutor-0.5.0/s2/0/stdout +bb82c6d7d27d90f30c231be9788b388ad9ea49d2d79330df0b2e52aafbb6a429 182 0 replay/tutor-0.5.0/s2/0/stderr +e1c4371e1afaba0d8a77b173cb58f60dec45cfbdbea1e236cba00f9f0172c9fa 242994 0 live/tutor-0.5.0/s2/0/stdout +aba06e61178c1897ca803f5186c100aebf4abc576c12fb3534f73c5d591a38b4 117 0 live/tutor-0.5.0/s2/0/stderr +034495d354cc9d56157f78aa95d63560bc2e00e051a06848faf64552424ea18c 1158 0 live/tutor-0.5.0/s2/0/state +b36dab23d77f4f724c1e52fde0cc906adf60dd49e561a967d0b684f017c8b302 47441 0 live/tutor-0.5.0/s2/0/strand-masked +7012351696e0740cd70809b896f56fc1bcbacaa7d2beb70e8efd08c700c2b978 247909 0 replay/tutor-0.5.0/s0/1/stdout +3193c27131b39102e77b26c1e2f5f7a4c5765a42404aa5714d21ef5c497e4d37 182 0 replay/tutor-0.5.0/s0/1/stderr +7012351696e0740cd70809b896f56fc1bcbacaa7d2beb70e8efd08c700c2b978 247909 0 live/tutor-0.5.0/s0/1/stdout +d589611e40bac6caad40f0ddb20a11b59786628c9939a3be39fad869e48e0e39 117 0 live/tutor-0.5.0/s0/1/stderr +9e22f211a561ce48cfc14346a3e70f9ac41e00afb391dabd532481c179fa3cc1 1158 0 live/tutor-0.5.0/s0/1/state +877b787ae51d2c67ecae0420889907780c8a75f564654104239e2a6fed69c9ab 52292 0 live/tutor-0.5.0/s0/1/strand-masked +fa61ac96567602cfd68f71e3b39305474819d752204e33f126d2d9f8c9e712a1 247589 0 replay/tutor-0.5.0/s1/1/stdout +d026691eb575c6346cc0a1c616617a4dd1efa2532585bc2023cc8658299fd8bc 182 0 replay/tutor-0.5.0/s1/1/stderr +fa61ac96567602cfd68f71e3b39305474819d752204e33f126d2d9f8c9e712a1 247589 0 live/tutor-0.5.0/s1/1/stdout +838cfde58ec9be17d1a9be502d82145270431ed01035f1a70cb7cd4805e8501b 117 0 live/tutor-0.5.0/s1/1/stderr +c91edd3a256154bc416b0fe4c94b7728945b7d9966c625f6cdbf93516ab83d4f 1157 0 live/tutor-0.5.0/s1/1/state +7c12679c608bea053c9145513c2946cbfc7b6439bc3c8c8c1fd687fd44a6e0cf 52236 0 live/tutor-0.5.0/s1/1/strand-masked +b6553c8f38673bea22f8bc9321453e07a41360a55c356cabfcabc5c2096dd602 244847 0 replay/tutor-0.5.0/s2/1/stdout +2ec9cf7ff7d2f2df812422d248348e336dd29416ee8b5a425e85426023b2b132 182 0 replay/tutor-0.5.0/s2/1/stderr +b6553c8f38673bea22f8bc9321453e07a41360a55c356cabfcabc5c2096dd602 244847 0 live/tutor-0.5.0/s2/1/stdout +6cdcfdaa5a2efdc5f487d4a80478619412b75decc94cc9273f7de966d31e7935 117 0 live/tutor-0.5.0/s2/1/stderr +2ac8c40b90b8c72035c47c4a55d65ce54e8245a8cf584f3799923f414e3be49b 1156 0 live/tutor-0.5.0/s2/1/state +01c993da3fd3125d1c2481df79fc42f3ca7a7f4e6beaa36706df42aae83cb82d 52170 0 live/tutor-0.5.0/s2/1/strand-masked +9de4685590f0b7e4380fcd76f0f39171925bf61394f1bbfb7212ea8952d4dbad 247023 0 replay/tutor-0.5.0/s0/2/stdout +7cb2b65ac89e4dc160b32d4732dc0a0419e013d09f14862c885b38355084cdc0 182 0 replay/tutor-0.5.0/s0/2/stderr +9de4685590f0b7e4380fcd76f0f39171925bf61394f1bbfb7212ea8952d4dbad 247023 0 live/tutor-0.5.0/s0/2/stdout +0faf2560d4e029498666304c42275181eab8f12936dde17db89771a9c0491c63 117 0 live/tutor-0.5.0/s0/2/stderr +b65aef4b4656cc6840c32ced64d8ec54a375189a6218b69c6569f27549702704 1155 0 live/tutor-0.5.0/s0/2/state +d66566245ae427bf58064c097bd24f6b253cec80d62fb49206152fed95d1b269 49508 0 live/tutor-0.5.0/s0/2/strand-masked +482a4c008abe9a627af009a30147a9253678facccfe7826a90117ffed7ecbbae 247887 0 replay/tutor-0.5.0/s1/2/stdout +d9cf958d4fa23a151a72cfac80d018d8c5f93becae79e2590d45ea85eeac9fbd 182 0 replay/tutor-0.5.0/s1/2/stderr +482a4c008abe9a627af009a30147a9253678facccfe7826a90117ffed7ecbbae 247887 0 live/tutor-0.5.0/s1/2/stdout +ff1d69f461a68b8e5d5115ae7152c59091e2c12dde3c8e1cfbefd081937228f5 117 0 live/tutor-0.5.0/s1/2/stderr +4c9429d4418ab6ab24810e332af0c7433a28957d677b6dce5e97053e4377b154 1151 0 live/tutor-0.5.0/s1/2/state +a326234d6248c44c3fc21ce5044b5ec9debee2cd920c173eb0fd63f71b987f5d 49482 0 live/tutor-0.5.0/s1/2/strand-masked +ed129dc8ebb45c2b0dafe6a8e39016223264ad63c9f3ac48cdd407a89307c481 245210 0 replay/tutor-0.5.0/s2/2/stdout +78e2cce00109d096f16b335a8dc1fcc6d29191621479951caf2034e33c78e902 182 0 replay/tutor-0.5.0/s2/2/stderr +ed129dc8ebb45c2b0dafe6a8e39016223264ad63c9f3ac48cdd407a89307c481 245210 0 live/tutor-0.5.0/s2/2/stdout +273759f76dcec615d0a56fc31f6d34798541f9d2fad08fe4db9fa06ab4a2a4f3 117 0 live/tutor-0.5.0/s2/2/stderr +b59ed28c31128d0a7c16749fa6bbb64a4acd8a5aed8906b3e56a4ee0c3bdd8c1 1153 0 live/tutor-0.5.0/s2/2/state +94a876a65ce5fe19eb73f250a5e360f2d48cccce3907fdbf6121d292e6a68ebe 49494 0 live/tutor-0.5.0/s2/2/strand-masked +bb77c43b23420ce5a3b7981626c5136ef5c5c6451b563b1ac6ebe91c774a72d8 245846 0 replay/tutor-0.5.0/s0/3/stdout +26681665dc0eabccb6549756f2ddce0eb29779d43b0c8546cbc10773ba241f76 182 0 replay/tutor-0.5.0/s0/3/stderr +bb77c43b23420ce5a3b7981626c5136ef5c5c6451b563b1ac6ebe91c774a72d8 245846 0 live/tutor-0.5.0/s0/3/stdout +326536a7e2bc31b80d34e51e537ac79576067b1357aef727661dd348968fc046 117 0 live/tutor-0.5.0/s0/3/stderr +196ec6fcdb3710c0fb7be8ec0772e2e187eeaf07ca398c403208b3daa94fda48 1154 0 live/tutor-0.5.0/s0/3/state +321259284409612e6f6f85d549b7cdbc1fa75eb61ab6af6ba0f630b8be9536fe 48052 0 live/tutor-0.5.0/s0/3/strand-masked +0dbad857879e0ee858f6ac49eb32330005487241784bba498ff70961c7854c7d 245796 0 replay/tutor-0.5.0/s1/3/stdout +6a2058bc170415adf708cbebb563f21d293da20c23cc5b1ed5702a41c460dc19 182 0 replay/tutor-0.5.0/s1/3/stderr +0dbad857879e0ee858f6ac49eb32330005487241784bba498ff70961c7854c7d 245796 0 live/tutor-0.5.0/s1/3/stdout +7d2bf0a9fd6301a0da9381643b348491c7c585dd46b1eb903685d5292af3e987 117 0 live/tutor-0.5.0/s1/3/stderr +51425298072a1307f5fb26c65a735427e0ea25eaf3d30ce0f0b78aad6a6371b0 1153 0 live/tutor-0.5.0/s1/3/state +20bf0a4416ea1c97e804aa34d6db4b99f98cf7c8427dba8334d9bafff9cef7e9 48095 0 live/tutor-0.5.0/s1/3/strand-masked +6e9cf0aff2a87234a261e429c752c3631b78e1d8a37394326825c525493bccea 243217 0 replay/tutor-0.5.0/s2/3/stdout +a8b778a93a1460ce78b173813762177640403beaba25f6a7f5a16ef7dfd696eb 182 0 replay/tutor-0.5.0/s2/3/stderr +6e9cf0aff2a87234a261e429c752c3631b78e1d8a37394326825c525493bccea 243217 0 live/tutor-0.5.0/s2/3/stdout +2684676296da938ddc742061c46e85db6684739598716c0e88aab9a6356ffe5f 117 0 live/tutor-0.5.0/s2/3/stderr +f831f53ddb39557e907f6bf16d4c3278a83a486a12211fae67d02d64032f594c 1150 0 live/tutor-0.5.0/s2/3/state +5836c0e373bd6d5d4ca61545c1c02b9d5decd1e1013e0af950c1f072df196b49 47922 0 live/tutor-0.5.0/s2/3/strand-masked +615978432a80e6b8be7fdf6e2382438516dc67acae56c562221c89654cae479e 6815 0 continue/tutor/appended +48df4457bc44acf37e90f12d17e43ca7ce2baead9b4c067f0ae0aee05b5dd768 49378 0 continue/tutor/stdout diff --git a/bench/individuality/fixtures/p0/personas/scout.json b/bench/individuality/fixtures/p0/personas/scout.json new file mode 100644 index 0000000..955a822 --- /dev/null +++ b/bench/individuality/fixtures/p0/personas/scout.json @@ -0,0 +1,98 @@ +{ + "probbit_persona": 1, + "identity": { + "name": "Scout", + "version": "1.0.0", + "seed": 2 + }, + "traits": [ + { + "id": "initiative", + "levels": [ + "follow", + "suggest", + "lead" + ], + "say": [ + "answer the question", + "suggest a next step", + "set a small exercise" + ] + }, + { + "id": "caution", + "levels": [ + "bold", + "measured", + "careful" + ], + "say": [ + "keep moving", + "check the essentials", + "double-check the result" + ] + } + ], + "moods": [ + { + "id": "valence", + "levels": [ + "down", + "even", + "up" + ], + "inertia": 0.5, + "half_life_hours": 8 + } + ], + "inputs": [ + { + "id": "deadline", + "kind": "flag" + } + ], + "habits": [ + { + "id": "check_when_due", + "when": { + "deadline": true + }, + "then": { + "pursue": [ + "check" + ] + }, + "say": "check before proceeding" + } + ], + "drives": { + "goals": [ + { + "id": "learn", + "say": "explore the lesson", + "interest": 1.5 + }, + { + "id": "rest", + "say": "take a break", + "interest": 0.6 + }, + { + "id": "check", + "say": "verify the result", + "interest": 0.8 + } + ], + "effects": { + "wanting": { + "initiative": 0.6 + }, + "afterglow": { + "valence": 0.8 + }, + "surprise": { + "valence": 0.5 + } + } + } +} diff --git a/bench/individuality/fixtures/p0/props/retry.json b/bench/individuality/fixtures/p0/props/retry.json new file mode 100644 index 0000000..dd6c940 --- /dev/null +++ b/bench/individuality/fixtures/p0/props/retry.json @@ -0,0 +1 @@ +{"props": [{"id": "ask_after_two_errors", "when": {"error_streak": 2}, "then": {"action": ["ask"]}}]} diff --git a/bench/individuality/fixtures/p0/props/tutor.json b/bench/individuality/fixtures/p0/props/tutor.json new file mode 100644 index 0000000..2c22e10 --- /dev/null +++ b/bench/individuality/fixtures/p0/props/tutor.json @@ -0,0 +1 @@ +{"props": [{"id": "no_playful_when_upset", "when": {"sentiment": "negative"}, "then": {"humour": {"at_most": "light"}}}]} diff --git a/bench/individuality/fixtures/p0/scripts/adaptive-0.jsonl b/bench/individuality/fixtures/p0/scripts/adaptive-0.jsonl new file mode 100644 index 0000000..dd1d2bb --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/adaptive-0.jsonl @@ -0,0 +1,100 @@ +{"elapsed_hours":0,"src":"env"} +{"elapsed_hours":0,"error":false,"src":"env:ci"} +{"elapsed_hours":0.1,"src":"env"} +{"elapsed_hours":10,"src":"env"} +{"elapsed_hours":10,"src":"env:runner"} +{"elapsed_hours":0.5,"src":"env:ci"} +{"elapsed_hours":0.5,"error":true,"src":"env:ci"} +{"src":"env"} +{"elapsed_hours":0,"praise":true,"src":"env:runner"} +{"elapsed_hours":0,"praise":false,"src":"env:runner"} +{"praise":true,"src":"env"} +{"error":true,"praise":true,"src":"env"} +{"elapsed_hours":0.5,"error":true,"praise":true,"src":"env:ci"} +{"praise":true,"src":"env:runner"} +{"elapsed_hours":0.5,"error":true,"src":"env"} +{"praise":false,"src":"env"} +{"elapsed_hours":1,"src":"env:ci"} +{"error":true,"src":"env:runner"} +{"error":false,"src":"env:runner"} +{} +{"praise":true} +{"src":"env"} +{"elapsed_hours":10,"error":true,"praise":true,"src":"env:runner"} +{"elapsed_hours":0.5,"praise":true,"src":"env:ci"} +{"elapsed_hours":3,"src":"env:ci"} +{"elapsed_hours":0.1,"error":true,"praise":false,"src":"env"} +{"error":true,"src":"env:ci"} +{"elapsed_hours":0.5,"src":"env:runner"} +{"error":true,"praise":true,"src":"env:runner"} +{} +{"praise":true,"src":"env:runner"} +{"elapsed_hours":0.1,"src":"env:ci"} +{"elapsed_hours":0.1,"error":true,"praise":true,"src":"env:runner"} +{"elapsed_hours":10,"src":"env"} +{"elapsed_hours":3,"error":true} +{"error":true,"src":"env:runner"} +{"elapsed_hours":0.5,"src":"env:runner"} +{"elapsed_hours":1,"error":true,"src":"env:ci"} +{"elapsed_hours":0.1,"error":true} +{"elapsed_hours":0,"src":"env:runner"} +{"elapsed_hours":0,"src":"env:ci"} +{"error":true,"src":"env:runner"} +{"elapsed_hours":0,"src":"env:runner"} +{"elapsed_hours":0,"src":"env:ci"} +{"praise":false,"src":"env:runner"} +{"elapsed_hours":10,"src":"env:ci"} +{"elapsed_hours":3,"src":"env"} +{"error":true,"src":"env"} +{"elapsed_hours":0,"src":"env:runner"} +{"elapsed_hours":1,"praise":true} +{"error":true,"src":"env"} +{"src":"env:runner"} +{"src":"env"} +{"error":true,"src":"env:runner"} +{"praise":false,"src":"env"} +{"praise":true,"src":"env:ci"} +{"elapsed_hours":1,"src":"env"} +{"elapsed_hours":0} +{"elapsed_hours":0.5} +{"elapsed_hours":0,"src":"env:ci"} +{"error":true} +{"src":"env:runner"} +{"elapsed_hours":0.1,"error":false,"src":"env:ci"} +{"error":true,"praise":true,"src":"env:ci"} +{"elapsed_hours":1,"error":true,"src":"env:ci"} +{"elapsed_hours":10,"praise":true,"src":"env:runner"} +{"elapsed_hours":1,"error":true,"praise":true,"src":"env"} +{"elapsed_hours":0.1,"src":"env:ci"} +{"elapsed_hours":0,"src":"env:runner"} +{"elapsed_hours":0,"error":true,"praise":true,"src":"env"} +{"error":true,"src":"env:runner"} +{"error":true,"src":"env"} +{"elapsed_hours":1,"src":"env:ci"} +{"elapsed_hours":10,"error":true,"src":"env:runner"} +{"src":"env:runner"} +{"elapsed_hours":0,"src":"env"} +{"elapsed_hours":3,"error":false,"src":"env:ci"} +{"elapsed_hours":1,"src":"env"} +{"error":true,"src":"env"} +{"praise":true,"src":"env:runner"} +{"elapsed_hours":0.5,"error":true,"src":"env:runner"} +{"elapsed_hours":0.5,"src":"env:ci"} +{"praise":true} +{"elapsed_hours":0,"praise":false,"src":"env:runner"} +{"src":"env:runner"} +{"elapsed_hours":0.5} +{"elapsed_hours":0,"error":true} +{"src":"env:ci"} +{} +{"elapsed_hours":3} +{"src":"env:runner"} +{"elapsed_hours":3,"error":false,"praise":true} +{"error":false,"src":"env:ci"} +{"elapsed_hours":1,"praise":true,"src":"env:runner"} +{"elapsed_hours":1,"praise":true,"src":"env"} +{"elapsed_hours":0.5,"error":false} +{"elapsed_hours":0.1,"src":"env"} +{"elapsed_hours":0,"praise":true,"src":"env:runner"} +{"error":true,"src":"env:runner"} +{"error":true,"src":"env:runner"} diff --git a/bench/individuality/fixtures/p0/scripts/adaptive-1.jsonl b/bench/individuality/fixtures/p0/scripts/adaptive-1.jsonl new file mode 100644 index 0000000..28fc2cd --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/adaptive-1.jsonl @@ -0,0 +1,100 @@ +{"await":true,"elapsed_hours":3,"error":true,"for":0,"src":"env"} +{"elapsed_hours":1,"for":0,"src":"env:ci"} +{"elapsed_hours":1,"senses":{"tool_fail":false}} +{"await":false,"control":"pause","for":1,"senses":{"tool_fail":false},"src":"env"} +{"praise":true,"senses":{"tool_fail":true}} +{"elapsed_hours":0.5,"for":2,"src":"env"} +{"cancel":[2],"elapsed_hours":0,"error":false,"for":3,"src":"env:"} +{"cancel":[5],"control":"pause","error":false,"praise":true,"src":"self"} +{"cancel":[7],"elapsed_hours":0,"src":"env:ci"} +{"await":true,"cancel":[7],"control":"pause","elapsed_hours":10,"error":true,"praise":true,"senses":{"tempo":17,"tool_latency":{"src":"env:runner","v":5.182}},"src":"clock"} +{"src":"env"} +{"elapsed_hours":10,"error":false} +{"praise":true,"src":"env:ci"} +{"control":"resume","praise":false,"src":"env"} +{"control":"pause","elapsed_hours":0.5,"for":11,"senses":{"tempo":33,"tool_latency":{"src":"env:runner","v":2.507}}} +{"control":"resume","elapsed_hours":0,"senses":{"silence":17.39}} +{"await":true,"goals":{"fun":{"win":1}},"src":"env:ci"} +{"await":true,"elapsed_hours":1,"for":16,"senses":{"silence":11.17}} +{"for":17,"goals":{"fun":{"win":1}},"praise":false,"src":"env:ci"} +{"control":"pause","elapsed_hours":0,"src":"env:runner"} +{"await":true,"elapsed_hours":3,"goals":{"fun":{"win":1}},"praise":true,"src":"env:runner"} +{"cancel":[20],"control":"pause","for":20,"praise":true,"src":"env:runner"} +{"error":true,"goals":{"fun":{"win":1}},"senses":{"tempo":36,"tool_latency":{"src":"env:runner","v":2.173}},"src":"env:ci"} +{"await":true,"cancel":[21],"elapsed_hours":0,"praise":false,"src":"env:ci"} +{"await":true,"elapsed_hours":0,"praise":false,"senses":{"silence":10.43},"src":"nonsense"} +{"elapsed_hours":0,"error":true,"goals":{"fun":{"win":1}},"praise":true,"src":"env:ci"} +{"cancel":[23],"elapsed_hours":0.5,"error":true,"for":25,"src":"env"} +{"await":true,"error":true,"senses":{"tempo":6,"tool_latency":{"src":"env:runner","v":5.966}},"src":"nonsense"} +{"elapsed_hours":1,"error":true,"for":25,"senses":{"tool_fail":true},"src":"env"} +{"await":true,"cancel":[28],"elapsed_hours":0.5,"error":false,"for":26,"src":"env"} +{"await":true,"cancel":[26],"elapsed_hours":0,"error":true,"src":"env"} +{"await":false} +{"elapsed_hours":0,"for":31,"src":"env"} +{"elapsed_hours":3,"for":30,"praise":false,"src":"env:"} +{"control":"resume","elapsed_hours":10,"goals":{"fun":{"win":1}},"src":"env"} +{"await":true,"elapsed_hours":0.5} +{"error":true,"for":35,"goals":{"fun":{"win":1}},"src":"env:ci"} +{"elapsed_hours":1,"goals":{"fun":{"win":1}},"praise":true,"senses":{"tempo":1,"tool_latency":{"src":"env:runner","v":5.253}}} +{"elapsed_hours":0.5,"praise":true,"senses":{"silence":1.94}} +{"elapsed_hours":3,"src":"env:runner"} +{"await":true,"error":false,"for":37,"senses":{"tempo":16,"tool_latency":{"src":"env:runner","v":4.667}},"src":"env:runner"} +{"error":true,"praise":true,"src":"env:ci"} +{"cancel":[41],"for":41,"praise":false} +{"cancel":[40],"elapsed_hours":3,"senses":{"silence":8.41},"src":"env:runner"} +{"elapsed_hours":0,"error":false,"praise":true,"senses":{"tempo":17,"tool_latency":{"src":"env:runner","v":1.048}},"src":"env:ci"} +{"cancel":[43],"error":false,"praise":true,"src":"env"} +{"await":true,"control":"resume","elapsed_hours":0,"for":44,"goals":{"fun":{"win":1}},"praise":true,"src":"env:ci"} +{"await":true,"elapsed_hours":1,"praise":false,"src":"env"} +{"await":true,"elapsed_hours":0.5,"senses":{"tempo":12,"tool_latency":{"src":"env:runner","v":7.672}},"src":"env:runner"} +{"await":true,"for":46,"src":"env"} +{"error":true,"for":49,"senses":{"tempo":30,"tool_latency":{"src":"env:runner","v":0.124}},"src":"env:runner"} +{"elapsed_hours":0.5,"error":false,"src":"env"} +{"src":"env"} +{"await":true,"cancel":[48],"elapsed_hours":10,"senses":{"tool_fail":false}} +{"await":false,"elapsed_hours":0,"goals":{"fun":{"win":1}},"praise":true,"src":"env"} +{"await":true,"elapsed_hours":1,"error":true,"src":"human"} +{"cancel":[53],"praise":false,"senses":{"tool_fail":true},"src":"clock"} +{"elapsed_hours":0.1,"goals":{"fun":{"win":1}},"senses":{"tool_fail":false}} +{"control":"resume","src":"env:ci"} +{"await":true,"elapsed_hours":0,"goals":{"fun":{"win":1}},"src":"env"} +{"await":true,"elapsed_hours":1,"error":false,"goals":{"fun":{"win":1}},"src":"env:runner"} +{"await":false,"cancel":[60],"control":"pause","elapsed_hours":0,"praise":false,"senses":{"tool_fail":false},"src":"env:ci"} +{"control":"resume","elapsed_hours":0.1,"error":false,"senses":{"tool_fail":false},"src":"env:ci"} +{"elapsed_hours":0,"for":60,"praise":true} +{"cancel":[61],"elapsed_hours":0,"src":"human"} +{"await":true,"elapsed_hours":3,"goals":{"fun":{"win":1}},"praise":false,"src":"env:runner"} +{"control":"resume","praise":true,"senses":{"tool_fail":true},"src":"env"} +{"control":"pause","for":65} +{"control":"resume","elapsed_hours":0.1,"error":true,"for":66,"praise":true,"senses":{"silence":17.19},"src":"env:runner"} +{"cancel":[65],"control":"pause","elapsed_hours":1,"senses":{"tempo":8,"tool_latency":{"src":"env:runner","v":2.568}}} +{"cancel":[69],"elapsed_hours":0,"error":false,"goals":{"fun":{"win":1}},"src":"env"} +{"src":"env:ci"} +{"cancel":[68],"elapsed_hours":0.5,"src":"env"} +{"await":true,"src":"env"} +{"await":true,"control":"resume","elapsed_hours":0.1,"error":true,"src":"self"} +{"await":true,"cancel":[74],"control":"pause","elapsed_hours":0.1,"for":73,"senses":{"tempo":31,"tool_latency":{"src":"env:runner","v":3.616}},"src":"env:ci"} +{"await":true,"cancel":[74],"control":"resume","elapsed_hours":0,"for":73,"praise":true,"senses":{"silence":28.21},"src":"self"} +{"src":"clock"} +{"await":false,"cancel":[75],"elapsed_hours":10,"src":"nonsense"} +{"control":"pause","elapsed_hours":1,"praise":true} +{"elapsed_hours":1,"goals":{"fun":{"win":1}},"src":"env"} +{"elapsed_hours":10,"error":true,"senses":{"tempo":21,"tool_latency":{"src":"env:runner","v":4.405}},"src":"env:ci"} +{"await":true,"control":"resume","error":false,"goals":{"fun":{"win":1}}} +{"await":true,"elapsed_hours":0,"praise":true,"senses":{"silence":25.01}} +{"control":"resume","src":"env"} +{"elapsed_hours":0,"error":true,"src":"nonsense"} +{"control":"resume","elapsed_hours":0.1,"error":true,"praise":true,"src":"self"} +{"await":true,"elapsed_hours":0,"src":"human"} +{"await":true,"cancel":[83],"elapsed_hours":3,"error":true,"praise":true,"src":"env"} +{"control":"pause","elapsed_hours":10,"error":true,"for":86,"src":"env:runner"} +{"await":true,"elapsed_hours":0,"error":false,"praise":true,"senses":{"tool_fail":true},"src":"env:runner"} +{"error":true,"praise":true,"src":"env:ci"} +{"elapsed_hours":0,"error":false,"senses":{"silence":22.75},"src":"env:ci"} +{"elapsed_hours":0,"error":true,"src":"env:ci"} +{"await":true,"cancel":[91],"error":true,"praise":true} +{"elapsed_hours":0,"error":true,"for":94,"src":"env:runner"} +{"for":93,"praise":false,"src":"env"} +{"await":true,"elapsed_hours":3,"praise":false,"src":"human"} +{"elapsed_hours":0,"src":"env:runner"} +{"elapsed_hours":0.1,"src":"env:ci"} diff --git a/bench/individuality/fixtures/p0/scripts/adaptive-2.jsonl b/bench/individuality/fixtures/p0/scripts/adaptive-2.jsonl new file mode 100644 index 0000000..776f354 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/adaptive-2.jsonl @@ -0,0 +1,100 @@ +{"elapsed_hours":0,"praise":true,"src":"env"} +{"elapsed_hours":0.1,"praise":false,"src":"env:ci"} +{"elapsed_hours":0,"error":false} +{"error":true,"src":"env:runner"} +{"elapsed_hours":3,"error":true} +{"error":true,"src":"env:runner"} +{"praise":true} +{"elapsed_hours":3,"praise":false} +{"error":true,"src":"env"} +{} +{"elapsed_hours":10,"praise":false,"src":"env:runner"} +{"elapsed_hours":10,"error":true,"praise":true,"src":"env:ci"} +{"error":true,"praise":true,"src":"env:ci"} +{"error":true,"src":"env:runner"} +{"error":false,"praise":true,"src":"env:ci"} +{"elapsed_hours":3,"error":true,"praise":true,"src":"env"} +{"error":true,"praise":true,"src":"env:ci"} +{"elapsed_hours":0,"error":true,"praise":true,"src":"env:ci"} +{"elapsed_hours":0.1,"error":true,"praise":true,"src":"env:runner"} +{"elapsed_hours":1} +{"elapsed_hours":0,"praise":false,"src":"env:runner"} +{"elapsed_hours":10,"praise":true} +{"elapsed_hours":3,"error":true,"praise":true} +{"praise":true,"src":"env:runner"} +{"elapsed_hours":3,"error":true,"src":"env:runner"} +{"elapsed_hours":0,"error":true,"src":"env:runner"} +{"elapsed_hours":0,"praise":true} +{"praise":true,"src":"env"} +{"error":true,"src":"env:runner"} +{"praise":true,"src":"env"} +{"error":true,"src":"env:runner"} +{"elapsed_hours":0.5,"src":"env:ci"} +{"elapsed_hours":1,"src":"env"} +{"elapsed_hours":0,"error":true,"src":"env:ci"} +{"elapsed_hours":0} +{"error":true} +{"elapsed_hours":0,"src":"env"} +{"error":true} +{"elapsed_hours":1,"error":true,"praise":true,"src":"env"} +{"elapsed_hours":0.1,"src":"env:ci"} +{"error":true,"praise":false,"src":"env:runner"} +{"elapsed_hours":0,"error":true,"praise":true,"src":"env:ci"} +{"elapsed_hours":1,"error":true,"praise":true,"src":"env"} +{"praise":true,"src":"env"} +{"elapsed_hours":3,"error":true,"src":"env:ci"} +{"praise":true,"src":"env:runner"} +{"elapsed_hours":0.5,"praise":true,"src":"env:runner"} +{"elapsed_hours":0,"praise":true,"src":"env:runner"} +{"praise":true} +{} +{"elapsed_hours":0,"error":false,"praise":true,"src":"env:ci"} +{"src":"env"} +{"elapsed_hours":10,"error":true} +{"error":true,"praise":true,"src":"env:ci"} +{"src":"env:runner"} +{"elapsed_hours":0,"error":true} +{"elapsed_hours":10,"error":true,"praise":true,"src":"env:runner"} +{"elapsed_hours":3,"error":true,"src":"env"} +{"elapsed_hours":0,"error":false,"src":"env:runner"} +{"elapsed_hours":3,"praise":true,"src":"env"} +{"elapsed_hours":0.1,"error":true,"praise":true,"src":"env:runner"} +{"error":true,"src":"env:runner"} +{"elapsed_hours":0,"error":true,"praise":true,"src":"env:runner"} +{"elapsed_hours":0.5,"error":true,"src":"env:runner"} +{"error":true,"src":"env"} +{"praise":true,"src":"env"} +{"error":true,"praise":true,"src":"env:ci"} +{"elapsed_hours":0,"error":true,"praise":true} +{"elapsed_hours":0.1,"error":true,"praise":true,"src":"env:ci"} +{"error":true,"praise":false,"src":"env:ci"} +{"elapsed_hours":10,"praise":true} +{"src":"env:runner"} +{"elapsed_hours":10,"src":"env"} +{"praise":true,"src":"env"} +{"elapsed_hours":1,"error":true,"src":"env:ci"} +{"error":true} +{"elapsed_hours":3,"src":"env:runner"} +{"elapsed_hours":3,"src":"env"} +{"elapsed_hours":3,"src":"env:runner"} +{"elapsed_hours":0.1,"praise":true} +{"praise":true,"src":"env"} +{"elapsed_hours":0.5,"error":true,"src":"env:ci"} +{"elapsed_hours":0.5,"src":"env"} +{"elapsed_hours":3,"praise":true,"src":"env:ci"} +{"elapsed_hours":1,"error":true} +{"error":true,"praise":true,"src":"env:ci"} +{"elapsed_hours":0.5,"src":"env:ci"} +{"error":true} +{"elapsed_hours":10,"error":true,"praise":true,"src":"env:runner"} +{"elapsed_hours":10,"praise":true,"src":"env:ci"} +{"error":true,"praise":true,"src":"env:ci"} +{"elapsed_hours":0,"praise":true,"src":"env"} +{"elapsed_hours":1,"error":true,"src":"env:ci"} +{"elapsed_hours":0} +{"elapsed_hours":0} +{"elapsed_hours":0} +{"src":"env"} +{"error":true,"praise":true,"src":"env"} +{"elapsed_hours":1,"error":true} +{"elapsed_hours":0.5,"error":true,"praise":true,"src":"env"} diff --git a/bench/individuality/fixtures/p0/scripts/adaptive-3.jsonl b/bench/individuality/fixtures/p0/scripts/adaptive-3.jsonl new file mode 100644 index 0000000..bd6e26b --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/adaptive-3.jsonl @@ -0,0 +1,100 @@ +{"elapsed_hours":24,"error":true,"src":"env:ci"} +{"error":true} +{"elapsed_hours":0,"src":"env:runner"} +{} +{"elapsed_hours":720,"praise":true,"src":"env:ci"} +{"src":"env"} +{"praise":true,"src":"env:runner"} +{"elapsed_hours":0,"src":"env"} +{"src":"env"} +{"error":false,"praise":true,"src":"env:ci"} +{"elapsed_hours":720,"error":false,"praise":true,"src":"env"} +{"elapsed_hours":0,"src":"env:runner"} +{"elapsed_hours":24,"src":"env:runner"} +{"elapsed_hours":0,"error":true,"src":"env:runner"} +{"error":true,"praise":true} +{"elapsed_hours":0,"error":true} +{"elapsed_hours":0,"src":"env:runner"} +{"praise":true,"src":"env:ci"} +{"elapsed_hours":0,"src":"env"} +{"praise":false,"src":"env:runner"} +{"elapsed_hours":24} +{"elapsed_hours":24,"src":"env"} +{"elapsed_hours":0,"praise":true,"src":"env:runner"} +{"praise":true,"src":"env"} +{"elapsed_hours":0,"praise":true,"src":"env:runner"} +{"elapsed_hours":24,"praise":true} +{"elapsed_hours":24,"error":true,"src":"env:ci"} +{"elapsed_hours":720,"praise":true,"src":"env"} +{"error":true} +{"src":"env:runner"} +{"praise":true} +{"error":false,"praise":true,"src":"env:runner"} +{"error":true,"praise":true,"src":"env:runner"} +{"src":"env:runner"} +{"elapsed_hours":0,"praise":true,"src":"env:ci"} +{"praise":true,"src":"env"} +{"elapsed_hours":720} +{"praise":false,"src":"env:ci"} +{"elapsed_hours":0,"src":"env:ci"} +{"src":"env"} +{"src":"env:ci"} +{"src":"env:runner"} +{"elapsed_hours":0,"error":true,"src":"env"} +{"elapsed_hours":0,"praise":true,"src":"env:runner"} +{"elapsed_hours":720,"error":true,"src":"env:runner"} +{"elapsed_hours":720} +{"elapsed_hours":0} +{"error":true,"praise":true,"src":"env:runner"} +{"elapsed_hours":0,"praise":false,"src":"env:ci"} +{"error":true,"praise":true,"src":"env"} +{"src":"env"} +{"elapsed_hours":24,"error":true,"src":"env:ci"} +{"elapsed_hours":24,"praise":true,"src":"env:runner"} +{"elapsed_hours":24,"src":"env:runner"} +{"elapsed_hours":24,"src":"env"} +{"praise":true,"src":"env:runner"} +{"elapsed_hours":24} +{"src":"env"} +{"elapsed_hours":0,"error":true,"src":"env:runner"} +{"src":"env:ci"} +{"elapsed_hours":0,"error":true,"praise":false,"src":"env:runner"} +{"elapsed_hours":24,"praise":false,"src":"env:ci"} +{"error":true,"src":"env"} +{"praise":true,"src":"env"} +{"src":"env:ci"} +{"src":"env"} +{"elapsed_hours":24,"error":true,"praise":true,"src":"env:runner"} +{"src":"env:runner"} +{"elapsed_hours":24,"error":true} +{"elapsed_hours":720,"src":"env:ci"} +{"elapsed_hours":720,"src":"env:runner"} +{"elapsed_hours":24,"error":true,"src":"env:ci"} +{"elapsed_hours":0} +{} +{"praise":false} +{"praise":false,"src":"env:runner"} +{"elapsed_hours":720,"src":"env"} +{"elapsed_hours":0,"error":false,"src":"env"} +{"elapsed_hours":24,"src":"env"} +{"elapsed_hours":720} +{"elapsed_hours":0,"praise":true} +{"elapsed_hours":0,"error":true,"praise":true} +{"elapsed_hours":24,"src":"env"} +{"elapsed_hours":720,"src":"env:runner"} +{"src":"env:runner"} +{"elapsed_hours":24,"src":"env"} +{"elapsed_hours":24,"src":"env:ci"} +{"error":true,"src":"env:ci"} +{"elapsed_hours":0} +{"elapsed_hours":24,"error":false} +{"elapsed_hours":24,"error":true,"src":"env"} +{"elapsed_hours":24,"praise":false,"src":"env:runner"} +{"elapsed_hours":24,"error":true} +{"elapsed_hours":720,"src":"env:ci"} +{"elapsed_hours":24,"praise":false,"src":"env:ci"} +{"error":true,"src":"env:runner"} +{"error":true,"src":"env:runner"} +{} +{"elapsed_hours":720,"src":"env:ci"} +{"elapsed_hours":24,"error":true,"src":"env"} diff --git a/bench/individuality/fixtures/p0/scripts/drifter-0.jsonl b/bench/individuality/fixtures/p0/scripts/drifter-0.jsonl new file mode 100644 index 0000000..a70dbd3 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/drifter-0.jsonl @@ -0,0 +1,100 @@ +{"criticism":true,"elapsed_hours":0.5,"goals":{"craft":{"setback":0.268}},"security":true} +{"failure":true,"goals":{"chores":{"deadline_hours":12},"craft":{"setback":0.255},"safety":{"win":0.578}},"praise":true} +{"failure":true,"load":0.027} +{"criticism":false,"load":0.572} +{"goals":{"chores":{"novelty":true},"safety":{"deadline_hours":0}}} +{"criticism":true,"elapsed_hours":3,"praise":true,"security":true} +{"goals":{"chores":{"win":0.5}},"praise":false} +{"elapsed_hours":3,"load":0.029} +{"goals":{"craft":{"deadline_hours":0}},"praise":true} +{"criticism":false,"elapsed_hours":1,"load":0} +{"elapsed_hours":0,"goals":{"chores":{"win":0}},"load":3.505,"security":false} +{"elapsed_hours":0,"goals":{"safety":{"win":0}},"load":2} +{"criticism":true,"elapsed_hours":0,"praise":true,"security":true} +{"failure":true,"goals":{"chores":{"progress":0.957},"fun":{"win":0.56},"safety":{"deadline_hours":0}}} +{"load":4} +{"elapsed_hours":0,"load":0} +{"elapsed_hours":1,"goals":{"craft":{"cue":true}},"load":2,"security":true} +{"criticism":true,"elapsed_hours":0,"goals":{"fun":{"setback":0.546},"safety":{"progress":0.153}},"load":1.452,"praise":true,"security":false} +{"failure":false,"load":0,"praise":true,"security":true} +{"elapsed_hours":10,"goals":{"chores":{"setback":0.658},"craft":{"deadline_hours":12},"fun":{"novelty":false}},"security":true} +{"elapsed_hours":0.1,"goals":{"fun":{"cue":false}},"load":2,"security":true} +{"criticism":true,"elapsed_hours":0} +{"elapsed_hours":1,"failure":true,"goals":{"chores":{"progress":0.124},"craft":{"deadline_hours":1},"fun":{"deadline_hours":null}},"load":0.193} +{"elapsed_hours":10,"security":false} +{"elapsed_hours":0.1,"failure":true,"load":2} +{"failure":false,"load":0.797} +{"goals":{"craft":{"progress":0.938},"fun":{"win":0},"safety":{"novelty":false}},"load":0.28} +{"criticism":true,"elapsed_hours":0.1,"goals":{"craft":{"progress":0.419}}} +{"elapsed_hours":0} +{"criticism":false,"elapsed_hours":0.5,"goals":{"craft":{"progress":0.87},"fun":{"progress":0.31}},"load":2.744} +{"elapsed_hours":0.1,"failure":true,"goals":{"chores":{"progress":0.177},"craft":{"win":0}},"load":0,"praise":true} +{"goals":{"craft":{"win":0.548},"fun":{"progress":0.932},"safety":{"novelty":0.164}},"load":4} +{"elapsed_hours":10,"goals":{"chores":{"cue":true},"craft":{"setback":0.747},"safety":{"win":0}}} +{"goals":{"fun":{"setback":0.664}}} +{"failure":true,"goals":{"chores":{"deadline_hours":100},"fun":{"progress":0.987},"safety":{"win":1}},"praise":false} +{"load":2} +{"criticism":true,"elapsed_hours":1} +{"failure":true,"load":0} +{"elapsed_hours":0,"goals":{"safety":{"setback":0.951}}} +{"elapsed_hours":0,"goals":{"fun":{"progress":0.706},"safety":{"cue":true}}} +{"goals":{"chores":{"deadline_hours":12},"safety":{"deadline_hours":null}},"praise":true} +{"criticism":true,"elapsed_hours":0.5,"failure":true,"load":4} +{"goals":{"craft":{"progress":0.065},"fun":{"progress":0.41},"safety":{"setback":0.126}}} +{"failure":false,"load":2.075,"security":true} +{"criticism":true,"failure":true,"goals":{"chores":{"win":1},"fun":{"setback":0.504},"safety":{"win":0.15}},"praise":true,"security":true} +{"elapsed_hours":10,"failure":true,"goals":{"fun":{"win":2}},"load":4} +{"goals":{"chores":{"win":1}}} +{"goals":{"chores":{"progress":0.577},"safety":{"setback":0.648}}} +{"criticism":true,"goals":{"fun":{"win":0.388}},"load":3.293} +{"elapsed_hours":3} +{"criticism":true,"elapsed_hours":1,"goals":{"chores":{"win":0.5},"fun":{"deadline_hours":100},"safety":{"novelty":true}},"load":4,"praise":true} +{"criticism":true,"elapsed_hours":3,"praise":true} +{"elapsed_hours":3,"goals":{"chores":{"cue":false},"craft":{"deadline_hours":null},"fun":{"setback":0.525}},"praise":false} +{"elapsed_hours":0,"security":true} +{"criticism":true,"goals":{"chores":{"progress":0.467},"safety":{"progress":0.807}},"load":0,"praise":false,"security":true} +{"criticism":true,"failure":true,"goals":{"chores":{"progress":0.213},"craft":{"cue":false},"safety":{"setback":0.802}},"praise":true} +{"criticism":true,"elapsed_hours":0,"goals":{"chores":{"setback":0.453},"craft":{"setback":0.619}},"load":0} +{"goals":{"chores":{"novelty":true},"craft":{"novelty":true},"fun":{"cue":true},"safety":{"win":1}},"load":4,"praise":false} +{"elapsed_hours":0.1,"failure":true,"goals":{"safety":{"progress":0.596}},"load":0,"praise":true,"security":false} +{"criticism":true,"elapsed_hours":0.1,"failure":true,"load":2,"security":true} +{"load":4} +{"goals":{"chores":{"progress":0.853},"craft":{"progress":0.065}},"praise":true,"security":false} +{"failure":true,"goals":{"fun":{"setback":0.293}},"security":true} +{"criticism":false,"elapsed_hours":3,"goals":{"chores":{"win":2},"fun":{"setback":0.877}}} +{"elapsed_hours":0,"goals":{"craft":{"cue":true},"fun":{"win":0.5}},"load":2,"praise":true} +{"elapsed_hours":0,"goals":{"chores":{"win":0.5},"craft":{"cue":true},"fun":{"progress":0.226}},"load":4,"praise":true} +{"praise":true} +{"criticism":false} +{"goals":{"chores":{"progress":0.412},"safety":{"novelty":true}},"praise":true} +{"goals":{"craft":{"progress":0.137}},"load":0,"security":false} +{"criticism":true,"elapsed_hours":0.5,"failure":false,"load":0,"praise":true} +{"elapsed_hours":10,"failure":false,"load":4,"praise":false,"security":false} +{"criticism":true,"goals":{"chores":{"setback":0.62},"craft":{"win":0.5},"safety":{"progress":0.795}},"load":4} +{"elapsed_hours":0.1,"goals":{"craft":{"deadline_hours":null},"safety":{"win":1.02}},"load":0.729} +{"elapsed_hours":0,"goals":{"chores":{"progress":0.774},"craft":{"setback":0.768}},"load":2} +{"goals":{"craft":{"cue":true}},"praise":false} +{"elapsed_hours":0.1,"failure":false,"load":2} +{"criticism":true,"elapsed_hours":10} +{"elapsed_hours":0.1} +{"praise":false} +{"criticism":true,"elapsed_hours":0,"failure":true,"goals":{"fun":{"progress":0.422}},"load":2} +{"goals":{"craft":{"setback":0.339},"safety":{"progress":0.2}},"load":0,"security":true} +{"elapsed_hours":0,"goals":{"craft":{"deadline_hours":0},"safety":{"setback":0.803}}} +{"criticism":false,"elapsed_hours":0,"goals":{"craft":{"progress":0.855},"safety":{"novelty":false}},"load":2} +{"failure":true,"goals":{"craft":{"progress":0.177},"safety":{"win":0.638}},"praise":true,"security":false} +{"goals":{"craft":{"deadline_hours":1}}} +{"load":0,"praise":false} +{"load":2} +{} +{"elapsed_hours":0,"failure":true,"goals":{"chores":{"win":1.683},"safety":{"novelty":0.614}},"load":0} +{"elapsed_hours":10,"failure":true,"goals":{"fun":{"progress":0.212}},"load":4} +{"elapsed_hours":0.1,"failure":false,"goals":{"chores":{"progress":0.683},"craft":{"cue":true},"safety":{"progress":0.708}},"load":2,"security":true} +{"elapsed_hours":10,"goals":{"chores":{"win":0.333},"craft":{"progress":0.219},"fun":{"deadline_hours":30},"safety":{"setback":0.487}},"load":2,"security":false} +{"load":0.649} +{"elapsed_hours":0.1,"failure":true,"load":0} +{"criticism":true,"elapsed_hours":0,"failure":true,"load":4,"security":true} +{"criticism":true,"elapsed_hours":0,"goals":{"chores":{"progress":0.016}},"load":4} +{"goals":{"chores":{"win":0},"safety":{"win":0.967}},"security":true} +{"elapsed_hours":0.5,"goals":{"safety":{"progress":0.626}},"load":2.581} +{"elapsed_hours":0,"load":2} diff --git a/bench/individuality/fixtures/p0/scripts/drifter-1.jsonl b/bench/individuality/fixtures/p0/scripts/drifter-1.jsonl new file mode 100644 index 0000000..dfe97ac --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/drifter-1.jsonl @@ -0,0 +1,100 @@ +{"cancel":[0],"control":"pause","criticism":false,"elapsed_hours":3,"goals":{"chores":{"setback":0.245},"craft":{"win":0.644},"fun":{"win":1}},"praise":true,"security":false,"src":"human:a"} +{"await":false,"cancel":[0],"control":"resume","elapsed_hours":0,"failure":false,"goals":{"fun":{"progress":0.538}},"security":true,"src":"human:a"} +{"await":false,"cancel":[1],"elapsed_hours":10,"praise":false,"senses":{"tempo":1,"tool_latency":{"src":"env:runner","v":4.561}}} +{"control":"resume","criticism":true,"goals":{"chores":{"progress":0.478},"craft":{"setback":0.348},"fun":{"novelty":false}},"load":2,"security":true} +{"control":"pause","criticism":true,"elapsed_hours":0.1,"failure":false,"goals":{"craft":{"progress":0.721}},"senses":{"silence":29.68}} +{"goals":{"fun":{"win":1.872},"safety":{"cue":false}},"security":true,"senses":{"silence":5.38},"src":"self"} +{"failure":true,"load":0.959,"src":"clock"} +{"await":true,"cancel":[2],"elapsed_hours":0.1,"failure":false,"for":6,"goals":{"craft":{"cue":true},"fun":{"setback":0.183},"safety":{"setback":0.774}},"load":4,"senses":{"tool_fail":false}} +{"control":"resume","elapsed_hours":0.5,"src":"self"} +{"elapsed_hours":0,"failure":false,"for":8,"goals":{"chores":{"cue":true},"safety":{"cue":false}}} +{"elapsed_hours":0,"praise":true,"senses":{"tool_fail":false}} +{"criticism":true,"elapsed_hours":0,"for":9,"goals":{"fun":{"setback":0.03}},"load":1.553,"praise":true,"security":true} +{"control":"pause","criticism":true,"elapsed_hours":10,"failure":false,"for":10,"goals":{"chores":{"setback":0.564},"safety":{"win":0.5}},"praise":true,"security":true,"src":"clock"} +{"cancel":[12],"control":"pause","criticism":true,"goals":{"fun":{"cue":false},"safety":{"deadline_hours":null}},"load":2,"security":false,"senses":{"tempo":35,"tool_latency":{"src":"env:runner","v":1.6}}} +{"await":false,"elapsed_hours":0,"goals":{"chores":{"win":0}},"load":2,"praise":true,"security":false} +{"await":true,"control":"resume","criticism":true,"goals":{"craft":{"progress":0.268},"fun":{"progress":0.55}},"praise":true,"security":true,"src":"self"} +{"criticism":true,"goals":{"chores":{"progress":0.124}},"load":4,"senses":{"tool_fail":true}} +{"await":true,"elapsed_hours":0,"goals":{"chores":{"progress":0.408},"fun":{"deadline_hours":100},"safety":{"progress":0.378}},"load":0.366,"senses":{"silence":10.65}} +{"criticism":true,"elapsed_hours":0.1,"failure":true,"load":0,"praise":true,"security":true} +{"await":true,"elapsed_hours":0.1,"failure":false,"for":16,"goals":{"chores":{"setback":0.65},"craft":{"novelty":false},"fun":{"novelty":true}},"senses":{"silence":26.14}} +{"elapsed_hours":10,"praise":true,"security":false} +{"await":true,"control":"resume","criticism":true,"failure":true,"for":18,"goals":{"chores":{"win":2}},"load":4,"senses":{"silence":25.51}} +{"control":"pause","criticism":true,"failure":true,"goals":{"safety":{"setback":0.966}},"praise":true,"security":true,"senses":{"tempo":37,"tool_latency":{"src":"env:runner","v":7.065}}} +{"elapsed_hours":1,"load":2} +{"await":true,"criticism":false,"elapsed_hours":0,"failure":true,"goals":{"craft":{"progress":0.682},"safety":{"win":0.868}},"src":"clock"} +{"elapsed_hours":1,"load":0,"senses":{"tempo":8,"tool_latency":{"src":"env:runner","v":1.53}}} +{"cancel":[22],"control":"resume","elapsed_hours":10,"load":4,"senses":{"tool_fail":false}} +{"cancel":[23],"goals":{"chores":{"novelty":0.61},"craft":{"progress":0.605},"fun":{"setback":0.261}},"praise":true,"senses":{"tool_fail":false}} +{"control":"pause","goals":{"safety":{"novelty":true}},"load":2,"security":true,"senses":{"silence":21.93},"src":"human:a"} +{"elapsed_hours":10,"for":27,"goals":{"safety":{"cue":false}}} +{"await":true,"goals":{"chores":{"win":1}},"load":4,"senses":{"silence":6.03},"src":"self"} +{"elapsed_hours":3,"praise":true,"security":false} +{"await":true,"elapsed_hours":0,"load":2,"senses":{"tempo":17,"tool_latency":{"src":"env:runner","v":1.768}}} +{"criticism":true,"for":31,"goals":{"chores":{"deadline_hours":30},"craft":{"setback":0.037},"fun":{"win":1},"safety":{"cue":true}},"src":"human:a"} +{"elapsed_hours":3,"failure":false,"load":2,"praise":false,"senses":{"tempo":39,"tool_latency":{"src":"env:runner","v":7.397}}} +{"control":"resume","failure":false,"goals":{"chores":{"win":1},"craft":{"deadline_hours":0}}} +{"cancel":[32],"elapsed_hours":10,"failure":true,"goals":{"chores":{"novelty":false},"fun":{"deadline_hours":12},"safety":{"cue":true}},"senses":{"tool_fail":true}} +{"await":true,"cancel":[33],"criticism":true,"elapsed_hours":0,"goals":{"craft":{"win":0.588},"fun":{"cue":false}}} +{"await":true,"cancel":[37],"criticism":false,"praise":false} +{"control":"resume","goals":{"safety":{"progress":0.306}},"security":true} +{"elapsed_hours":3,"failure":true,"for":39,"goals":{"chores":{"progress":0.885},"fun":{"novelty":true}},"load":4,"senses":{"silence":16.82}} +{"elapsed_hours":0.1,"load":4,"security":false,"senses":{"tempo":0,"tool_latency":{"src":"env:runner","v":6.268}}} +{"await":true,"cancel":[39],"elapsed_hours":1,"for":40,"load":4,"security":true,"src":"env"} +{"failure":true,"goals":{"craft":{"progress":0.104}},"security":true} +{"load":2.474,"praise":false,"security":true} +{"failure":true,"for":42,"load":0.292,"security":false,"senses":{"tool_fail":false}} +{"await":false,"elapsed_hours":0.5,"for":43,"goals":{"craft":{"setback":0.219},"safety":{"progress":0.581}},"load":2,"praise":true,"senses":{"silence":15.56}} +{"cancel":[43],"criticism":true,"elapsed_hours":1,"senses":{"tempo":6,"tool_latency":{"src":"env:runner","v":1.918}}} +{"cancel":[45],"control":"pause","elapsed_hours":10,"security":true,"senses":{"silence":15.09}} +{"goals":{"chores":{"win":0.142},"fun":{"progress":0.384}},"praise":false,"security":false} +{"cancel":[46],"failure":false,"for":48,"load":4,"security":true,"senses":{"tool_fail":true}} +{"elapsed_hours":0,"goals":{"craft":{"win":1},"safety":{"setback":0.006}},"load":0.037,"praise":true,"src":"clock"} +{"control":"resume","criticism":true,"elapsed_hours":3,"praise":true} +{"elapsed_hours":0,"goals":{"chores":{"win":0.5},"craft":{"win":1},"safety":{"win":1}},"load":0,"praise":true} +{"criticism":true,"praise":true,"security":true,"senses":{"silence":29.54}} +{"await":true,"criticism":true,"elapsed_hours":0.1,"failure":false,"load":1.495,"src":"human:a"} +{"await":true,"elapsed_hours":0,"failure":true,"load":4,"src":"env"} +{"await":true,"elapsed_hours":0.1,"praise":false} +{"await":true,"for":57,"praise":true,"senses":{"tool_fail":false}} +{"criticism":false,"for":56} +{"load":0,"senses":{"silence":13.78},"src":"env"} +{"criticism":true,"elapsed_hours":0,"for":59,"senses":{"tool_fail":false}} +{"await":true,"criticism":true,"elapsed_hours":10,"for":61,"goals":{"fun":{"progress":0.391}},"praise":true,"senses":{"tool_fail":false},"src":"self"} +{"await":true,"cancel":[59],"elapsed_hours":0.5,"failure":true,"for":61,"load":2} +{"await":true,"criticism":true,"elapsed_hours":1,"failure":true,"senses":{"tool_fail":false}} +{"await":true,"control":"pause","criticism":true,"goals":{"fun":{"win":1}}} +{"criticism":true,"goals":{"chores":{"novelty":0.598},"craft":{"deadline_hours":100},"safety":{"progress":0.331}}} +{"criticism":true,"elapsed_hours":0.1,"goals":{"chores":{"progress":0.647},"craft":{"progress":0.246},"fun":{"novelty":0.006}},"praise":true,"security":true} +{"control":"resume","elapsed_hours":0,"load":4,"praise":true,"src":"self"} +{"await":true,"control":"pause","criticism":true,"elapsed_hours":0,"praise":false} +{"criticism":false,"load":0} +{"load":2} +{"criticism":true,"senses":{"silence":6.97}} +{"for":72,"goals":{"fun":{"win":0}},"load":4} +{"for":73,"goals":{"chores":{"setback":0.139}},"praise":false} +{"criticism":true,"elapsed_hours":3,"goals":{"chores":{"setback":0.198},"fun":{"novelty":false}},"senses":{"silence":6.99}} +{"control":"resume","for":73,"load":0.125,"praise":true} +{"cancel":[72],"elapsed_hours":3,"load":2} +{"control":"resume","elapsed_hours":1,"failure":true,"src":"env"} +{"cancel":[76],"elapsed_hours":1,"praise":true,"src":"env"} +{"criticism":true,"elapsed_hours":0,"goals":{"fun":{"progress":0.047}},"load":2,"security":true,"senses":{"tool_fail":true}} +{"criticism":true,"elapsed_hours":0,"load":2.245} +{"control":"pause","load":4,"senses":{"silence":2.86},"src":"human:a"} +{"await":true,"cancel":[82],"control":"resume","criticism":false,"src":"human:a"} +{"cancel":[79],"elapsed_hours":0,"failure":true,"goals":{"fun":{"win":1}},"load":0,"praise":true,"senses":{"silence":4.23},"src":"self"} +{"elapsed_hours":3,"goals":{"chores":{"deadline_hours":0}},"senses":{"tempo":30,"tool_latency":{"src":"env:runner","v":3.437}}} +{"control":"resume","criticism":true,"elapsed_hours":3,"for":85,"goals":{"fun":{"setback":0.277}},"src":"human:a"} +{"elapsed_hours":0,"src":"human:a"} +{"elapsed_hours":10,"goals":{"chores":{"cue":true},"craft":{"novelty":false},"fun":{"cue":true}},"senses":{"tempo":23,"tool_latency":{"src":"env:runner","v":5.498}},"src":"human:a"} +{"elapsed_hours":0.5,"senses":{"tempo":29,"tool_latency":{"src":"env:runner","v":4.212}}} +{"await":true,"cancel":[89],"goals":{"safety":{"win":1}},"load":4} +{"goals":{"chores":{"progress":0.334},"craft":{"progress":0.577},"fun":{"cue":true}},"load":0.076} +{"await":true,"cancel":[90],"control":"pause","elapsed_hours":3,"goals":{"chores":{"progress":0.381},"safety":{"progress":0.325}},"load":2.92,"praise":false,"senses":{"tool_fail":false},"src":"human:a"} +{"cancel":[90],"criticism":true,"elapsed_hours":0.5,"failure":true,"for":92,"goals":{"fun":{"setback":0.027}},"praise":true,"security":true,"src":"clock"} +{"control":"resume","criticism":true,"elapsed_hours":0.1,"failure":true,"for":93,"praise":true} +{"control":"resume","elapsed_hours":0,"failure":true,"for":92,"goals":{"chores":{"cue":false},"safety":{"cue":false}},"load":0,"praise":true,"security":true} +{"await":true,"for":93,"goals":{"chores":{"novelty":true},"fun":{"deadline_hours":0},"safety":{"progress":0.247}},"praise":true,"src":"self"} +{"await":true,"criticism":true,"elapsed_hours":0,"failure":true} +{"await":true,"control":"pause","criticism":false,"elapsed_hours":0,"goals":{"craft":{"deadline_hours":1},"safety":{"win":0.912}}} +{"await":true,"control":"resume","criticism":true,"for":98,"goals":{"safety":{"deadline_hours":12}},"load":2} diff --git a/bench/individuality/fixtures/p0/scripts/drifter-2.jsonl b/bench/individuality/fixtures/p0/scripts/drifter-2.jsonl new file mode 100644 index 0000000..8771add --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/drifter-2.jsonl @@ -0,0 +1,100 @@ +{"goals":{"craft":{"win":1},"fun":{"setback":0.506},"safety":{"progress":0.705}},"load":2,"security":true} +{"criticism":true,"failure":true,"goals":{"fun":{"win":1}},"praise":true,"security":true} +{"load":4,"praise":true,"security":true} +{"elapsed_hours":0.5,"failure":true,"goals":{"fun":{"novelty":true},"safety":{"setback":0.285}},"security":false} +{"criticism":true,"elapsed_hours":0.5,"failure":true,"load":2,"praise":true,"security":true} +{"criticism":true,"goals":{"safety":{"win":2}},"load":0,"praise":true} +{"criticism":false,"failure":false,"security":true} +{"criticism":true,"elapsed_hours":0.1,"failure":true} +{"criticism":true,"failure":true,"goals":{"chores":{"win":0.32}},"praise":true} +{"criticism":true,"load":4,"praise":true,"security":true} +{"criticism":true,"elapsed_hours":0.1,"goals":{"chores":{"win":1},"craft":{"novelty":false},"fun":{"win":2}},"praise":true,"security":false} +{"criticism":false,"elapsed_hours":0,"failure":false,"praise":true} +{"elapsed_hours":0,"goals":{"chores":{"deadline_hours":1},"safety":{"cue":true}},"load":1.267} +{"failure":true,"goals":{"chores":{"win":1}},"security":false} +{"elapsed_hours":3,"failure":true,"load":2,"praise":false,"security":true} +{"goals":{"chores":{"deadline_hours":12}},"load":4,"praise":true,"security":false} +{"elapsed_hours":0,"goals":{"fun":{"progress":0.719},"safety":{"progress":0.528}},"praise":true} +{"criticism":true,"failure":true,"praise":true} +{"elapsed_hours":3,"goals":{"craft":{"progress":0.708}},"praise":true,"security":true} +{"failure":true,"goals":{"chores":{"cue":true},"fun":{"win":2}},"load":2,"security":true} +{"elapsed_hours":10,"praise":true} +{"criticism":true,"elapsed_hours":0} +{"elapsed_hours":0.5,"failure":true,"goals":{"chores":{"progress":0.644},"craft":{"deadline_hours":30}},"load":4,"praise":true} +{"criticism":true,"elapsed_hours":0.5,"load":4} +{"elapsed_hours":10,"goals":{"craft":{"setback":0.844},"fun":{"cue":true}},"security":true} +{"failure":true,"load":0} +{"criticism":true,"load":4,"praise":true} +{"criticism":true} +{"criticism":true,"failure":true,"goals":{"chores":{"progress":0.941},"craft":{"progress":0.501},"safety":{"win":0.5}},"security":true} +{"criticism":true,"failure":true,"goals":{"chores":{"setback":0.607},"fun":{"cue":true},"safety":{"win":2}},"praise":true,"security":true} +{"elapsed_hours":0.5,"goals":{"chores":{"cue":true},"craft":{"novelty":false},"fun":{"setback":0.527}},"praise":true} +{"criticism":true,"failure":true,"praise":true} +{"criticism":true,"elapsed_hours":0,"goals":{"chores":{"novelty":false},"craft":{"cue":true},"fun":{"win":1}}} +{"criticism":true,"failure":true,"goals":{"chores":{"deadline_hours":1}},"security":true} +{"elapsed_hours":0,"praise":true} +{"criticism":true,"elapsed_hours":0.5,"goals":{"chores":{"win":1},"craft":{"setback":0.732},"fun":{"setback":0.614}},"load":0,"security":true} +{"criticism":true,"goals":{"craft":{"progress":0.489}}} +{"failure":true,"load":0,"praise":true,"security":true} +{"criticism":true,"failure":true,"goals":{"fun":{"cue":false}},"praise":true,"security":true} +{"criticism":true,"elapsed_hours":0.5,"goals":{"craft":{"progress":0.593}},"security":true} +{"criticism":true,"elapsed_hours":3,"failure":true} +{"criticism":true,"praise":true} +{"criticism":true,"failure":true} +{"elapsed_hours":0.1,"failure":true,"load":2} +{"elapsed_hours":0.5,"failure":true,"goals":{"fun":{"cue":true}},"load":2,"praise":true} +{"elapsed_hours":3,"failure":true,"goals":{"craft":{"deadline_hours":12},"fun":{"deadline_hours":null},"safety":{"cue":true}},"security":true} +{"failure":true,"goals":{"fun":{"cue":true}}} +{"criticism":true,"failure":false,"goals":{"fun":{"cue":true}},"praise":true} +{"criticism":true,"failure":true,"goals":{"chores":{"win":0}},"load":2.978,"security":true} +{"criticism":true,"elapsed_hours":10,"failure":true,"goals":{"chores":{"deadline_hours":30}},"security":true} +{"criticism":true,"failure":true,"goals":{"chores":{"setback":0.206},"craft":{"cue":true},"fun":{"win":1.877}}} +{"load":4,"security":true} +{"criticism":true,"elapsed_hours":0.1,"goals":{"chores":{"progress":0.837},"fun":{"progress":0.163}},"praise":true,"security":true} +{"criticism":true,"elapsed_hours":3,"failure":false,"goals":{"craft":{"cue":true}},"load":0,"security":true} +{"criticism":true,"failure":true,"goals":{"safety":{"win":0}},"load":3.848} +{"elapsed_hours":3,"goals":{"fun":{"setback":0.891}},"load":0,"praise":true,"security":true} +{"criticism":true,"failure":true,"praise":true} +{"criticism":true,"elapsed_hours":3,"goals":{"chores":{"cue":true},"safety":{"progress":0.772}},"praise":true,"security":true} +{"load":4,"praise":true,"security":true} +{"elapsed_hours":10,"failure":true,"goals":{"chores":{"win":0.5},"craft":{"deadline_hours":30},"safety":{"setback":0.804}}} +{"elapsed_hours":0.1,"failure":true,"goals":{"fun":{"progress":0.87},"safety":{"setback":0.26}},"load":4,"security":true} +{"criticism":true,"praise":true} +{"elapsed_hours":3,"goals":{"chores":{"win":0.5},"craft":{"cue":false}},"security":true} +{"criticism":true,"elapsed_hours":10,"failure":true,"load":2} +{"elapsed_hours":0.1,"load":1.357,"security":true} +{"criticism":true,"elapsed_hours":1,"goals":{"craft":{"cue":true}},"load":0,"praise":true,"security":true} +{"criticism":true,"elapsed_hours":0,"failure":true,"goals":{"chores":{"cue":false},"fun":{"novelty":0.017},"safety":{"novelty":false}},"load":0.431,"praise":true} +{"criticism":true,"elapsed_hours":1} +{"goals":{"fun":{"win":0.5}},"load":0,"praise":true,"security":true} +{"criticism":true,"elapsed_hours":0.1,"goals":{"safety":{"progress":0.173}},"load":2.994,"security":true} +{"elapsed_hours":0,"load":2,"praise":false} +{"criticism":true,"elapsed_hours":10} +{"elapsed_hours":0.5,"goals":{"chores":{"win":1},"craft":{"cue":true}},"praise":true} +{"failure":true,"goals":{"fun":{"progress":0.385}},"security":true} +{"criticism":true,"elapsed_hours":0.1,"failure":true,"goals":{"chores":{"novelty":false},"safety":{"progress":0.524}},"security":true} +{"elapsed_hours":3,"failure":true,"goals":{"chores":{"progress":0.314},"safety":{"win":1}},"security":true} +{"criticism":true,"goals":{"chores":{"deadline_hours":0},"craft":{"setback":0.687}},"security":false} +{"criticism":true,"elapsed_hours":10,"failure":true,"praise":true,"security":true} +{"elapsed_hours":0.1,"praise":true,"security":true} +{"criticism":true,"elapsed_hours":3,"failure":true,"goals":{"craft":{"deadline_hours":100},"fun":{"cue":true},"safety":{"win":1}},"praise":true} +{"criticism":false,"elapsed_hours":0.5,"failure":true,"security":true} +{"criticism":true,"goals":{"fun":{"win":0},"safety":{"progress":0.007}},"load":2,"praise":true,"security":true} +{"criticism":true,"elapsed_hours":10,"goals":{"chores":{"progress":0.44},"fun":{"setback":0.275}},"security":true} +{"elapsed_hours":0,"praise":true,"security":true} +{"criticism":true,"goals":{"chores":{"setback":0.719},"craft":{"progress":0.519}},"load":4,"praise":true} +{"criticism":true,"elapsed_hours":0.5,"failure":true} +{"criticism":true,"load":1.851,"security":true} +{"criticism":true,"elapsed_hours":0.1,"load":0,"praise":true} +{"load":4} +{"criticism":true,"elapsed_hours":0.5,"failure":true,"praise":true,"security":true} +{"elapsed_hours":10,"goals":{"craft":{"deadline_hours":0},"fun":{"deadline_hours":100}},"load":2} +{"criticism":true,"failure":true,"security":true} +{"criticism":true,"elapsed_hours":3,"load":1.458,"praise":false} +{"elapsed_hours":3,"failure":true,"load":2,"praise":false} +{"failure":true,"praise":true} +{"elapsed_hours":1,"load":0.645} +{"criticism":true,"goals":{"chores":{"progress":0.597},"craft":{"deadline_hours":12},"safety":{"win":0.5}},"praise":true} +{"criticism":true,"goals":{"craft":{"win":0},"fun":{"novelty":false},"safety":{"progress":0.116}},"praise":true,"security":true} +{"criticism":true,"load":2} +{"criticism":true,"goals":{"chores":{"cue":true},"fun":{"deadline_hours":null},"safety":{"progress":0.903}},"praise":true,"security":true} diff --git a/bench/individuality/fixtures/p0/scripts/drifter-3.jsonl b/bench/individuality/fixtures/p0/scripts/drifter-3.jsonl new file mode 100644 index 0000000..bae5a41 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/drifter-3.jsonl @@ -0,0 +1,100 @@ +{"criticism":false,"elapsed_hours":720,"load":4,"praise":true} +{"goals":{"chores":{"deadline_hours":100},"craft":{"win":1}},"praise":true} +{"elapsed_hours":24} +{"elapsed_hours":720,"failure":true,"goals":{"craft":{"cue":true},"safety":{"deadline_hours":100}},"praise":true} +{"criticism":true,"elapsed_hours":0,"goals":{"fun":{"cue":false}}} +{"elapsed_hours":0,"praise":true,"security":true} +{"elapsed_hours":720,"load":0} +{"elapsed_hours":720,"goals":{"safety":{"novelty":true}},"load":0,"praise":true} +{"elapsed_hours":24,"praise":true} +{"elapsed_hours":0,"failure":false,"goals":{"fun":{"win":0.5}}} +{"elapsed_hours":24,"failure":true,"load":0} +{"criticism":false} +{"criticism":true,"elapsed_hours":24,"failure":true,"goals":{"chores":{"novelty":0.561},"fun":{"win":0}}} +{"criticism":false,"elapsed_hours":720,"goals":{"craft":{"cue":false},"fun":{"win":2}},"load":4,"security":false} +{"goals":{"craft":{"cue":false}},"security":false} +{"elapsed_hours":24,"failure":false,"goals":{"chores":{"novelty":false},"fun":{"progress":0.664},"safety":{"win":2}},"security":true} +{"criticism":true,"elapsed_hours":24,"failure":false} +{"criticism":false,"elapsed_hours":720,"failure":true,"load":0} +{} +{"criticism":true} +{"elapsed_hours":720,"goals":{"chores":{"novelty":false}}} +{"goals":{"fun":{"cue":false},"safety":{"novelty":true}},"load":0,"praise":true} +{"elapsed_hours":720,"security":true} +{"criticism":true,"goals":{"chores":{"win":1}},"load":0} +{"elapsed_hours":720,"goals":{"craft":{"deadline_hours":12}},"load":4} +{"elapsed_hours":720,"goals":{"safety":{"novelty":true}}} +{"criticism":true,"elapsed_hours":0,"load":0,"praise":true} +{"praise":true} +{"elapsed_hours":0,"failure":true,"load":4} +{"criticism":false,"load":0,"praise":true,"security":false} +{"criticism":true,"elapsed_hours":24,"failure":false,"goals":{"chores":{"novelty":0.397}},"load":0} +{"elapsed_hours":720,"failure":true,"goals":{"fun":{"win":0},"safety":{"progress":0.491}},"load":4} +{"security":true} +{"elapsed_hours":24,"goals":{"chores":{"win":0},"craft":{"deadline_hours":100},"fun":{"cue":true}},"praise":false} +{"criticism":false,"elapsed_hours":0} +{"security":true} +{"criticism":false,"praise":false} +{"elapsed_hours":720,"failure":true,"goals":{"craft":{"win":0.5}},"load":4} +{"elapsed_hours":0} +{"criticism":false,"goals":{"craft":{"win":1}}} +{"elapsed_hours":0,"praise":true,"security":false} +{"criticism":true,"goals":{"chores":{"deadline_hours":100},"craft":{"setback":0.99}},"praise":false} +{"elapsed_hours":24} +{"criticism":true,"failure":true,"load":0} +{"goals":{"chores":{"progress":0.403},"craft":{"progress":0.019},"safety":{"win":1}},"praise":true} +{"elapsed_hours":24,"failure":true,"goals":{"chores":{"novelty":0.075},"craft":{"setback":0.618},"safety":{"deadline_hours":30}}} +{"elapsed_hours":0,"failure":true,"load":4,"praise":true,"security":true} +{"criticism":true,"elapsed_hours":720,"load":4,"security":true} +{"elapsed_hours":24,"goals":{"fun":{"progress":0.558}},"praise":true,"security":true} +{"criticism":true,"elapsed_hours":0,"failure":true,"goals":{"fun":{"deadline_hours":100}}} +{"failure":true,"goals":{"safety":{"win":1}},"praise":true,"security":true} +{"criticism":false,"failure":true,"goals":{"fun":{"progress":0.668}}} +{"elapsed_hours":720,"load":0} +{"criticism":true,"failure":true,"praise":true,"security":false} +{"criticism":true,"elapsed_hours":720,"praise":true,"security":true} +{"elapsed_hours":24,"praise":true,"security":true} +{"goals":{"craft":{"cue":true},"fun":{"win":0}},"praise":true,"security":false} +{"failure":true} +{"criticism":false,"elapsed_hours":0,"failure":true,"goals":{"fun":{"progress":0.957}},"praise":false} +{"elapsed_hours":0,"goals":{"fun":{"progress":0.278}},"load":0} +{"load":4,"praise":false} +{"criticism":true,"failure":true,"goals":{"craft":{"progress":0.828},"safety":{"progress":0.409}}} +{"criticism":true,"elapsed_hours":720,"failure":true,"goals":{"safety":{"cue":true}},"load":0,"praise":false} +{"elapsed_hours":720} +{"security":true} +{"elapsed_hours":720,"load":0,"praise":false} +{"criticism":true,"load":0} +{"elapsed_hours":0,"load":0} +{"elapsed_hours":720,"failure":true,"goals":{"craft":{"cue":true}},"praise":false} +{"goals":{"chores":{"progress":0.374},"craft":{"setback":0.776}},"load":0,"praise":true} +{"criticism":true,"elapsed_hours":720,"goals":{"fun":{"novelty":false},"safety":{"setback":0.366}},"load":4,"praise":true} +{"elapsed_hours":720,"goals":{"chores":{"progress":0.868},"craft":{"novelty":false},"fun":{"deadline_hours":100},"safety":{"novelty":false}},"security":true} +{"criticism":true,"elapsed_hours":24,"failure":true,"load":4} +{"criticism":true,"load":4,"praise":true} +{"goals":{"chores":{"cue":false}},"load":4,"praise":true} +{"criticism":false,"elapsed_hours":0,"load":0} +{"failure":true,"load":0} +{"failure":true,"security":true} +{"elapsed_hours":24,"failure":false,"goals":{"craft":{"cue":true},"fun":{"setback":0.641},"safety":{"cue":true}},"praise":false} +{"goals":{"fun":{"novelty":true},"safety":{"setback":0.703}},"load":4,"security":true} +{"elapsed_hours":0,"failure":false,"goals":{"fun":{"cue":false}},"load":4,"praise":false} +{"elapsed_hours":0,"failure":true} +{"criticism":true,"elapsed_hours":24} +{"criticism":true,"goals":{"fun":{"progress":0.08},"safety":{"progress":0.832}},"load":0} +{"failure":true,"load":4,"security":true} +{"elapsed_hours":720,"security":true} +{"failure":true,"goals":{"safety":{"progress":0.219}},"load":0,"praise":false,"security":true} +{"elapsed_hours":24,"goals":{"fun":{"cue":false},"safety":{"setback":0.003}},"praise":false,"security":false} +{"criticism":true,"elapsed_hours":24,"praise":true} +{"criticism":true,"failure":true,"goals":{"fun":{"win":0.5}},"load":4} +{"elapsed_hours":24,"goals":{"craft":{"win":0.5},"fun":{"novelty":true},"safety":{"cue":true}},"load":0,"praise":true} +{"load":4} +{"criticism":true,"elapsed_hours":720} +{"elapsed_hours":720,"goals":{"fun":{"win":0}}} +{"criticism":true,"elapsed_hours":720,"security":true} +{"elapsed_hours":0,"goals":{"safety":{"progress":0.167}},"load":4} +{"criticism":true,"elapsed_hours":720,"load":4,"security":true} +{"goals":{"chores":{"setback":0.085}},"load":0,"praise":true} +{"elapsed_hours":24,"goals":{"chores":{"progress":0.818}},"load":4} +{"failure":true,"goals":{"craft":{"progress":0.636}}} diff --git a/bench/individuality/fixtures/p0/scripts/guarded-0.jsonl b/bench/individuality/fixtures/p0/scripts/guarded-0.jsonl new file mode 100644 index 0000000..bffb726 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/guarded-0.jsonl @@ -0,0 +1,100 @@ +{"src":"env"} +{"elapsed_hours":1,"src":"env:runner"} +{"elapsed_hours":0,"praise":true,"src":"env:runner"} +{"error":false} +{"elapsed_hours":0.5,"praise":true,"src":"env:runner"} +{"elapsed_hours":10,"praise":true,"src":"env:runner"} +{"praise":true,"src":"env:ci"} +{"elapsed_hours":0,"src":"env:ci"} +{"elapsed_hours":0.5,"src":"env"} +{"elapsed_hours":0,"error":true,"src":"env:runner"} +{} +{"src":"env:ci"} +{"elapsed_hours":0,"src":"env"} +{"error":true,"praise":true,"src":"env"} +{"elapsed_hours":0,"error":true,"praise":true,"src":"env:runner"} +{"src":"env:ci"} +{"elapsed_hours":3,"error":true} +{"elapsed_hours":1,"error":true,"src":"env"} +{"error":true,"src":"env"} +{"elapsed_hours":1,"src":"env:runner"} +{"elapsed_hours":10,"src":"env:runner"} +{"elapsed_hours":0,"error":true,"src":"env"} +{"elapsed_hours":0} +{"error":true,"src":"env:ci"} +{"src":"env"} +{"elapsed_hours":0,"src":"env"} +{"src":"env:runner"} +{"src":"env:runner"} +{"elapsed_hours":1,"src":"env"} +{"elapsed_hours":3} +{"error":true,"src":"env:runner"} +{"elapsed_hours":3,"src":"env:runner"} +{"src":"env:runner"} +{"elapsed_hours":0.5,"error":false,"praise":true,"src":"env"} +{"elapsed_hours":10,"error":true,"src":"env"} +{"src":"env"} +{"elapsed_hours":0.1,"error":false} +{"error":true,"praise":false,"src":"env"} +{"src":"env:runner"} +{"src":"env:ci"} +{"praise":true} +{"elapsed_hours":1,"praise":true,"src":"env:runner"} +{"elapsed_hours":3,"praise":true} +{"elapsed_hours":0.5,"src":"env"} +{"elapsed_hours":1,"praise":false} +{"elapsed_hours":0.5,"praise":false,"src":"env"} +{"elapsed_hours":10,"src":"env"} +{"elapsed_hours":0,"src":"env"} +{"error":true,"src":"env"} +{"elapsed_hours":0.1,"src":"env:runner"} +{"src":"env:ci"} +{"praise":true,"src":"env:runner"} +{"elapsed_hours":0,"error":false,"src":"env:ci"} +{"elapsed_hours":10,"praise":true,"src":"env:ci"} +{"praise":true,"src":"env:ci"} +{"elapsed_hours":1,"src":"env"} +{"praise":true,"src":"env"} +{"elapsed_hours":10} +{"elapsed_hours":1,"error":true,"src":"env:ci"} +{"elapsed_hours":0.5,"src":"env:ci"} +{"elapsed_hours":1,"src":"env:ci"} +{"src":"env:runner"} +{} +{"elapsed_hours":0.5,"praise":true} +{"elapsed_hours":10,"error":true,"src":"env:ci"} +{"error":false} +{"elapsed_hours":10,"src":"env"} +{"elapsed_hours":1,"praise":true,"src":"env:runner"} +{"src":"env:runner"} +{"elapsed_hours":10,"src":"env"} +{"praise":true} +{"praise":true,"src":"env:ci"} +{"elapsed_hours":1,"src":"env"} +{"elapsed_hours":0.5,"praise":true} +{"elapsed_hours":10,"src":"env:runner"} +{"src":"env"} +{"elapsed_hours":10,"src":"env"} +{"src":"env:ci"} +{"elapsed_hours":0,"error":true} +{"elapsed_hours":0,"src":"env:ci"} +{"elapsed_hours":0,"src":"env"} +{"elapsed_hours":0.5,"praise":true,"src":"env:runner"} +{"elapsed_hours":0.1,"src":"env:runner"} +{"elapsed_hours":3,"src":"env"} +{"src":"env"} +{"elapsed_hours":0.5,"error":true,"src":"env:ci"} +{"elapsed_hours":0.5,"praise":true} +{"error":true,"src":"env:ci"} +{"error":true,"src":"env"} +{"src":"env:runner"} +{"elapsed_hours":10,"praise":true,"src":"env:runner"} +{"praise":true,"src":"env:ci"} +{"src":"env:ci"} +{"error":true,"src":"env"} +{"error":true,"praise":true} +{"elapsed_hours":3,"error":true,"src":"env:ci"} +{"praise":false,"src":"env:runner"} +{"src":"env:runner"} +{"src":"env:ci"} +{"error":false,"src":"env:ci"} diff --git a/bench/individuality/fixtures/p0/scripts/guarded-1.jsonl b/bench/individuality/fixtures/p0/scripts/guarded-1.jsonl new file mode 100644 index 0000000..4ed2828 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/guarded-1.jsonl @@ -0,0 +1,100 @@ +{"elapsed_hours":3,"src":"self"} +{"cancel":[0],"elapsed_hours":0.5,"for":0} +{"control":"pause"} +{"error":true,"for":0,"praise":true} +{"elapsed_hours":10,"error":true,"senses":{"tool_fail":false},"src":"self"} +{"elapsed_hours":0.1,"praise":true,"src":"nonsense"} +{"await":false,"goals":{"fun":{"win":1}},"praise":false,"src":"nonsense"} +{"elapsed_hours":0,"for":5,"praise":true,"src":"nonsense"} +{"await":true,"cancel":[3],"elapsed_hours":0,"error":true} +{"elapsed_hours":3,"for":6,"senses":{"tempo":29,"tool_latency":{"src":"env:runner","v":5.939}},"src":"clock"} +{"control":"resume","elapsed_hours":1,"error":true,"for":7,"senses":{"tempo":10,"tool_latency":{"src":"env:runner","v":5.813}},"src":"env"} +{"await":true,"control":"pause","elapsed_hours":3,"error":false,"src":"env"} +{"cancel":[9],"src":"env:runner"} +{"cancel":[9],"control":"resume","error":true,"senses":{"silence":8.23}} +{"await":true,"elapsed_hours":0.5,"error":false,"src":"clock"} +{"await":true,"elapsed_hours":0.1,"senses":{"tool_fail":true},"src":"env:runner"} +{"await":false,"cancel":[14],"elapsed_hours":1,"error":true,"goals":{"fun":{"win":1}},"src":"env:runner"} +{"await":true,"cancel":[16],"elapsed_hours":0,"error":true,"src":"env:ci"} +{"elapsed_hours":0,"senses":{"silence":27.63},"src":"env:ci"} +{"cancel":[17],"senses":{"tempo":14,"tool_latency":{"src":"env:runner","v":5.182}},"src":"env:runner"} +{"cancel":[18],"control":"resume","error":true,"for":17,"src":"env:"} +{"error":false,"for":18,"praise":true,"src":"env:runner"} +{"control":"resume","elapsed_hours":0.1,"src":"env"} +{"await":true,"control":"pause","elapsed_hours":0} +{"cancel":[23],"control":"resume","elapsed_hours":0,"for":23} +{"control":"resume","elapsed_hours":10,"praise":true,"senses":{"tempo":1,"tool_latency":{"src":"env:runner","v":0.73}},"src":"self"} +{"await":true,"control":"resume","elapsed_hours":0,"for":24,"src":"env:ci"} +{"await":false,"control":"resume","senses":{"tool_fail":false},"src":"human"} +{"control":"resume","praise":true} +{"cancel":[25],"elapsed_hours":10,"error":true,"for":27,"src":"env"} +{"await":true,"cancel":[29],"for":28,"src":"env:ci"} +{"elapsed_hours":0,"error":true,"src":"env:ci"} +{"cancel":[27],"control":"pause","error":true,"for":30,"goals":{"fun":{"win":1}},"src":"env:runner"} +{"elapsed_hours":0,"src":"nonsense"} +{"await":false,"elapsed_hours":0.5,"goals":{"fun":{"win":1}},"senses":{"tool_fail":true},"src":"clock"} +{"await":false,"cancel":[34],"elapsed_hours":10,"for":34,"praise":true} +{"cancel":[32],"praise":true} +{"control":"resume","error":true,"praise":true,"src":"env"} +{"await":true,"praise":true,"src":"env:ci"} +{"senses":{"silence":28.1}} +{"cancel":[37],"goals":{"fun":{"win":1}},"src":"env:runner"} +{"error":false,"for":38,"senses":{"tool_fail":true},"src":"env:runner"} +{"elapsed_hours":1,"goals":{"fun":{"win":1}},"senses":{"tool_fail":false},"src":"env:runner"} +{"control":"pause","src":"env:runner"} +{"control":"pause","elapsed_hours":1,"src":"env"} +{"control":"resume","elapsed_hours":0.5,"goals":{"fun":{"win":1}},"senses":{"tool_fail":false},"src":"env:runner"} +{"await":true,"elapsed_hours":0,"error":true,"src":"human"} +{"elapsed_hours":0,"goals":{"fun":{"win":1}},"senses":{"tempo":29,"tool_latency":{"src":"env:runner","v":6.655}},"src":"self"} +{"await":true,"elapsed_hours":10,"for":46,"praise":false,"src":"env:ci"} +{"src":"clock"} +{"cancel":[49],"praise":true,"src":"env:runner"} +{"await":true,"elapsed_hours":1,"praise":true,"src":"env"} +{"control":"pause","for":51,"goals":{"fun":{"win":1}},"src":"self"} +{"cancel":[50],"elapsed_hours":3,"error":true,"for":52,"goals":{"fun":{"win":1}},"praise":true,"src":"env:"} +{"control":"resume","elapsed_hours":0.1,"error":true,"for":51,"goals":{"fun":{"win":1}},"praise":true} +{"cancel":[54],"elapsed_hours":10,"error":true,"senses":{"tempo":19,"tool_latency":{"src":"env:runner","v":3.275}},"src":"env:runner"} +{"control":"resume","elapsed_hours":0.1,"error":false,"praise":true,"src":"env"} +{"await":true,"control":"resume","elapsed_hours":0.5,"goals":{"fun":{"win":1}},"senses":{"tempo":33,"tool_latency":{"src":"env:runner","v":4.587}}} +{"await":true,"elapsed_hours":0.5,"src":"nonsense"} +{"cancel":[54],"control":"pause","praise":true,"senses":{"tool_fail":false}} +{"await":true,"praise":true,"src":"env"} +{"cancel":[58],"error":false,"praise":false,"senses":{"tool_fail":false},"src":"env"} +{"control":"pause","elapsed_hours":0.1,"praise":true,"src":"env:runner"} +{"elapsed_hours":0.5,"src":"env:ci"} +{"await":true,"cancel":[62],"control":"pause","elapsed_hours":0,"senses":{"tempo":33,"tool_latency":{"src":"env:runner","v":6.436}},"src":"env:runner"} +{"cancel":[62],"control":"pause","error":true,"praise":false,"src":"env:"} +{"await":true,"control":"resume","elapsed_hours":1,"error":true,"praise":false,"senses":{"tool_fail":false},"src":"env"} +{"error":true,"goals":{"fun":{"win":1}},"praise":false,"src":"env:runner"} +{"cancel":[67],"elapsed_hours":1,"error":false,"for":66,"goals":{"fun":{"win":1}},"src":"env:ci"} +{"await":true,"cancel":[65],"praise":false,"senses":{"tool_fail":false},"src":"env"} +{"src":"human"} +{"praise":true} +{"await":true,"elapsed_hours":3,"error":true,"praise":false,"src":"env"} +{"elapsed_hours":1,"senses":{"silence":4.23},"src":"env"} +{"elapsed_hours":0,"praise":true} +{"elapsed_hours":0,"error":true,"for":74,"goals":{"fun":{"win":1}},"src":"env:ci"} +{"elapsed_hours":0,"for":75,"goals":{"fun":{"win":1}},"senses":{"tempo":11,"tool_latency":{"src":"env:runner","v":3.968}},"src":"env:runner"} +{"await":true,"error":false,"goals":{"fun":{"win":1}},"src":"human"} +{"await":true,"elapsed_hours":0.1,"senses":{"tool_fail":true},"src":"env:ci"} +{"await":true,"control":"resume","error":true,"for":78,"goals":{"fun":{"win":1}},"senses":{"silence":23.79},"src":"env:ci"} +{"await":true,"cancel":[79],"control":"pause","for":78,"praise":false,"src":"env"} +{"await":true,"control":"pause","praise":true,"src":"env:ci"} +{"cancel":[78]} +{"cancel":[82],"elapsed_hours":10,"for":81,"src":"env"} +{"await":true,"cancel":[79],"elapsed_hours":0.1,"praise":true,"senses":{"tool_fail":false},"src":"env:runner"} +{"await":true,"goals":{"fun":{"win":1}},"senses":{"tempo":36,"tool_latency":{"src":"env:runner","v":6.528}},"src":"env"} +{"cancel":[82],"elapsed_hours":0.5,"senses":{"silence":15.86},"src":"env:runner"} +{"await":true,"control":"resume","elapsed_hours":3,"error":true,"for":86,"praise":true} +{"await":true,"elapsed_hours":0.1,"praise":true,"senses":{"tool_fail":true},"src":"env:ci"} +{"error":true,"for":87,"src":"env:ci"} +{"elapsed_hours":3,"praise":true,"src":"env:ci"} +{"control":"resume","elapsed_hours":0,"senses":{"tool_fail":true},"src":"clock"} +{"cancel":[90],"elapsed_hours":0,"src":"env:runner"} +{"await":true,"elapsed_hours":1,"error":true,"for":91,"senses":{"tool_fail":true},"src":"env:runner"} +{"cancel":[90],"elapsed_hours":0,"error":true,"for":91,"src":"env:"} +{"elapsed_hours":0,"for":94,"senses":{"tempo":5,"tool_latency":{"src":"env:runner","v":2.418}}} +{"elapsed_hours":0,"praise":true,"senses":{"silence":22.31},"src":"env:runner"} +{"for":95,"src":"env"} +{"control":"pause","elapsed_hours":0,"praise":true,"src":"env:ci"} +{"control":"pause"} diff --git a/bench/individuality/fixtures/p0/scripts/guarded-2.jsonl b/bench/individuality/fixtures/p0/scripts/guarded-2.jsonl new file mode 100644 index 0000000..a2793e6 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/guarded-2.jsonl @@ -0,0 +1,100 @@ +{"error":true,"praise":true,"src":"env:runner"} +{"elapsed_hours":0.5,"error":true,"src":"env:runner"} +{"error":true,"src":"env"} +{"elapsed_hours":0,"error":true,"src":"env"} +{"elapsed_hours":0,"error":true,"praise":true,"src":"env:ci"} +{"elapsed_hours":1,"praise":false} +{"elapsed_hours":0.5,"error":true,"praise":false,"src":"env"} +{"elapsed_hours":0,"error":true,"praise":true} +{"src":"env"} +{"elapsed_hours":0.1,"error":true,"src":"env"} +{"elapsed_hours":1,"error":true,"src":"env"} +{"error":true,"src":"env"} +{"elapsed_hours":3,"praise":true,"src":"env:ci"} +{"elapsed_hours":0.5,"error":true} +{"elapsed_hours":0.5,"src":"env:runner"} +{"elapsed_hours":0.5,"error":true} +{"elapsed_hours":10,"src":"env:ci"} +{"elapsed_hours":1,"praise":true,"src":"env"} +{"elapsed_hours":0,"error":true,"praise":true,"src":"env:ci"} +{"error":true,"src":"env"} +{"elapsed_hours":0.1,"error":false,"src":"env:ci"} +{"elapsed_hours":0.5,"praise":true,"src":"env"} +{"elapsed_hours":0.1,"error":true,"src":"env:ci"} +{"error":true,"src":"env:runner"} +{"error":true,"praise":true,"src":"env:ci"} +{"elapsed_hours":0.1,"praise":false,"src":"env:runner"} +{"elapsed_hours":10,"praise":true,"src":"env:runner"} +{"praise":false,"src":"env:runner"} +{"praise":true,"src":"env:runner"} +{"elapsed_hours":1,"error":true,"src":"env"} +{"src":"env"} +{"elapsed_hours":0.5,"error":true} +{"praise":true,"src":"env"} +{"error":true,"praise":true,"src":"env:ci"} +{"error":true,"praise":false,"src":"env:ci"} +{"src":"env:runner"} +{"elapsed_hours":0,"error":true,"src":"env:runner"} +{"error":true,"praise":true,"src":"env:runner"} +{"praise":true,"src":"env"} +{"elapsed_hours":1,"src":"env"} +{"elapsed_hours":0.5,"src":"env"} +{"praise":true,"src":"env:ci"} +{"elapsed_hours":0,"praise":true,"src":"env"} +{"elapsed_hours":10,"praise":true,"src":"env:runner"} +{"elapsed_hours":0.1,"error":true,"praise":true,"src":"env"} +{"elapsed_hours":0.5,"error":false,"praise":false,"src":"env:ci"} +{"elapsed_hours":1,"error":true,"praise":true,"src":"env"} +{"error":true,"src":"env"} +{"error":true,"praise":true,"src":"env"} +{"elapsed_hours":3,"praise":true,"src":"env"} +{"elapsed_hours":0.1,"error":true,"src":"env:runner"} +{"elapsed_hours":10,"src":"env:runner"} +{"elapsed_hours":0,"error":false,"src":"env:ci"} +{"elapsed_hours":0.5,"praise":true,"src":"env:runner"} +{"elapsed_hours":3,"src":"env:runner"} +{"elapsed_hours":0.1,"praise":true,"src":"env:ci"} +{"error":true,"src":"env:ci"} +{"src":"env"} +{"elapsed_hours":10,"error":true,"praise":true,"src":"env:runner"} +{"error":true} +{"elapsed_hours":3,"error":true,"praise":true,"src":"env:runner"} +{"elapsed_hours":10,"error":true,"praise":false,"src":"env:runner"} +{"elapsed_hours":10,"error":true,"src":"env:ci"} +{"elapsed_hours":0,"praise":true,"src":"env:ci"} +{"elapsed_hours":0,"src":"env:runner"} +{"elapsed_hours":10} +{"src":"env"} +{"error":true,"src":"env"} +{"elapsed_hours":0,"praise":true} +{"error":true,"src":"env:ci"} +{"praise":true,"src":"env:ci"} +{"src":"env"} +{"src":"env:runner"} +{"elapsed_hours":0.1,"error":true,"praise":true,"src":"env"} +{"elapsed_hours":0.1,"error":true,"src":"env:ci"} +{"elapsed_hours":0,"error":true,"praise":false,"src":"env"} +{"elapsed_hours":0} +{"elapsed_hours":0,"src":"env"} +{"elapsed_hours":3,"error":true,"praise":true,"src":"env:ci"} +{"elapsed_hours":0.1,"error":true,"praise":true,"src":"env:runner"} +{"elapsed_hours":0,"src":"env:runner"} +{"elapsed_hours":3,"src":"env"} +{"elapsed_hours":0.1,"praise":true} +{"praise":true} +{"error":true,"src":"env:runner"} +{"elapsed_hours":3,"src":"env:ci"} +{"elapsed_hours":0.5} +{"elapsed_hours":0,"error":false,"src":"env:ci"} +{"elapsed_hours":0.5} +{"error":true,"praise":true,"src":"env:ci"} +{"elapsed_hours":0,"praise":true,"src":"env:runner"} +{"src":"env:runner"} +{"error":true,"praise":true} +{"elapsed_hours":0.1,"error":true,"praise":true,"src":"env:ci"} +{"error":true,"praise":true,"src":"env:ci"} +{"elapsed_hours":0.1,"src":"env:runner"} +{"elapsed_hours":0,"praise":true,"src":"env:runner"} +{"elapsed_hours":0.5,"src":"env:ci"} +{"elapsed_hours":3,"src":"env"} +{"elapsed_hours":0,"praise":true,"src":"env:ci"} diff --git a/bench/individuality/fixtures/p0/scripts/guarded-3.jsonl b/bench/individuality/fixtures/p0/scripts/guarded-3.jsonl new file mode 100644 index 0000000..961bb8e --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/guarded-3.jsonl @@ -0,0 +1,100 @@ +{"praise":true,"src":"env"} +{"elapsed_hours":720,"src":"env:runner"} +{"elapsed_hours":720,"src":"env:runner"} +{"src":"env:runner"} +{"praise":true} +{"praise":true,"src":"env:ci"} +{"src":"env:runner"} +{"error":true,"src":"env:ci"} +{"elapsed_hours":0,"error":true} +{"elapsed_hours":0,"src":"env:runner"} +{"elapsed_hours":720,"praise":true,"src":"env:ci"} +{"elapsed_hours":720,"praise":true,"src":"env"} +{"praise":true} +{"elapsed_hours":24,"src":"env:ci"} +{"elapsed_hours":0,"src":"env:ci"} +{"elapsed_hours":720,"error":false,"src":"env"} +{"src":"env"} +{"praise":false,"src":"env"} +{"src":"env:runner"} +{"elapsed_hours":0,"error":true,"src":"env"} +{"elapsed_hours":720,"error":true,"praise":true,"src":"env:runner"} +{"src":"env:runner"} +{"elapsed_hours":0,"praise":true,"src":"env:runner"} +{"elapsed_hours":720,"praise":true,"src":"env:ci"} +{"error":false,"src":"env:runner"} +{"elapsed_hours":0,"src":"env:ci"} +{"elapsed_hours":24,"src":"env:ci"} +{"error":true,"praise":true,"src":"env:runner"} +{"praise":true,"src":"env:runner"} +{"elapsed_hours":0,"error":true,"src":"env:ci"} +{"elapsed_hours":24,"src":"env"} +{"src":"env"} +{"praise":false,"src":"env:ci"} +{"src":"env"} +{"elapsed_hours":0,"src":"env"} +{"error":true,"praise":true} +{"elapsed_hours":24,"src":"env"} +{"error":true,"src":"env"} +{"src":"env"} +{"src":"env:runner"} +{"error":true,"src":"env:ci"} +{"elapsed_hours":0,"error":false,"praise":true,"src":"env:runner"} +{"elapsed_hours":0,"praise":true} +{"elapsed_hours":24,"src":"env:runner"} +{"elapsed_hours":0,"src":"env:runner"} +{"elapsed_hours":24,"error":true} +{"elapsed_hours":0,"src":"env:ci"} +{"error":true,"src":"env:ci"} +{"elapsed_hours":24,"praise":true,"src":"env"} +{"error":true,"src":"env:runner"} +{"elapsed_hours":24,"src":"env:runner"} +{"elapsed_hours":24} +{"src":"env:runner"} +{"src":"env:ci"} +{"elapsed_hours":720} +{"elapsed_hours":24,"praise":true,"src":"env:runner"} +{"praise":true,"src":"env:ci"} +{"praise":false,"src":"env:ci"} +{"src":"env:ci"} +{"elapsed_hours":720,"praise":false,"src":"env"} +{"elapsed_hours":0,"praise":true,"src":"env:ci"} +{"elapsed_hours":24,"src":"env:ci"} +{"elapsed_hours":24,"error":true,"src":"env"} +{"elapsed_hours":720,"praise":false,"src":"env:runner"} +{"elapsed_hours":24,"praise":true,"src":"env:ci"} +{} +{"elapsed_hours":0,"src":"env"} +{"praise":true,"src":"env:ci"} +{"elapsed_hours":24,"error":true,"praise":true,"src":"env"} +{"error":true,"src":"env"} +{"praise":true,"src":"env:runner"} +{"elapsed_hours":720,"error":true,"src":"env"} +{"src":"env:runner"} +{"elapsed_hours":0,"error":true,"src":"env"} +{"elapsed_hours":0,"error":true} +{"src":"env"} +{"error":false,"src":"env"} +{"elapsed_hours":24} +{"src":"env:ci"} +{"elapsed_hours":24,"src":"env"} +{"elapsed_hours":720,"src":"env:runner"} +{"elapsed_hours":0,"praise":true,"src":"env"} +{"src":"env:runner"} +{"elapsed_hours":24,"src":"env"} +{"praise":true} +{"praise":true,"src":"env"} +{"elapsed_hours":0,"error":false,"src":"env:runner"} +{"praise":true,"src":"env"} +{"elapsed_hours":24,"src":"env:ci"} +{"elapsed_hours":720,"error":true,"src":"env:runner"} +{"elapsed_hours":720,"src":"env:runner"} +{"elapsed_hours":24,"src":"env:runner"} +{"src":"env:ci"} +{"praise":false} +{"error":false,"praise":true,"src":"env:ci"} +{"elapsed_hours":24,"src":"env"} +{"elapsed_hours":0,"error":false,"src":"env:ci"} +{"src":"env:ci"} +{"error":true} +{"elapsed_hours":0} diff --git a/bench/individuality/fixtures/p0/scripts/ops-engineer-0.jsonl b/bench/individuality/fixtures/p0/scripts/ops-engineer-0.jsonl new file mode 100644 index 0000000..2144127 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/ops-engineer-0.jsonl @@ -0,0 +1,100 @@ +{"claim_done":true,"error":false,"task":"question","time_pressure":0.625} +{"claim_done":false,"elapsed_hours":0.5,"error":false,"sentiment":"negative","stakes":1} +{"loss":false,"sentiment":"positive","stakes":0.5,"task":"ops","time_pressure":0} +{"criticism":true,"praise":true,"time_pressure":1} +{"claim_done":true,"elapsed_hours":10,"stakes":0,"task":"chat","time_pressure":0.5} +{"elapsed_hours":0,"error":false,"time_pressure":0} +{"claim_done":true,"error":true,"loss":true,"praise":true,"stakes":0} +{"claim_done":true} +{} +{"elapsed_hours":0,"error":false,"task":"question","time_pressure":0.5} +{"claim_done":true,"criticism":true,"elapsed_hours":10,"loss":true,"stakes":0,"time_pressure":0.385} +{"claim_done":true,"criticism":true,"elapsed_hours":10,"loss":true,"task":"explain"} +{"criticism":false,"elapsed_hours":10,"error":true,"time_pressure":0} +{"criticism":false,"elapsed_hours":0.5,"task":"question"} +{"sentiment":"neutral","stakes":0.5} +{"claim_done":true,"criticism":true,"elapsed_hours":10,"sentiment":"positive","stakes":1} +{"claim_done":true,"error":true,"task":"question"} +{"elapsed_hours":0.5,"sentiment":"positive","stakes":0.153,"task":"chat"} +{"claim_done":true,"elapsed_hours":0,"task":"chat"} +{"praise":false,"sentiment":"negative","task":"ops"} +{"claim_done":false,"sentiment":"neutral","stakes":1} +{"elapsed_hours":0,"loss":true,"stakes":0,"task":"chat"} +{"claim_done":true,"criticism":true,"elapsed_hours":0.1,"error":true,"loss":false,"sentiment":"negative","stakes":0,"time_pressure":0.5} +{"sentiment":"positive","stakes":0,"time_pressure":0.5} +{"criticism":false,"elapsed_hours":1,"sentiment":"negative","time_pressure":0.5} +{"claim_done":false,"error":true,"praise":true,"sentiment":"neutral","stakes":0.5,"task":"code","time_pressure":1} +{"elapsed_hours":3,"error":false,"praise":true,"sentiment":"positive","stakes":0.651,"task":"ops","time_pressure":1} +{"elapsed_hours":1,"error":true,"praise":true,"stakes":0,"task":"explain","time_pressure":1} +{"criticism":false,"elapsed_hours":0,"error":false,"stakes":0.5,"task":"chat"} +{"criticism":false,"stakes":0,"time_pressure":1} +{"praise":true,"sentiment":"negative","stakes":0.5} +{"elapsed_hours":0.1,"praise":true,"sentiment":"neutral","task":"code"} +{"claim_done":true,"elapsed_hours":0,"error":true,"loss":true,"stakes":0.5,"task":"ops","time_pressure":1} +{"claim_done":true,"error":false,"praise":true,"time_pressure":0} +{"error":true,"praise":false,"sentiment":"positive","stakes":0.5,"task":"question"} +{"elapsed_hours":3,"loss":true,"task":"code","time_pressure":0.698} +{"claim_done":false,"elapsed_hours":0,"error":true,"loss":true,"praise":false,"sentiment":"negative","stakes":0.5,"task":"code","time_pressure":0.714} +{"elapsed_hours":0,"loss":false,"sentiment":"positive","stakes":1,"time_pressure":1} +{"claim_done":true,"praise":true,"sentiment":"positive","stakes":0,"time_pressure":1} +{"claim_done":false,"loss":false,"praise":false,"stakes":0.278,"task":"question","time_pressure":0.5} +{"stakes":0.5,"task":"question","time_pressure":0.5} +{"elapsed_hours":10,"praise":true,"sentiment":"negative","stakes":1,"task":"code"} +{"criticism":true,"error":true,"praise":true,"sentiment":"neutral","stakes":0.5,"time_pressure":1} +{"criticism":true,"elapsed_hours":0,"loss":true,"stakes":1} +{"criticism":true,"elapsed_hours":3,"error":true,"praise":true,"sentiment":"negative","task":"ops","time_pressure":0.5} +{"elapsed_hours":0,"time_pressure":1} +{"criticism":true,"elapsed_hours":0,"sentiment":"neutral","stakes":1,"time_pressure":0.979} +{"claim_done":true,"elapsed_hours":0,"sentiment":"positive","task":"code","time_pressure":0.999} +{"claim_done":true,"criticism":true,"elapsed_hours":3,"error":false,"sentiment":"positive","stakes":1,"time_pressure":0} +{"elapsed_hours":0,"stakes":1,"task":"chat","time_pressure":1} +{"criticism":true,"elapsed_hours":1,"error":true,"praise":false,"stakes":0.5,"time_pressure":1} +{"criticism":false,"sentiment":"positive","task":"code","time_pressure":0.5} +{"claim_done":true,"elapsed_hours":3,"praise":true} +{"elapsed_hours":0,"praise":true,"stakes":0.5} +{"claim_done":true,"error":true,"praise":false,"sentiment":"neutral","task":"code","time_pressure":0.883} +{"claim_done":true,"error":true,"sentiment":"positive","stakes":0,"task":"explain","time_pressure":0.038} +{"elapsed_hours":10,"sentiment":"neutral","stakes":1,"task":"ops","time_pressure":0.2} +{"loss":true,"sentiment":"neutral"} +{"elapsed_hours":0,"loss":true,"praise":true,"sentiment":"positive","stakes":0,"task":"explain"} +{"elapsed_hours":0.1,"loss":true,"praise":true,"sentiment":"neutral","task":"code","time_pressure":0} +{"elapsed_hours":0,"stakes":1,"task":"question","time_pressure":0.727} +{"error":true,"sentiment":"negative","stakes":0,"time_pressure":0.525} +{"criticism":true,"elapsed_hours":3,"loss":true,"praise":true,"stakes":0.57} +{"claim_done":true,"elapsed_hours":1,"stakes":0.5} +{"sentiment":"neutral","stakes":0.451} +{"elapsed_hours":0,"loss":false,"stakes":1,"task":"question","time_pressure":0.5} +{"claim_done":true,"sentiment":"neutral","stakes":0.333} +{"criticism":true,"loss":true,"sentiment":"positive","stakes":0.869,"task":"ops"} +{"claim_done":true,"elapsed_hours":0,"praise":true,"task":"code"} +{"claim_done":false,"elapsed_hours":1,"error":true,"stakes":0.5,"time_pressure":0} +{"sentiment":"neutral"} +{"elapsed_hours":0,"task":"chat","time_pressure":0} +{"elapsed_hours":0,"praise":true,"task":"ops","time_pressure":0} +{"criticism":false,"loss":true,"task":"chat"} +{"elapsed_hours":3,"error":true} +{"criticism":true,"elapsed_hours":0,"error":true,"praise":true,"stakes":0.5,"task":"ops","time_pressure":0.569} +{"elapsed_hours":0,"task":"ops","time_pressure":1} +{"elapsed_hours":1,"sentiment":"negative"} +{"elapsed_hours":0,"error":true,"loss":true,"sentiment":"negative","stakes":1} +{"criticism":true,"elapsed_hours":3,"sentiment":"positive","stakes":0,"task":"chat","time_pressure":0.5} +{"elapsed_hours":1,"error":true,"loss":true,"praise":true,"stakes":0.5,"time_pressure":0} +{"error":true,"sentiment":"positive","stakes":0.5,"time_pressure":0.613} +{"elapsed_hours":10,"error":true,"stakes":0.5} +{"claim_done":true,"elapsed_hours":0.5,"loss":true,"sentiment":"positive","time_pressure":1} +{"error":false,"stakes":0.464} +{"criticism":true,"elapsed_hours":10,"error":false,"loss":true,"sentiment":"negative","task":"question","time_pressure":0.5} +{"claim_done":true,"loss":true} +{"elapsed_hours":0,"error":true,"loss":true,"stakes":0.262,"task":"ops","time_pressure":0.5} +{"error":true,"sentiment":"positive","stakes":0.208,"time_pressure":1} +{"claim_done":true,"sentiment":"positive","stakes":1,"time_pressure":1} +{"elapsed_hours":1,"error":true,"stakes":0.962} +{"claim_done":false,"elapsed_hours":0,"error":false,"loss":false,"time_pressure":0.5} +{"elapsed_hours":0.5,"praise":true,"sentiment":"positive","task":"ops"} +{"criticism":true,"error":true,"task":"ops","time_pressure":1} +{"claim_done":true,"criticism":true,"elapsed_hours":0.1,"loss":true,"praise":true,"sentiment":"negative","task":"question"} +{"elapsed_hours":0.1,"sentiment":"positive","stakes":0.922,"time_pressure":0.5} +{"elapsed_hours":10,"time_pressure":0.5} +{"elapsed_hours":3,"error":true,"sentiment":"neutral","time_pressure":0} +{"claim_done":true,"criticism":true,"stakes":0,"time_pressure":1} +{"elapsed_hours":10,"loss":true,"sentiment":"positive","stakes":0,"task":"explain","time_pressure":1} diff --git a/bench/individuality/fixtures/p0/scripts/ops-engineer-1.jsonl b/bench/individuality/fixtures/p0/scripts/ops-engineer-1.jsonl new file mode 100644 index 0000000..ebe87d3 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/ops-engineer-1.jsonl @@ -0,0 +1,100 @@ +{"elapsed_hours":0,"error":true,"for":0,"loss":true,"senses":{"tempo":22,"tool_latency":{"src":"env:runner","v":7.399}},"sentiment":"negative","src":"self"} +{"claim_done":true,"control":"pause","elapsed_hours":3,"senses":{"tempo":18,"tool_latency":{"src":"env:runner","v":0.665}},"sentiment":"neutral","task":"explain"} +{"error":true,"praise":true,"senses":{"tempo":17,"tool_latency":{"src":"env:runner","v":3.647}},"task":"chat"} +{"control":"pause","elapsed_hours":10,"error":true,"for":2,"sentiment":"positive","stakes":0} +{"await":true,"criticism":true,"elapsed_hours":10,"error":true,"goals":{"fun":{"win":1}},"senses":{"tool_fail":false},"sentiment":"negative","stakes":0.121,"task":"ops","time_pressure":1} +{"cancel":[0],"claim_done":true,"criticism":true,"elapsed_hours":0.1,"loss":true,"senses":{"tool_fail":false},"sentiment":"neutral","task":"chat"} +{"await":true,"criticism":true,"elapsed_hours":0.5,"loss":true,"sentiment":"positive","stakes":1,"time_pressure":0} +{"await":true,"elapsed_hours":0,"senses":{"tool_fail":false},"sentiment":"neutral","stakes":0.5,"task":"explain"} +{"await":true,"control":"pause","elapsed_hours":0,"loss":true,"praise":false,"sentiment":"positive","src":"clock","stakes":0.5} +{"cancel":[5],"criticism":false,"sentiment":"neutral","stakes":0.396,"task":"ops"} +{"control":"pause","for":9,"sentiment":"positive","time_pressure":0} +{"await":false,"control":"resume","criticism":true,"error":true,"praise":true,"sentiment":"neutral","stakes":1,"task":"question"} +{"await":true,"elapsed_hours":0,"error":true,"for":9,"praise":false,"time_pressure":0} +{"await":true,"claim_done":false,"control":"pause","for":12,"loss":true,"praise":true,"time_pressure":0.5} +{"claim_done":true,"elapsed_hours":0.5,"error":true,"loss":true,"src":"env","time_pressure":0.901} +{"control":"pause","criticism":true,"elapsed_hours":10,"error":true,"for":12,"loss":true,"sentiment":"neutral","stakes":1,"task":"code","time_pressure":0.5} +{"await":true,"senses":{"silence":3.43},"src":"self","stakes":0,"time_pressure":0.287} +{"await":true,"elapsed_hours":1,"senses":{"tool_fail":false},"sentiment":"negative","task":"explain","time_pressure":0.5} +{"await":true,"cancel":[16],"claim_done":true,"error":true,"loss":true,"praise":true} +{"criticism":true,"elapsed_hours":10,"error":false,"praise":true,"senses":{"tempo":30,"tool_latency":{"src":"env:runner","v":3.837}},"sentiment":"positive"} +{"claim_done":true,"error":true,"loss":true,"senses":{"tempo":3,"tool_latency":{"src":"env:runner","v":6.816}},"stakes":0.5} +{"claim_done":true,"control":"pause","elapsed_hours":0,"error":true,"for":18,"loss":true,"sentiment":"negative","stakes":1} +{"await":true,"elapsed_hours":0,"error":false,"src":"env","stakes":0.5,"time_pressure":1} +{"elapsed_hours":1,"for":20,"src":"self","stakes":0,"time_pressure":0.136} +{"claim_done":true,"control":"resume","elapsed_hours":0,"error":true,"senses":{"silence":11.41},"stakes":0.615,"task":"chat","time_pressure":0.5} +{"criticism":false,"elapsed_hours":1,"senses":{"tool_fail":false},"task":"question"} +{"loss":false,"sentiment":"neutral","src":"human:a","stakes":0,"time_pressure":0} +{"claim_done":false,"criticism":false,"for":26,"loss":true,"task":"code","time_pressure":0.49} +{"await":true,"control":"resume","for":25} +{"claim_done":true,"criticism":true,"elapsed_hours":0.5,"src":"self","stakes":0.5,"task":"code","time_pressure":0} +{"cancel":[29],"elapsed_hours":0,"error":false,"for":28,"loss":true,"senses":{"silence":12.59},"sentiment":"positive","time_pressure":0} +{"claim_done":true,"praise":false,"time_pressure":0.145} +{"elapsed_hours":0.1,"error":true,"task":"question"} +{"elapsed_hours":0,"for":32,"praise":true,"senses":{"tool_fail":false},"time_pressure":0} +{"await":true,"claim_done":true,"elapsed_hours":0,"stakes":0.5,"time_pressure":0.385} +{"await":false,"control":"resume","elapsed_hours":0.1,"loss":false,"sentiment":"negative","time_pressure":0} +{"claim_done":true,"control":"pause","error":false,"praise":true,"senses":{"tempo":16,"tool_latency":{"src":"env:runner","v":5.838}},"sentiment":"positive","stakes":0.5,"time_pressure":0.5} +{"elapsed_hours":1,"error":false,"loss":true,"praise":true,"stakes":0.849} +{"cancel":[37],"control":"resume","error":true,"goals":{"fun":{"win":1}},"sentiment":"positive","stakes":1,"time_pressure":1} +{"criticism":false,"elapsed_hours":3,"error":true,"loss":true,"praise":true,"sentiment":"neutral","src":"clock","stakes":0,"task":"question"} +{"await":true,"cancel":[35],"claim_done":true,"elapsed_hours":1,"error":true,"praise":true,"senses":{"tool_fail":false},"sentiment":"positive","src":"self","stakes":0.5} +{"claim_done":true,"for":38,"loss":true,"stakes":0.429,"task":"code"} +{"elapsed_hours":0,"loss":true,"praise":false,"sentiment":"neutral","src":"clock","stakes":0.5,"time_pressure":0} +{"await":true,"control":"resume","elapsed_hours":0,"praise":true,"senses":{"tool_fail":false},"sentiment":"positive"} +{"elapsed_hours":0,"for":42,"sentiment":"positive","stakes":0.343,"task":"explain"} +{"for":42,"stakes":0.5} +{"cancel":[44],"claim_done":true,"elapsed_hours":0,"loss":true,"praise":true,"senses":{"silence":14.31},"time_pressure":0} +{"elapsed_hours":0.5,"praise":true,"sentiment":"negative","stakes":0.604,"task":"question"} +{"cancel":[45],"criticism":false,"stakes":0.5,"time_pressure":1} +{"claim_done":true,"criticism":true,"elapsed_hours":0.1,"loss":true,"praise":true,"stakes":0.547,"time_pressure":0} +{"claim_done":true,"elapsed_hours":1,"for":49,"praise":true,"senses":{"tool_fail":false},"sentiment":"negative","src":"self"} +{"elapsed_hours":0,"praise":true,"sentiment":"positive","src":"self","time_pressure":1} +{"await":true,"cancel":[48],"elapsed_hours":3,"for":50,"praise":true,"senses":{"tempo":3,"tool_latency":{"src":"env:runner","v":2.964}},"stakes":0.5,"task":"ops","time_pressure":0.757} +{"await":true,"control":"resume","criticism":false,"elapsed_hours":0.1,"error":true,"sentiment":"neutral","src":"env","time_pressure":1} +{"claim_done":true,"control":"pause","error":true,"stakes":0,"task":"ops"} +{"control":"resume","criticism":true,"loss":true,"praise":true,"senses":{"tempo":7,"tool_latency":{"src":"env:runner","v":1.434}},"stakes":0,"task":"chat","time_pressure":0} +{"claim_done":true,"criticism":true,"elapsed_hours":0,"error":false,"sentiment":"negative","task":"question","time_pressure":0} +{"claim_done":true,"control":"resume","elapsed_hours":0,"for":54,"praise":true,"senses":{"tempo":26,"tool_latency":{"src":"env:runner","v":7.334}},"sentiment":"positive","stakes":0,"time_pressure":0.5} +{"claim_done":true,"error":true,"loss":false,"praise":false,"senses":{"tempo":20,"tool_latency":{"src":"env:runner","v":3.301}},"task":"ops","time_pressure":0.165} +{"claim_done":false,"elapsed_hours":3,"loss":true,"praise":true,"src":"self"} +{"await":true,"control":"pause","elapsed_hours":0,"loss":true,"stakes":0,"task":"explain"} +{"cancel":[57],"sentiment":"positive","task":"ops","time_pressure":1} +{"await":false,"control":"resume","criticism":true,"elapsed_hours":0,"for":61,"loss":true,"sentiment":"neutral","stakes":1,"task":"explain"} +{"claim_done":false,"elapsed_hours":0,"praise":true,"task":"explain","time_pressure":1} +{"await":true,"claim_done":true,"error":true,"goals":{"fun":{"win":1}},"senses":{"tool_fail":false},"stakes":0} +{"criticism":true,"error":true,"praise":false,"sentiment":"negative"} +{"cancel":[64],"claim_done":true,"elapsed_hours":1,"senses":{"silence":15.76},"sentiment":"positive","task":"ops","time_pressure":1} +{"claim_done":true,"criticism":true,"elapsed_hours":0,"loss":true,"praise":true,"sentiment":"positive"} +{"elapsed_hours":0,"error":true,"senses":{"tool_fail":false},"src":"human:a","stakes":0.5} +{"await":false,"cancel":[66],"elapsed_hours":10,"src":"self","stakes":0} +{"await":true,"cancel":[68],"control":"pause","criticism":true,"for":69,"goals":{"fun":{"win":1}},"task":"chat"} +{"claim_done":false,"control":"resume","criticism":true,"praise":true,"senses":{"silence":22.69},"sentiment":"positive","task":"code"} +{"claim_done":false,"criticism":true,"elapsed_hours":0,"task":"code","time_pressure":0.272} +{"criticism":true,"elapsed_hours":0.5,"loss":true,"senses":{"silence":3.45},"src":"human:a","stakes":0.489,"time_pressure":0.071} +{"claim_done":true,"criticism":true,"for":72,"loss":false,"src":"env","time_pressure":1} +{"elapsed_hours":0,"loss":true,"time_pressure":1} +{"control":"pause","criticism":true,"loss":true,"stakes":0.014,"task":"ops"} +{"control":"resume","criticism":true,"loss":true,"praise":true,"task":"code","time_pressure":0.998} +{"cancel":[74],"criticism":true,"elapsed_hours":0,"error":true,"task":"chat","time_pressure":0.765} +{"await":true,"cancel":[76],"praise":true,"time_pressure":1} +{"await":true,"claim_done":true,"criticism":true,"elapsed_hours":0.1,"error":true,"sentiment":"negative","task":"explain","time_pressure":0.5} +{"cancel":[80],"elapsed_hours":0,"error":true,"loss":true,"sentiment":"negative","task":"ops"} +{"control":"pause","elapsed_hours":0.1,"for":80,"sentiment":"negative","src":"env","stakes":0.85,"task":"ops","time_pressure":0} +{"await":false,"for":81,"loss":false,"senses":{"silence":29.8},"sentiment":"negative","src":"human:a","stakes":0.5} +{"await":false,"control":"pause","criticism":true,"loss":false,"src":"human:a","stakes":0.5,"time_pressure":0.33} +{"await":true,"cancel":[81],"claim_done":false,"for":84,"sentiment":"positive","stakes":0.5,"time_pressure":0.5} +{"await":true,"claim_done":true,"control":"pause","elapsed_hours":3,"goals":{"fun":{"win":1}},"praise":true,"senses":{"silence":10.14},"time_pressure":1} +{"claim_done":true,"error":false,"praise":true,"senses":{"tool_fail":false},"sentiment":"neutral","stakes":1,"time_pressure":0.906} +{"claim_done":true,"elapsed_hours":10,"error":true,"loss":true,"senses":{"tool_fail":false},"sentiment":"neutral"} +{"claim_done":true,"elapsed_hours":0,"error":false,"for":88,"praise":true,"sentiment":"negative","src":"self","task":"chat"} +{"claim_done":true,"control":"resume","criticism":true,"loss":true,"praise":false,"senses":{"tempo":28,"tool_latency":{"src":"env:runner","v":7.344}},"sentiment":"negative","src":"clock","task":"code","time_pressure":0.694} +{"cancel":[86],"error":true,"loss":false,"praise":true,"src":"human:a","stakes":0,"task":"code","time_pressure":0} +{"cancel":[89],"claim_done":true,"control":"pause","elapsed_hours":10,"error":true,"for":90,"loss":true,"senses":{"tool_fail":true},"src":"human:a","stakes":0,"time_pressure":1} +{"cancel":[88],"error":true,"senses":{"tool_fail":false},"sentiment":"positive","stakes":0.5,"time_pressure":1} +{"claim_done":true,"goals":{"fun":{"win":1}},"sentiment":"positive"} +{"await":true,"cancel":[91],"criticism":true,"error":true,"praise":true,"sentiment":"negative","stakes":0.5} +{"for":94,"task":"question","time_pressure":0.5} +{"await":true,"praise":false,"senses":{"silence":15.64}} +{"elapsed_hours":10,"senses":{"silence":2.82},"sentiment":"neutral","stakes":0.169,"task":"chat"} +{"await":false,"control":"resume","criticism":true,"elapsed_hours":0.1,"goals":{"fun":{"win":1}},"stakes":0,"task":"chat","time_pressure":0.5} diff --git a/bench/individuality/fixtures/p0/scripts/ops-engineer-2.jsonl b/bench/individuality/fixtures/p0/scripts/ops-engineer-2.jsonl new file mode 100644 index 0000000..91a9a3e --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/ops-engineer-2.jsonl @@ -0,0 +1,100 @@ +{"claim_done":true,"criticism":true,"elapsed_hours":0.1,"praise":true,"task":"ops","time_pressure":0} +{"criticism":false,"elapsed_hours":0.1,"error":true,"praise":false,"sentiment":"negative","stakes":0,"time_pressure":0.5} +{"claim_done":true,"criticism":true,"loss":true,"praise":true,"sentiment":"negative"} +{"claim_done":true,"criticism":true,"task":"question"} +{"criticism":true} +{"claim_done":true,"elapsed_hours":0.1,"sentiment":"positive","stakes":0.106} +{"criticism":true,"elapsed_hours":0,"error":true,"stakes":1,"task":"code","time_pressure":1} +{"claim_done":true,"criticism":true,"elapsed_hours":0.5,"error":true,"loss":false,"praise":true,"stakes":0.847,"task":"explain"} +{"claim_done":true,"loss":true,"stakes":1,"task":"question","time_pressure":0.91} +{"criticism":true,"elapsed_hours":3,"error":true,"stakes":0.708,"task":"code"} +{"claim_done":true,"elapsed_hours":10,"error":true,"loss":false,"stakes":0.5} +{"error":true,"loss":false,"praise":false,"sentiment":"positive","task":"code","time_pressure":0} +{"claim_done":true,"criticism":true,"elapsed_hours":10,"loss":false,"praise":true,"stakes":0.959,"task":"code"} +{"error":true,"sentiment":"positive","task":"question"} +{"claim_done":true,"criticism":false,"elapsed_hours":10,"loss":true,"praise":true,"sentiment":"neutral","task":"question"} +{"claim_done":true,"elapsed_hours":0,"error":true,"sentiment":"positive","task":"explain","time_pressure":0.668} +{"claim_done":false,"criticism":true,"error":true,"loss":true,"praise":false,"stakes":0.994} +{"error":true} +{"elapsed_hours":10,"praise":true,"task":"code","time_pressure":0.016} +{"elapsed_hours":0,"stakes":1,"task":"ops","time_pressure":1} +{"criticism":true,"praise":true,"sentiment":"negative","task":"question","time_pressure":0} +{"claim_done":true,"elapsed_hours":0,"praise":true,"sentiment":"positive","stakes":0.5,"time_pressure":0.925} +{"claim_done":true,"elapsed_hours":0,"error":true,"praise":true,"stakes":1,"task":"question"} +{"criticism":true,"elapsed_hours":10,"loss":true,"time_pressure":0.803} +{"criticism":true,"elapsed_hours":0.1,"error":true,"loss":true,"sentiment":"negative","stakes":1} +{"claim_done":false,"elapsed_hours":1,"error":true,"loss":false} +{"criticism":true,"error":false,"loss":true,"time_pressure":0} +{"criticism":true,"error":true,"loss":true,"praise":true,"stakes":0.5,"time_pressure":0.445} +{"claim_done":true,"criticism":true,"error":false,"loss":true,"sentiment":"neutral","time_pressure":0} +{"criticism":true,"elapsed_hours":3,"error":true,"loss":true,"task":"question"} +{"loss":true,"praise":true,"sentiment":"positive","task":"code"} +{"claim_done":true,"criticism":true,"loss":true,"sentiment":"positive","stakes":0.12,"time_pressure":1} +{"elapsed_hours":0,"error":true,"praise":true,"sentiment":"neutral","time_pressure":0} +{"elapsed_hours":0.1,"error":true,"sentiment":"positive","task":"chat","time_pressure":1} +{"claim_done":true,"criticism":true,"error":true,"praise":true,"sentiment":"negative"} +{"criticism":true,"error":true,"loss":false,"praise":true,"sentiment":"positive","stakes":0.5,"time_pressure":0.27} +{"elapsed_hours":0,"error":true,"praise":true,"sentiment":"negative","stakes":1} +{"claim_done":true,"criticism":true,"loss":true,"praise":true} +{"elapsed_hours":0.1,"error":true,"loss":true,"sentiment":"negative","stakes":0.5} +{"elapsed_hours":0,"loss":true,"praise":false,"sentiment":"positive","task":"chat","time_pressure":0.5} +{"error":true,"loss":true,"time_pressure":1} +{"criticism":true,"elapsed_hours":10,"loss":true,"praise":true,"task":"code","time_pressure":0} +{"elapsed_hours":0,"task":"question","time_pressure":0} +{"elapsed_hours":0.1,"error":false,"loss":true,"sentiment":"positive","time_pressure":0.525} +{"error":true,"loss":true,"praise":true,"sentiment":"positive","task":"ops"} +{"criticism":true,"loss":true,"praise":true,"sentiment":"negative","time_pressure":0} +{"sentiment":"neutral","task":"explain"} +{"elapsed_hours":3,"error":true,"praise":true,"stakes":0} +{"claim_done":true,"criticism":true,"error":true,"praise":true,"sentiment":"neutral","stakes":0.5,"task":"ops"} +{"claim_done":true,"criticism":true,"loss":true,"praise":true,"sentiment":"neutral","task":"code"} +{"criticism":true,"elapsed_hours":10,"loss":true,"sentiment":"positive","stakes":0.5,"time_pressure":0} +{"criticism":true,"elapsed_hours":3,"error":true,"praise":true,"sentiment":"neutral","stakes":0,"task":"question","time_pressure":0.5} +{"elapsed_hours":0,"loss":true,"praise":true,"stakes":1,"task":"chat"} +{"criticism":true,"elapsed_hours":1,"error":true,"loss":true,"praise":true,"task":"chat"} +{"criticism":true,"error":true,"loss":true,"praise":true,"stakes":1,"time_pressure":0.818} +{"claim_done":true,"elapsed_hours":10,"sentiment":"positive","stakes":0,"task":"code"} +{"claim_done":true,"error":true,"task":"chat"} +{"criticism":true,"elapsed_hours":0.5,"sentiment":"neutral","task":"chat","time_pressure":0.5} +{"loss":true,"praise":false,"sentiment":"positive","stakes":0,"time_pressure":1} +{"criticism":true,"elapsed_hours":0.1,"error":true,"praise":false,"stakes":0.5} +{"error":true,"loss":true,"sentiment":"negative","stakes":0.5,"task":"code","time_pressure":0.125} +{"claim_done":true,"criticism":true,"elapsed_hours":0,"praise":true,"stakes":0.5,"task":"ops","time_pressure":0.67} +{"criticism":true,"elapsed_hours":3,"error":true,"sentiment":"negative","stakes":0.5,"task":"code"} +{"criticism":false,"error":true,"praise":true,"stakes":1} +{"criticism":true,"elapsed_hours":3,"error":true,"sentiment":"positive"} +{"loss":true,"praise":true,"sentiment":"neutral","task":"ops","time_pressure":0.5} +{"elapsed_hours":0.1,"loss":true,"praise":true,"task":"code","time_pressure":0.137} +{"elapsed_hours":3,"error":true,"loss":true,"stakes":0.227} +{"claim_done":true,"error":true,"sentiment":"negative","stakes":0.5,"task":"chat"} +{"claim_done":true,"criticism":true,"elapsed_hours":1,"sentiment":"negative","stakes":0,"task":"explain","time_pressure":0.143} +{"criticism":true,"elapsed_hours":0,"error":true,"loss":true,"time_pressure":0} +{"claim_done":true,"criticism":true,"elapsed_hours":0.1,"error":true,"loss":true} +{"claim_done":true,"criticism":true,"elapsed_hours":1,"error":true,"sentiment":"negative","stakes":0.094,"task":"code"} +{"claim_done":true,"criticism":true,"elapsed_hours":10,"error":false,"loss":true,"sentiment":"positive"} +{"loss":true,"sentiment":"neutral","stakes":0.5,"time_pressure":0.5} +{"criticism":true,"error":true,"loss":true,"praise":true,"stakes":0.5,"task":"chat","time_pressure":0} +{"claim_done":true,"elapsed_hours":0.1,"sentiment":"neutral","time_pressure":1} +{"elapsed_hours":0,"praise":true} +{"claim_done":true,"criticism":true,"loss":true,"task":"question"} +{"elapsed_hours":0.5,"error":true,"praise":true,"sentiment":"positive","time_pressure":0.5} +{"claim_done":true,"criticism":true,"error":true,"sentiment":"negative","task":"question","time_pressure":0.666} +{"claim_done":true,"criticism":true,"elapsed_hours":0.5,"error":true,"loss":true,"task":"explain"} +{"error":true,"stakes":0.5,"time_pressure":1} +{"criticism":true,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"negative","time_pressure":0} +{"criticism":true,"elapsed_hours":3,"loss":true,"sentiment":"neutral","time_pressure":1} +{"criticism":true,"loss":false,"sentiment":"neutral","stakes":0.303,"task":"ops"} +{"criticism":true,"error":true,"praise":true,"sentiment":"negative","task":"question"} +{"claim_done":true,"criticism":true,"elapsed_hours":0.1,"error":true,"loss":false,"praise":true,"stakes":0.572,"time_pressure":0.5} +{"criticism":true,"error":true,"praise":true,"stakes":1,"task":"question","time_pressure":0} +{"criticism":true,"error":true,"loss":true,"praise":true,"sentiment":"positive","task":"code","time_pressure":0} +{"criticism":true,"elapsed_hours":0.5,"praise":true,"sentiment":"neutral","stakes":0.051,"task":"explain"} +{"criticism":true,"elapsed_hours":0,"error":false,"loss":true,"sentiment":"negative","stakes":0.5,"time_pressure":0.693} +{"criticism":true,"elapsed_hours":3,"error":true,"loss":true,"stakes":0.5} +{"criticism":true,"loss":true,"sentiment":"neutral"} +{"criticism":true,"error":true,"loss":true,"sentiment":"positive","time_pressure":1} +{"error":true,"praise":true,"sentiment":"positive","stakes":1,"task":"explain","time_pressure":0} +{"claim_done":true,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"positive","stakes":0.5,"time_pressure":0.5} +{"claim_done":true,"sentiment":"negative","stakes":0.804,"task":"question","time_pressure":1} +{"claim_done":true,"criticism":true,"elapsed_hours":10,"loss":true} +{"claim_done":true,"elapsed_hours":0.1,"error":true,"loss":true,"task":"chat"} diff --git a/bench/individuality/fixtures/p0/scripts/ops-engineer-3.jsonl b/bench/individuality/fixtures/p0/scripts/ops-engineer-3.jsonl new file mode 100644 index 0000000..d07de58 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/ops-engineer-3.jsonl @@ -0,0 +1,100 @@ +{"claim_done":true,"elapsed_hours":0,"error":false,"loss":true,"sentiment":"positive","task":"ops","time_pressure":0} +{"elapsed_hours":0,"praise":true,"time_pressure":0} +{"praise":true,"sentiment":"positive","time_pressure":1} +{"elapsed_hours":720,"error":false,"sentiment":"neutral","task":"chat","time_pressure":1} +{"sentiment":"neutral"} +{"claim_done":true,"criticism":true,"elapsed_hours":0,"error":true,"sentiment":"positive"} +{"elapsed_hours":24,"error":false,"loss":true,"praise":true,"sentiment":"positive","task":"chat","time_pressure":0} +{"criticism":true,"elapsed_hours":720,"error":true,"task":"question","time_pressure":0} +{"loss":true,"stakes":1,"task":"ops","time_pressure":0} +{"claim_done":false,"criticism":true,"loss":true,"task":"chat"} +{"sentiment":"negative","stakes":0,"task":"ops"} +{"claim_done":false,"criticism":true,"error":false,"praise":true,"sentiment":"positive","stakes":0} +{"claim_done":true,"criticism":true,"sentiment":"positive","stakes":1} +{"criticism":false,"elapsed_hours":24,"loss":true,"praise":true,"task":"ops","time_pressure":0} +{"loss":true,"praise":false,"sentiment":"neutral","stakes":1,"task":"explain"} +{"claim_done":true,"error":true,"praise":true,"stakes":1,"task":"chat","time_pressure":0} +{"claim_done":true,"elapsed_hours":24,"loss":true,"praise":false,"sentiment":"neutral","task":"chat","time_pressure":1} +{"claim_done":false,"elapsed_hours":0,"error":true,"loss":true,"task":"question","time_pressure":0} +{"error":true,"time_pressure":0} +{"error":true,"loss":true,"task":"ops"} +{"claim_done":true,"praise":true,"stakes":0,"task":"chat"} +{"elapsed_hours":720,"praise":true,"sentiment":"negative","stakes":0,"task":"chat"} +{"claim_done":true,"criticism":false,"elapsed_hours":720,"error":false,"task":"code"} +{"elapsed_hours":0,"loss":true,"sentiment":"positive","stakes":0,"time_pressure":1} +{"error":true,"loss":false,"stakes":0,"task":"chat","time_pressure":0} +{"claim_done":false,"time_pressure":0} +{"elapsed_hours":24,"loss":true,"sentiment":"negative","stakes":0} +{"elapsed_hours":24,"praise":true,"sentiment":"positive","stakes":0,"task":"question"} +{"criticism":false} +{"claim_done":true,"criticism":true,"sentiment":"negative","stakes":1,"task":"code","time_pressure":1} +{"criticism":false,"elapsed_hours":720,"praise":true,"task":"question","time_pressure":0} +{"criticism":true,"loss":false,"praise":true,"sentiment":"negative","task":"code"} +{"criticism":false,"elapsed_hours":0,"sentiment":"neutral","task":"explain","time_pressure":0} +{"elapsed_hours":720,"error":true,"praise":true,"sentiment":"negative","stakes":1,"task":"code","time_pressure":0} +{"claim_done":true,"criticism":true,"elapsed_hours":0,"loss":true,"praise":true,"task":"explain"} +{"claim_done":true,"elapsed_hours":0,"error":false,"sentiment":"neutral","task":"ops"} +{"loss":true,"sentiment":"negative","stakes":0} +{"claim_done":true,"loss":true,"sentiment":"positive","stakes":1} +{"criticism":true,"loss":true,"stakes":0,"task":"code"} +{"elapsed_hours":0,"error":false,"loss":true,"praise":true,"stakes":0} +{"loss":false,"task":"ops"} +{"claim_done":false,"elapsed_hours":720,"loss":true,"sentiment":"negative","stakes":0,"time_pressure":0} +{"elapsed_hours":24,"praise":false,"sentiment":"neutral","stakes":1,"task":"code"} +{"claim_done":true,"sentiment":"positive"} +{"claim_done":true,"elapsed_hours":720,"error":false,"sentiment":"neutral","task":"code"} +{"elapsed_hours":24,"praise":true,"sentiment":"neutral","task":"chat"} +{"criticism":false,"error":false,"praise":true,"sentiment":"positive","time_pressure":1} +{"elapsed_hours":0,"error":true,"loss":true,"praise":true,"sentiment":"positive","stakes":0,"time_pressure":0} +{"elapsed_hours":24,"sentiment":"negative","stakes":1,"task":"question","time_pressure":0} +{"elapsed_hours":24,"loss":true,"sentiment":"positive","stakes":1,"task":"explain"} +{"sentiment":"positive","stakes":0} +{"claim_done":false,"error":true,"loss":false,"time_pressure":0} +{"error":true,"loss":true,"sentiment":"positive","task":"explain","time_pressure":1} +{"claim_done":true,"praise":true,"time_pressure":0} +{"error":true,"stakes":0} +{"claim_done":true,"elapsed_hours":720,"sentiment":"neutral","stakes":1,"time_pressure":1} +{"claim_done":true,"loss":false,"time_pressure":0} +{"claim_done":true,"criticism":true,"loss":true,"time_pressure":1} +{"elapsed_hours":24,"loss":true,"sentiment":"neutral"} +{"error":false,"loss":false,"time_pressure":1} +{"claim_done":true,"criticism":true,"elapsed_hours":720,"loss":true,"praise":true,"sentiment":"neutral","stakes":1,"task":"chat"} +{"loss":true,"praise":true,"sentiment":"positive","stakes":0} +{"claim_done":true,"time_pressure":0} +{"claim_done":true,"criticism":true,"elapsed_hours":720,"sentiment":"negative","stakes":1,"task":"question","time_pressure":0} +{"criticism":true,"elapsed_hours":720,"error":true,"loss":true,"sentiment":"negative","time_pressure":1} +{"stakes":0,"task":"explain"} +{"claim_done":true,"elapsed_hours":720,"sentiment":"neutral","task":"question"} +{"loss":true,"praise":true,"sentiment":"negative","stakes":1,"task":"question","time_pressure":0} +{"criticism":true,"elapsed_hours":24,"loss":false,"task":"chat"} +{"elapsed_hours":0,"loss":true,"praise":true,"stakes":0} +{"criticism":true,"loss":true,"praise":true,"sentiment":"neutral"} +{"elapsed_hours":720,"error":false,"loss":true,"stakes":0} +{"criticism":true,"elapsed_hours":24,"error":true,"loss":true,"sentiment":"positive","task":"chat","time_pressure":0} +{"error":true,"praise":false,"sentiment":"negative","time_pressure":0} +{"claim_done":false,"elapsed_hours":0,"loss":true} +{"elapsed_hours":24,"sentiment":"negative","task":"explain"} +{"claim_done":true,"loss":true,"sentiment":"negative"} +{"criticism":true,"elapsed_hours":720,"sentiment":"positive","stakes":0,"task":"ops"} +{"claim_done":false,"elapsed_hours":24} +{"criticism":false,"praise":true,"sentiment":"positive"} +{} +{"criticism":true,"elapsed_hours":720,"error":true,"task":"chat"} +{"elapsed_hours":0,"sentiment":"negative","stakes":0,"time_pressure":1} +{"claim_done":true,"criticism":true,"elapsed_hours":720,"praise":true,"sentiment":"neutral","stakes":1} +{"claim_done":true,"error":false,"stakes":1} +{"praise":true,"sentiment":"neutral","stakes":1,"task":"code"} +{"error":true,"sentiment":"positive","time_pressure":0} +{"criticism":false,"elapsed_hours":720,"loss":true,"sentiment":"negative","time_pressure":1} +{"elapsed_hours":720,"stakes":0,"task":"explain","time_pressure":1} +{"criticism":true,"elapsed_hours":24,"task":"question"} +{"claim_done":true,"elapsed_hours":720,"loss":true,"praise":true,"stakes":1,"task":"explain"} +{"claim_done":false,"criticism":true,"elapsed_hours":720,"sentiment":"positive"} +{"criticism":false,"error":true,"time_pressure":1} +{"elapsed_hours":0,"error":true,"loss":true,"task":"question"} +{"error":false,"task":"question","time_pressure":0} +{"elapsed_hours":0,"praise":false,"stakes":1,"task":"code"} +{"elapsed_hours":720,"sentiment":"negative","time_pressure":1} +{"elapsed_hours":0,"error":true,"stakes":1} +{"elapsed_hours":0,"error":true,"stakes":1,"time_pressure":0} +{"error":false,"loss":true,"stakes":1,"task":"chat","time_pressure":1} diff --git a/bench/individuality/fixtures/p0/scripts/scout-0.jsonl b/bench/individuality/fixtures/p0/scripts/scout-0.jsonl new file mode 100644 index 0000000..63b14f3 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/scout-0.jsonl @@ -0,0 +1,100 @@ +{"deadline":true,"elapsed_hours":0.1} +{"elapsed_hours":10,"goals":{"check":{"setback":0.229}}} +{} +{"elapsed_hours":0,"goals":{"check":{"win":0},"learn":{"progress":0.581},"rest":{"cue":false}}} +{"elapsed_hours":0} +{"elapsed_hours":0.1,"goals":{"check":{"setback":0.145},"rest":{"cue":true}}} +{"elapsed_hours":10,"goals":{"rest":{"progress":0.166}}} +{"deadline":true} +{"deadline":true,"goals":{"learn":{"progress":0.345},"rest":{"setback":0.578}}} +{"elapsed_hours":0,"goals":{"check":{"win":1}}} +{"deadline":true,"elapsed_hours":3} +{"elapsed_hours":0.5,"goals":{"learn":{"deadline_hours":null},"rest":{"progress":0.608}}} +{"elapsed_hours":10} +{"elapsed_hours":0.1,"goals":{"rest":{"win":0.947}}} +{} +{"elapsed_hours":0} +{"deadline":true,"elapsed_hours":3} +{} +{"goals":{"check":{"novelty":0.285}}} +{"elapsed_hours":1,"goals":{"check":{"deadline_hours":100}}} +{"deadline":true,"elapsed_hours":0.5} +{} +{"elapsed_hours":10} +{"deadline":true,"elapsed_hours":0.5,"goals":{"learn":{"cue":false}}} +{"goals":{"learn":{"novelty":0.171}}} +{} +{"deadline":true,"elapsed_hours":0,"goals":{"check":{"cue":true},"rest":{"progress":0.647}}} +{"goals":{"rest":{"setback":0.958}}} +{"deadline":true,"goals":{"learn":{"progress":0.494}}} +{"elapsed_hours":0,"goals":{"rest":{"progress":0.159}}} +{"deadline":true,"goals":{"rest":{"cue":true}}} +{"elapsed_hours":0.5} +{"elapsed_hours":0.1,"goals":{"check":{"progress":0.279}}} +{} +{} +{"deadline":true,"goals":{"learn":{"cue":true}}} +{"elapsed_hours":10} +{"elapsed_hours":0.1} +{"elapsed_hours":10} +{"elapsed_hours":0.1} +{"deadline":true,"elapsed_hours":10} +{"deadline":true,"elapsed_hours":0} +{"deadline":true} +{"deadline":true,"elapsed_hours":0.1,"goals":{"rest":{"progress":0.595}}} +{"deadline":true,"elapsed_hours":1,"goals":{"check":{"win":1},"learn":{"progress":0.42},"rest":{"progress":0.613}}} +{"elapsed_hours":0.5} +{"elapsed_hours":0.1} +{} +{"deadline":true,"elapsed_hours":0} +{"elapsed_hours":3,"goals":{"learn":{"setback":0.967}}} +{"deadline":true,"elapsed_hours":1,"goals":{"check":{"progress":0.67},"learn":{"win":0}}} +{"goals":{"check":{"progress":0.229},"rest":{"progress":0.34}}} +{"elapsed_hours":3} +{"deadline":true,"goals":{"learn":{"progress":0.609},"rest":{"progress":0.968}}} +{"elapsed_hours":0.5} +{"elapsed_hours":0} +{"elapsed_hours":0.5,"goals":{"rest":{"win":1}}} +{"deadline":false,"elapsed_hours":10} +{"deadline":true,"elapsed_hours":1} +{"deadline":true} +{"elapsed_hours":10,"goals":{"learn":{"cue":true},"rest":{"win":0.5}}} +{"deadline":true,"elapsed_hours":0,"goals":{"check":{"progress":0.025},"rest":{"novelty":0.361}}} +{} +{} +{"elapsed_hours":0} +{} +{"elapsed_hours":10} +{"elapsed_hours":0,"goals":{"learn":{"novelty":true},"rest":{"cue":true}}} +{"goals":{"learn":{"progress":0.623}}} +{"deadline":false,"elapsed_hours":10,"goals":{"check":{"win":0},"learn":{"win":0.52}}} +{"elapsed_hours":0,"goals":{"learn":{"cue":true}}} +{"deadline":true} +{"goals":{"rest":{"win":2}}} +{"deadline":true,"goals":{"check":{"win":1}}} +{"deadline":true,"goals":{"check":{"win":2},"rest":{"win":1.078}}} +{"deadline":true,"elapsed_hours":3} +{"elapsed_hours":0.1,"goals":{"learn":{"cue":true},"rest":{"cue":false}}} +{"deadline":true,"elapsed_hours":0,"goals":{"rest":{"novelty":false}}} +{"deadline":false,"elapsed_hours":3} +{"deadline":true,"elapsed_hours":10,"goals":{"check":{"progress":0.3},"learn":{"progress":0.062}}} +{"elapsed_hours":10,"goals":{"learn":{"win":1}}} +{"elapsed_hours":0.1} +{"elapsed_hours":3} +{"elapsed_hours":0.1,"goals":{"learn":{"deadline_hours":0}}} +{"deadline":true} +{} +{"deadline":true,"elapsed_hours":0.1,"goals":{"check":{"novelty":false},"learn":{"win":2},"rest":{"win":0.5}}} +{"goals":{"rest":{"progress":0.79}}} +{} +{"elapsed_hours":1,"goals":{"rest":{"setback":0.417}}} +{"deadline":true,"elapsed_hours":0,"goals":{"check":{"progress":0.288},"rest":{"setback":0.866}}} +{"elapsed_hours":0.5,"goals":{"check":{"cue":false}}} +{"elapsed_hours":0,"goals":{"learn":{"cue":true},"rest":{"cue":false}}} +{"deadline":true} +{"goals":{"check":{"win":0},"learn":{"cue":true}}} +{"goals":{"check":{"win":0.5}}} +{"goals":{"check":{"win":1}}} +{} +{"deadline":true,"elapsed_hours":0.5,"goals":{"check":{"novelty":0.82},"rest":{"cue":true}}} +{"elapsed_hours":0} diff --git a/bench/individuality/fixtures/p0/scripts/scout-1.jsonl b/bench/individuality/fixtures/p0/scripts/scout-1.jsonl new file mode 100644 index 0000000..1f1e36b --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/scout-1.jsonl @@ -0,0 +1,100 @@ +{"await":true,"control":"pause","elapsed_hours":0,"goals":{"check":{"progress":0.198},"rest":{"win":2}}} +{"control":"resume","elapsed_hours":1,"for":0} +{"cancel":[0],"deadline":false,"goals":{"check":{"novelty":0.9},"learn":{"progress":0.418},"rest":{"win":0.609}},"src":"env"} +{} +{"await":false,"deadline":false,"for":3} +{"cancel":[3],"goals":{"check":{"win":2},"rest":{"progress":0.364}},"senses":{"tempo":31,"tool_latency":{"src":"env:runner","v":7.934}}} +{"elapsed_hours":0,"senses":{"silence":25.74}} +{"deadline":false,"goals":{"learn":{"progress":0.674}},"senses":{"tool_fail":false}} +{"elapsed_hours":10,"senses":{"silence":0.2}} +{"await":true,"elapsed_hours":0.1,"goals":{"check":{"win":1}}} +{"deadline":true,"elapsed_hours":0,"goals":{"check":{"progress":0.781},"rest":{"cue":true}},"src":"clock"} +{"await":true,"for":10} +{"await":true,"deadline":false,"goals":{"learn":{"novelty":false}},"src":"env"} +{"cancel":[11],"control":"resume","elapsed_hours":1,"for":12,"src":"human:a"} +{"cancel":[13],"elapsed_hours":0,"goals":{"rest":{"setback":0.962}},"senses":{"silence":24.31}} +{"deadline":true,"elapsed_hours":0.1} +{"deadline":true,"elapsed_hours":3,"for":14,"goals":{"check":{"novelty":true}}} +{"cancel":[16],"control":"pause","deadline":true,"for":14,"senses":{"tempo":30,"tool_latency":{"src":"env:runner","v":2.471}}} +{"elapsed_hours":0.5,"senses":{"silence":0.21},"src":"clock"} +{"elapsed_hours":1,"for":17,"senses":{"tempo":4,"tool_latency":{"src":"env:runner","v":3.147}},"src":"human:a"} +{"cancel":[16],"control":"resume","elapsed_hours":1,"goals":{"rest":{"win":0.5}}} +{"goals":{"check":{"progress":0.985}}} +{"await":true,"cancel":[17],"control":"pause","senses":{"tempo":24,"tool_latency":{"src":"env:runner","v":0.929}}} +{"elapsed_hours":1} +{"cancel":[21],"control":"pause","elapsed_hours":3,"for":21,"goals":{"check":{"novelty":true},"rest":{"progress":0.512}},"senses":{"tool_fail":false},"src":"self"} +{"control":"pause","elapsed_hours":0,"src":"env"} +{"await":false,"goals":{"check":{"win":0.917},"learn":{"win":1},"rest":{"novelty":true}},"senses":{"tempo":21,"tool_latency":{"src":"env:runner","v":3.695}}} +{"cancel":[26],"elapsed_hours":0.5,"goals":{"check":{"progress":0.956},"learn":{"cue":false}},"senses":{"silence":22.17}} +{"cancel":[25],"for":26,"goals":{"check":{"progress":0.557},"rest":{"cue":true}}} +{"cancel":[25]} +{"for":27} +{"cancel":[28],"control":"resume","elapsed_hours":0,"for":28,"goals":{"rest":{"progress":0.495}},"src":"human:a"} +{"elapsed_hours":3,"for":29,"goals":{"learn":{"win":0.778}},"src":"human:a"} +{"control":"pause","for":31,"goals":{"check":{"progress":0.344}}} +{"for":33} +{"await":true,"elapsed_hours":0.1} +{"await":true,"control":"resume","goals":{"learn":{"progress":0.744},"rest":{"win":1.673}}} +{"cancel":[34],"control":"resume","elapsed_hours":3,"goals":{"check":{"cue":true},"learn":{"progress":0.891}},"src":"human:a"} +{"control":"resume","goals":{"learn":{"setback":0.44},"rest":{"cue":false}},"senses":{"tempo":10,"tool_latency":{"src":"env:runner","v":5.387}}} +{"for":36,"goals":{"check":{"cue":true},"learn":{"cue":true}},"senses":{"tempo":22,"tool_latency":{"src":"env:runner","v":7.109}}} +{"deadline":true,"goals":{"check":{"progress":0.249},"rest":{"setback":0.091}},"src":"env"} +{"elapsed_hours":3,"senses":{"tempo":9,"tool_latency":{"src":"env:runner","v":5.89}}} +{"deadline":true,"elapsed_hours":10} +{"deadline":true,"elapsed_hours":0,"goals":{"check":{"setback":0.523},"learn":{"win":1},"rest":{"deadline_hours":0}},"src":"clock"} +{"await":false,"cancel":[40],"elapsed_hours":3,"for":42} +{"await":false,"elapsed_hours":0,"for":43,"goals":{"check":{"progress":0.247},"rest":{"progress":0.979}},"senses":{"silence":3.87}} +{"await":false,"control":"resume","deadline":true,"elapsed_hours":3,"src":"self"} +{"await":true,"deadline":true,"senses":{"tool_fail":false}} +{"await":true,"elapsed_hours":10,"goals":{"learn":{"progress":0.303},"rest":{"deadline_hours":1}}} +{"goals":{"learn":{"win":2},"rest":{"progress":0.811}}} +{"await":true,"elapsed_hours":0.5,"senses":{"tool_fail":false}} +{"await":true,"cancel":[46],"deadline":true,"for":49} +{"cancel":[47],"elapsed_hours":10,"goals":{"rest":{"deadline_hours":12}}} +{"cancel":[49],"elapsed_hours":3,"for":51,"goals":{"learn":{"win":0}}} +{"goals":{"learn":{"deadline_hours":1},"rest":{"win":0}},"senses":{"tempo":34,"tool_latency":{"src":"env:runner","v":3.744}},"src":"clock"} +{"elapsed_hours":0.5,"for":54,"senses":{"silence":21.65}} +{"await":false,"control":"pause","deadline":false,"elapsed_hours":0.1,"goals":{"check":{"cue":true}}} +{"for":56,"goals":{"learn":{"win":0}},"senses":{"tool_fail":false}} +{"await":true,"deadline":true,"elapsed_hours":0.5,"for":57} +{"control":"resume","elapsed_hours":1,"goals":{"rest":{"win":1.322}}} +{"elapsed_hours":0,"for":59,"goals":{"learn":{"cue":false},"rest":{"progress":0.821}},"src":"human:a"} +{"control":"pause","deadline":true,"goals":{"rest":{"setback":0.168}},"senses":{"silence":23.48},"src":"clock"} +{"elapsed_hours":0.1,"for":61,"senses":{"silence":29.28}} +{"await":false,"cancel":[59],"control":"resume","deadline":true,"elapsed_hours":3,"for":62,"goals":{"learn":{"cue":false},"rest":{"setback":0.83}}} +{"cancel":[62],"elapsed_hours":0,"goals":{"rest":{"setback":0.54}},"senses":{"tempo":36,"tool_latency":{"src":"env:runner","v":5.204}}} +{"control":"pause","for":62} +{"goals":{"check":{"progress":0.336},"learn":{"progress":0.685},"rest":{"progress":0.646}}} +{"await":true,"cancel":[63],"control":"resume","deadline":false,"elapsed_hours":0,"for":66,"goals":{"check":{"win":1.861},"rest":{"deadline_hours":0}},"senses":{"tool_fail":true}} +{"for":65,"goals":{"check":{"novelty":true},"rest":{"progress":0.609}}} +{"await":true,"cancel":[65],"elapsed_hours":3,"goals":{"learn":{"progress":0.086}}} +{"await":false,"control":"pause","elapsed_hours":0.5,"goals":{"check":{"setback":0.91},"learn":{"progress":0.917}}} +{"elapsed_hours":3,"src":"human:a"} +{"await":true,"for":70,"goals":{"check":{"win":2},"learn":{"progress":0.506}}} +{"goals":{"check":{"progress":0.15}}} +{"goals":{"learn":{"win":0}},"senses":{"tool_fail":false},"src":"clock"} +{"deadline":true,"elapsed_hours":0.5,"goals":{"learn":{"progress":0.547}},"senses":{"silence":6.97}} +{"elapsed_hours":10,"goals":{"learn":{"win":0.5}},"src":"human:a"} +{"await":true,"cancel":[76],"control":"pause","elapsed_hours":0.5,"goals":{"learn":{"progress":0.937}}} +{"src":"self"} +{"for":76} +{"deadline":true,"for":79,"src":"clock"} +{"cancel":[76]} +{"control":"pause","deadline":false,"elapsed_hours":3,"senses":{"silence":27.65}} +{"elapsed_hours":0,"for":82,"src":"clock"} +{"deadline":true,"elapsed_hours":0,"for":82} +{"cancel":[81],"elapsed_hours":1,"goals":{"check":{"setback":0.689},"rest":{"progress":0.426}}} +{} +{"cancel":[85],"senses":{"tool_fail":false}} +{"await":true,"elapsed_hours":0.5,"goals":{"rest":{"deadline_hours":null}}} +{"await":true,"deadline":true,"elapsed_hours":3,"goals":{"check":{"setback":0.33},"learn":{"cue":true},"rest":{"setback":0.964}},"senses":{"tempo":26,"tool_latency":{"src":"env:runner","v":7.502}}} +{"elapsed_hours":0,"for":89,"src":"clock"} +{"await":true,"elapsed_hours":1,"for":90,"src":"self"} +{"await":true,"elapsed_hours":0.5,"senses":{"tool_fail":true}} +{"deadline":true,"src":"env"} +{"deadline":true} +{"await":true,"control":"pause","deadline":true,"elapsed_hours":10,"for":94} +{"await":true,"deadline":true,"elapsed_hours":0,"goals":{"learn":{"progress":0.467}},"src":"self"} +{"await":true,"deadline":false,"goals":{"learn":{"win":0.5}}} +{"control":"resume","elapsed_hours":1,"for":96,"senses":{"silence":8.4}} +{"await":true} diff --git a/bench/individuality/fixtures/p0/scripts/scout-2.jsonl b/bench/individuality/fixtures/p0/scripts/scout-2.jsonl new file mode 100644 index 0000000..ec625d6 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/scout-2.jsonl @@ -0,0 +1,100 @@ +{"deadline":true,"goals":{"check":{"deadline_hours":100},"rest":{"win":0.5}}} +{"elapsed_hours":0} +{"deadline":true,"elapsed_hours":0.5} +{"elapsed_hours":0,"goals":{"check":{"win":0.5}}} +{"elapsed_hours":0} +{"goals":{"learn":{"novelty":false}}} +{} +{"elapsed_hours":10} +{"deadline":true,"elapsed_hours":0} +{"deadline":true,"elapsed_hours":0,"goals":{"rest":{"setback":0.174}}} +{"elapsed_hours":0.5} +{"elapsed_hours":3,"goals":{"check":{"setback":0.005},"learn":{"win":1}}} +{"elapsed_hours":0} +{"elapsed_hours":10,"goals":{"check":{"cue":false},"rest":{"setback":0.186}}} +{"deadline":true,"goals":{"learn":{"progress":0.574},"rest":{"novelty":false}}} +{"deadline":true,"elapsed_hours":10} +{"elapsed_hours":3} +{"deadline":true,"elapsed_hours":0} +{} +{"deadline":true} +{"goals":{"learn":{"progress":0.404}}} +{"deadline":true,"goals":{"learn":{"novelty":true}}} +{"deadline":true,"elapsed_hours":0.5} +{"elapsed_hours":10,"goals":{"check":{"deadline_hours":0},"learn":{"setback":0.166}}} +{} +{"goals":{"check":{"novelty":0.222}}} +{"deadline":true,"elapsed_hours":1} +{"deadline":true,"elapsed_hours":1} +{"deadline":true,"elapsed_hours":1,"goals":{"learn":{"win":1}}} +{"elapsed_hours":10,"goals":{"learn":{"progress":0.579}}} +{} +{"elapsed_hours":10,"goals":{"check":{"win":0}}} +{"goals":{"learn":{"setback":0.34},"rest":{"win":1.226}}} +{"deadline":true,"goals":{"rest":{"win":0.5}}} +{"deadline":true,"elapsed_hours":0,"goals":{"rest":{"win":2}}} +{"deadline":true,"elapsed_hours":0.5,"goals":{"check":{"cue":true},"learn":{"win":2}}} +{"deadline":true} +{"deadline":true} +{"elapsed_hours":1,"goals":{"check":{"setback":0.062}}} +{} +{"deadline":true,"elapsed_hours":0.1,"goals":{"check":{"setback":0.345},"rest":{"win":2}}} +{"deadline":true,"elapsed_hours":0.5} +{"goals":{"rest":{"cue":false}}} +{"elapsed_hours":10,"goals":{"learn":{"setback":0.56}}} +{"goals":{"rest":{"novelty":true}}} +{"goals":{"learn":{"progress":0.444},"rest":{"novelty":0.673}}} +{"deadline":true,"elapsed_hours":0,"goals":{"check":{"novelty":false}}} +{} +{"goals":{"learn":{"setback":0.084}}} +{"deadline":true,"goals":{"check":{"progress":0.18},"learn":{"cue":true},"rest":{"deadline_hours":0}}} +{"elapsed_hours":0.5} +{"deadline":true} +{"deadline":true,"elapsed_hours":0.1} +{"elapsed_hours":0} +{"deadline":true,"elapsed_hours":0} +{"deadline":true} +{"deadline":true} +{"deadline":true,"elapsed_hours":3} +{} +{"elapsed_hours":0} +{"elapsed_hours":10,"goals":{"check":{"deadline_hours":30},"learn":{"cue":true},"rest":{"progress":0.185}}} +{"deadline":true,"elapsed_hours":10} +{"deadline":true} +{} +{"elapsed_hours":10,"goals":{"learn":{"progress":0.877},"rest":{"win":0}}} +{"deadline":true,"elapsed_hours":10,"goals":{"check":{"win":0.151},"learn":{"cue":true}}} +{"deadline":true,"elapsed_hours":0.1,"goals":{"check":{"win":2},"rest":{"setback":0.271}}} +{"deadline":true,"goals":{"learn":{"win":0.5}}} +{} +{} +{"elapsed_hours":0} +{"deadline":true,"elapsed_hours":0.5,"goals":{"check":{"setback":0.896}}} +{} +{"elapsed_hours":0} +{"deadline":true,"elapsed_hours":0.5,"goals":{"rest":{"deadline_hours":12}}} +{} +{"deadline":true} +{"deadline":true,"elapsed_hours":10} +{"deadline":true,"elapsed_hours":0.5} +{"deadline":true,"goals":{"learn":{"progress":0.07},"rest":{"setback":0.577}}} +{"deadline":true,"elapsed_hours":10} +{"deadline":true} +{"elapsed_hours":1} +{"elapsed_hours":3} +{"deadline":true,"elapsed_hours":0.1} +{"deadline":true,"elapsed_hours":3,"goals":{"rest":{"setback":0.886}}} +{"deadline":true,"goals":{"check":{"progress":0.148},"learn":{"setback":0.978},"rest":{"win":1.291}}} +{"deadline":true} +{"elapsed_hours":1} +{"deadline":true,"elapsed_hours":1,"goals":{"check":{"cue":true},"learn":{"progress":0.184}}} +{"goals":{"check":{"cue":true},"rest":{"progress":0.452}}} +{"deadline":true,"goals":{"check":{"novelty":0.826},"rest":{"novelty":true}}} +{"goals":{"check":{"progress":0.692},"learn":{"novelty":0.975},"rest":{"progress":0.593}}} +{"elapsed_hours":3,"goals":{"learn":{"progress":0.046}}} +{} +{"deadline":true,"elapsed_hours":0.1,"goals":{"learn":{"cue":true}}} +{"elapsed_hours":0} +{"goals":{"learn":{"deadline_hours":0}}} +{"elapsed_hours":3,"goals":{"check":{"progress":0.842},"rest":{"progress":0.329}}} +{"deadline":true,"elapsed_hours":0.5} diff --git a/bench/individuality/fixtures/p0/scripts/scout-3.jsonl b/bench/individuality/fixtures/p0/scripts/scout-3.jsonl new file mode 100644 index 0000000..682cc6a --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/scout-3.jsonl @@ -0,0 +1,100 @@ +{"deadline":false,"elapsed_hours":0,"goals":{"check":{"progress":0.183}}} +{"elapsed_hours":0,"goals":{"rest":{"progress":0.08}}} +{} +{"goals":{"learn":{"deadline_hours":1}}} +{"elapsed_hours":0} +{} +{"deadline":true,"elapsed_hours":0,"goals":{"check":{"deadline_hours":12},"learn":{"setback":0.686},"rest":{"win":0.5}}} +{"elapsed_hours":0,"goals":{"learn":{"win":1.97},"rest":{"cue":true}}} +{} +{} +{"deadline":false,"elapsed_hours":720,"goals":{"learn":{"progress":0.359},"rest":{"deadline_hours":30}}} +{"deadline":true,"elapsed_hours":720} +{} +{} +{"elapsed_hours":0} +{"elapsed_hours":24,"goals":{"check":{"deadline_hours":1},"learn":{"progress":0.969}}} +{"goals":{"check":{"progress":0.249},"learn":{"progress":0.63},"rest":{"deadline_hours":30}}} +{"deadline":false,"elapsed_hours":0,"goals":{"check":{"deadline_hours":100},"learn":{"win":0.301}}} +{"elapsed_hours":24} +{} +{"deadline":true} +{} +{"elapsed_hours":24,"goals":{"check":{"cue":true},"learn":{"cue":true}}} +{"elapsed_hours":0} +{"deadline":true,"elapsed_hours":0} +{"elapsed_hours":24} +{"elapsed_hours":0} +{"deadline":true,"elapsed_hours":0,"goals":{"rest":{"cue":true}}} +{"elapsed_hours":24,"goals":{"check":{"win":1.975}}} +{"goals":{"check":{"novelty":true},"learn":{"novelty":true}}} +{"deadline":true,"elapsed_hours":720} +{} +{} +{"deadline":true,"elapsed_hours":720} +{"deadline":true,"goals":{"rest":{"win":0}}} +{} +{"elapsed_hours":24,"goals":{"check":{"deadline_hours":1},"learn":{"setback":0.292}}} +{"deadline":true,"goals":{"check":{"progress":0.883}}} +{"elapsed_hours":0,"goals":{"rest":{"setback":0.453}}} +{"elapsed_hours":24,"goals":{"check":{"progress":0.242}}} +{} +{"deadline":false} +{} +{"deadline":true,"elapsed_hours":24,"goals":{"learn":{"cue":false},"rest":{"cue":true}}} +{} +{"deadline":false,"elapsed_hours":24} +{"deadline":true,"elapsed_hours":0} +{"deadline":true,"elapsed_hours":0} +{} +{"elapsed_hours":24} +{"elapsed_hours":0} +{"elapsed_hours":24,"goals":{"learn":{"progress":0.425},"rest":{"cue":true}}} +{"deadline":false,"elapsed_hours":24,"goals":{"check":{"deadline_hours":0},"rest":{"win":0.365}}} +{"elapsed_hours":24,"goals":{"check":{"win":1}}} +{"deadline":true} +{"deadline":true,"goals":{"check":{"win":0.5}}} +{"deadline":true,"elapsed_hours":24} +{"elapsed_hours":24} +{"deadline":true,"elapsed_hours":720} +{"goals":{"rest":{"win":0.5}}} +{"deadline":true,"elapsed_hours":720,"goals":{"learn":{"progress":0.804}}} +{"goals":{"check":{"cue":false}}} +{"elapsed_hours":24,"goals":{"check":{"progress":0.2}}} +{"elapsed_hours":24} +{"elapsed_hours":24} +{"deadline":true,"goals":{"learn":{"cue":false}}} +{"deadline":false,"goals":{"rest":{"setback":0.129}}} +{"deadline":true} +{"elapsed_hours":0} +{"elapsed_hours":0} +{"goals":{"learn":{"progress":0.152},"rest":{"win":1}}} +{"elapsed_hours":720,"goals":{"rest":{"cue":true}}} +{"goals":{"learn":{"setback":0.571}}} +{"elapsed_hours":24} +{"deadline":false} +{"deadline":false,"elapsed_hours":0} +{} +{"goals":{"learn":{"progress":0.049}}} +{"deadline":true,"goals":{"check":{"progress":0.971},"rest":{"progress":0.261}}} +{"goals":{"check":{"novelty":0.892},"learn":{"progress":0.693}}} +{"deadline":true} +{"goals":{"rest":{"progress":0.707}}} +{"deadline":true,"goals":{"check":{"win":1},"learn":{"setback":0.364},"rest":{"progress":0.069}}} +{"elapsed_hours":24} +{"goals":{"check":{"progress":0.768},"learn":{"setback":0.003},"rest":{"setback":0.137}}} +{"elapsed_hours":720,"goals":{"rest":{"progress":0.519}}} +{"elapsed_hours":24,"goals":{"check":{"win":2},"learn":{"win":0.5}}} +{"elapsed_hours":24,"goals":{"check":{"cue":true},"learn":{"cue":false},"rest":{"deadline_hours":1}}} +{} +{"deadline":true} +{"elapsed_hours":0,"goals":{"learn":{"win":0.5}}} +{"elapsed_hours":0} +{"elapsed_hours":720,"goals":{"learn":{"novelty":0.781}}} +{"elapsed_hours":0,"goals":{"rest":{"setback":0.567}}} +{"goals":{"check":{"setback":0.138}}} +{"deadline":true} +{"goals":{"rest":{"setback":0.757}}} +{} +{"deadline":true,"elapsed_hours":24,"goals":{"check":{"novelty":0.169},"rest":{"win":0.5}}} +{} diff --git a/bench/individuality/fixtures/p0/scripts/trader-assistant-0.jsonl b/bench/individuality/fixtures/p0/scripts/trader-assistant-0.jsonl new file mode 100644 index 0000000..c1fb89d --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/trader-assistant-0.jsonl @@ -0,0 +1,100 @@ +{"elapsed_hours":0.5,"sentiment":"negative","time_pressure":0.5} +{"error":true,"sentiment":"positive"} +{"elapsed_hours":0,"loss":true} +{"elapsed_hours":3,"loss":false,"sentiment":"neutral","time_pressure":0.5} +{"criticism":false,"error":true,"sentiment":"positive","stakes":1,"time_pressure":1} +{"elapsed_hours":0.1,"error":false,"loss":true,"praise":true,"sentiment":"negative","stakes":0.5} +{"elapsed_hours":0,"time_pressure":1} +{"criticism":false,"error":true,"stakes":0.6,"time_pressure":1} +{"elapsed_hours":0,"error":false,"loss":true,"sentiment":"positive","time_pressure":0.5} +{"criticism":false,"elapsed_hours":10,"loss":true,"praise":true,"stakes":0.38} +{"elapsed_hours":10,"loss":false,"sentiment":"negative","stakes":1,"time_pressure":0} +{"time_pressure":0.5} +{"criticism":true,"elapsed_hours":3,"error":false,"loss":true,"stakes":1,"time_pressure":0.375} +{"elapsed_hours":3,"error":true,"stakes":0.5} +{"elapsed_hours":0,"sentiment":"negative","stakes":0.5,"time_pressure":1} +{"criticism":false,"elapsed_hours":0.5,"loss":true,"sentiment":"negative"} +{"criticism":true,"elapsed_hours":0.1,"error":true,"loss":false,"stakes":0.028,"time_pressure":0.5} +{"elapsed_hours":1,"praise":true,"sentiment":"neutral","time_pressure":0} +{"elapsed_hours":0.1,"error":true,"stakes":0.5,"time_pressure":1} +{"stakes":0.642} +{"criticism":true,"elapsed_hours":10,"sentiment":"neutral","stakes":1} +{"error":true,"loss":true,"sentiment":"neutral"} +{"elapsed_hours":0.5,"loss":true,"sentiment":"negative","time_pressure":0.5} +{"elapsed_hours":0.5,"loss":true,"sentiment":"positive","stakes":0} +{"elapsed_hours":0,"error":true,"loss":true,"stakes":0.5,"time_pressure":1} +{"praise":false,"sentiment":"negative","time_pressure":1} +{"criticism":true,"elapsed_hours":1,"loss":true,"time_pressure":0.5} +{"criticism":true,"loss":true,"praise":true} +{"elapsed_hours":3,"loss":true,"sentiment":"positive","stakes":0,"time_pressure":0.5} +{"elapsed_hours":1,"sentiment":"neutral","time_pressure":1} +{"elapsed_hours":0,"loss":true,"sentiment":"positive"} +{"criticism":true,"elapsed_hours":3,"error":true,"loss":true,"sentiment":"negative","stakes":0.5,"time_pressure":1} +{"error":false,"loss":true,"time_pressure":0.778} +{"elapsed_hours":0.5,"loss":true,"sentiment":"neutral","stakes":0,"time_pressure":0.5} +{"loss":true,"praise":false,"sentiment":"positive","stakes":0.5,"time_pressure":0.5} +{"praise":true,"time_pressure":1} +{"criticism":false,"elapsed_hours":3,"loss":true,"sentiment":"neutral","time_pressure":0} +{"criticism":true,"elapsed_hours":0.5,"loss":true,"stakes":0} +{"stakes":0.5,"time_pressure":0.5} +{"loss":false,"praise":true} +{"loss":true,"praise":true,"stakes":1} +{"criticism":true,"elapsed_hours":0,"praise":true,"sentiment":"positive","stakes":0.5} +{"time_pressure":0} +{"elapsed_hours":0.1,"error":true,"loss":true,"praise":false} +{"criticism":true,"elapsed_hours":10,"error":true,"sentiment":"negative","stakes":1,"time_pressure":0.5} +{"loss":true,"sentiment":"negative"} +{"loss":true,"time_pressure":0} +{"elapsed_hours":0,"praise":true,"time_pressure":1} +{"criticism":true,"error":true,"loss":true,"sentiment":"negative","stakes":0.5} +{"elapsed_hours":0.5,"sentiment":"negative"} +{"loss":false,"praise":false,"stakes":0.5} +{"elapsed_hours":3,"error":false,"time_pressure":1} +{"elapsed_hours":0.1,"loss":true,"sentiment":"neutral","stakes":1,"time_pressure":0.5} +{"elapsed_hours":0.5,"loss":true} +{"criticism":true,"stakes":0,"time_pressure":0.932} +{"criticism":true,"elapsed_hours":0,"praise":true,"time_pressure":1} +{"elapsed_hours":3,"error":true,"praise":true,"time_pressure":0} +{"error":true,"loss":true,"time_pressure":0.273} +{"elapsed_hours":10,"time_pressure":1} +{"error":false,"stakes":0.5,"time_pressure":0} +{"sentiment":"neutral","stakes":1,"time_pressure":1} +{"criticism":true,"error":true,"loss":true,"praise":true,"sentiment":"positive","stakes":0} +{"loss":true,"stakes":0.5,"time_pressure":0} +{"elapsed_hours":3,"error":true,"sentiment":"neutral","stakes":0.166} +{"criticism":false,"error":true,"loss":true,"sentiment":"neutral","time_pressure":0.086} +{"criticism":true,"praise":true,"sentiment":"neutral","time_pressure":0.701} +{"criticism":false,"praise":false,"sentiment":"neutral","stakes":0.5,"time_pressure":0} +{"criticism":true,"loss":true} +{"criticism":true,"loss":true,"time_pressure":0.161} +{"elapsed_hours":0.1} +{"criticism":false,"error":true,"sentiment":"positive","time_pressure":0} +{"criticism":true,"elapsed_hours":3,"error":true,"loss":true,"praise":true,"stakes":1} +{"elapsed_hours":0,"praise":true,"stakes":0.5,"time_pressure":0.634} +{"loss":false} +{"criticism":true,"sentiment":"neutral","time_pressure":0.5} +{"elapsed_hours":0,"error":true,"loss":false,"praise":true,"sentiment":"neutral","stakes":1} +{"elapsed_hours":0,"error":true,"sentiment":"negative","stakes":0.598} +{"criticism":true,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"positive","time_pressure":0} +{"elapsed_hours":10,"stakes":1,"time_pressure":0.12} +{"criticism":false} +{"criticism":true,"error":true,"stakes":1,"time_pressure":1} +{"loss":true,"praise":true,"sentiment":"negative"} +{"loss":true} +{"elapsed_hours":0.5,"praise":true} +{"elapsed_hours":1,"stakes":0.53,"time_pressure":0.5} +{"criticism":false,"sentiment":"positive","stakes":1,"time_pressure":1} +{"criticism":true,"elapsed_hours":10,"error":true,"sentiment":"negative","stakes":0.5} +{"elapsed_hours":0.1,"error":true,"loss":true,"praise":true,"sentiment":"positive","stakes":0.5} +{"criticism":true,"elapsed_hours":0.1,"error":true,"time_pressure":0.5} +{"error":true,"praise":true,"sentiment":"negative","stakes":0.865,"time_pressure":1} +{"criticism":true,"elapsed_hours":0.5,"sentiment":"positive"} +{"elapsed_hours":0,"praise":true} +{"elapsed_hours":0.1,"praise":true,"stakes":1} +{"elapsed_hours":10,"time_pressure":0} +{"error":false,"loss":true} +{"criticism":false,"elapsed_hours":0,"stakes":1} +{"elapsed_hours":0,"praise":true,"sentiment":"neutral","stakes":0.246,"time_pressure":1} +{"elapsed_hours":0,"error":true,"sentiment":"positive"} +{"criticism":true,"loss":true,"sentiment":"positive"} +{"elapsed_hours":0,"praise":true,"sentiment":"positive","stakes":0.5,"time_pressure":0.5} diff --git a/bench/individuality/fixtures/p0/scripts/trader-assistant-1.jsonl b/bench/individuality/fixtures/p0/scripts/trader-assistant-1.jsonl new file mode 100644 index 0000000..ddedbee --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/trader-assistant-1.jsonl @@ -0,0 +1,100 @@ +{"error":false,"praise":true,"stakes":0} +{"cancel":[0],"criticism":true,"error":false,"for":0,"praise":true} +{"await":false,"stakes":0} +{"cancel":[1],"elapsed_hours":10,"goals":{"fun":{"win":1}},"senses":{"tool_fail":false},"stakes":0.5,"time_pressure":0} +{"await":true,"cancel":[0],"criticism":true,"elapsed_hours":0.5,"for":3,"goals":{"fun":{"win":1}},"loss":true,"sentiment":"positive","src":"self","stakes":1,"time_pressure":0.221} +{"await":true,"cancel":[0],"elapsed_hours":0.1,"for":4,"senses":{"tool_fail":false}} +{"criticism":true,"for":5,"loss":true,"stakes":0.831,"time_pressure":0.5} +{"control":"pause","elapsed_hours":10,"sentiment":"positive","stakes":0,"time_pressure":0.5} +{"control":"resume","elapsed_hours":3,"goals":{"fun":{"win":1}},"loss":true,"sentiment":"negative","stakes":0.5} +{"await":true,"control":"resume","elapsed_hours":0,"for":8,"goals":{"fun":{"win":1}},"senses":{"silence":15.1},"sentiment":"neutral","stakes":1,"time_pressure":0} +{"cancel":[6],"error":true,"src":"env","stakes":0.199,"time_pressure":1} +{"await":true,"control":"resume","criticism":true,"elapsed_hours":0,"for":9,"stakes":0.5,"time_pressure":0} +{"cancel":[11],"control":"pause","criticism":true,"goals":{"fun":{"win":1}},"loss":true,"stakes":1,"time_pressure":0.269} +{"cancel":[8],"control":"resume","criticism":true,"elapsed_hours":0.1,"error":true,"senses":{"tool_fail":false},"sentiment":"positive"} +{"control":"resume","error":true,"loss":true,"sentiment":"positive","stakes":0.95,"time_pressure":0.992} +{"cancel":[14],"goals":{"fun":{"win":1}},"stakes":0.5} +{"control":"pause","criticism":true,"elapsed_hours":3,"loss":true,"stakes":0.5,"time_pressure":0.756} +{"elapsed_hours":0,"loss":false,"praise":true} +{"elapsed_hours":0.5,"praise":true,"sentiment":"positive","src":"self","stakes":0.666} +{"criticism":true,"loss":false,"senses":{"silence":10.9},"sentiment":"positive","stakes":0.794} +{"elapsed_hours":1,"error":true,"goals":{"fun":{"win":1}}} +{"await":true,"control":"pause","for":18,"time_pressure":1} +{"await":true,"control":"resume","criticism":true,"elapsed_hours":0,"loss":true,"senses":{"silence":29.19},"sentiment":"positive","time_pressure":0.5} +{"control":"pause","error":false,"goals":{"fun":{"win":1}},"praise":true,"sentiment":"positive","stakes":0.156} +{"await":true,"error":true,"sentiment":"negative","stakes":0.5,"time_pressure":0.006} +{"await":false,"cancel":[23],"elapsed_hours":0,"senses":{"tempo":8,"tool_latency":{"src":"env:runner","v":6.367}},"sentiment":"positive","src":"env","stakes":0,"time_pressure":1} +{"await":true,"criticism":true,"error":true,"for":24,"senses":{"tool_fail":false},"sentiment":"negative"} +{"criticism":true,"elapsed_hours":0.5,"error":true,"loss":true,"src":"clock","stakes":0.5} +{"criticism":false,"elapsed_hours":0.1,"loss":true,"praise":true,"sentiment":"negative","src":"self","stakes":1} +{"cancel":[25],"error":true,"senses":{"tool_fail":false},"time_pressure":0.5} +{"await":true,"error":true,"sentiment":"neutral","time_pressure":1} +{"cancel":[28],"error":true,"for":28,"praise":true,"sentiment":"neutral","time_pressure":0.537} +{"error":false,"sentiment":"neutral"} +{"elapsed_hours":3,"stakes":1,"time_pressure":0.5} +{"await":false,"criticism":false,"senses":{"tempo":29,"tool_latency":{"src":"env:runner","v":5.083}},"sentiment":"positive"} +{"await":false,"error":true,"loss":true,"sentiment":"negative","src":"self","stakes":0.5,"time_pressure":0.5} +{"await":false,"elapsed_hours":1,"praise":false,"sentiment":"negative","time_pressure":0} +{"await":false,"cancel":[35],"elapsed_hours":3,"for":34,"senses":{"tempo":3,"tool_latency":{"src":"env:runner","v":5.123}},"sentiment":"neutral","src":"human:a","stakes":0.5,"time_pressure":0.892} +{"elapsed_hours":1,"src":"human:a","time_pressure":0.5} +{"await":false,"cancel":[37],"loss":true,"senses":{"tempo":8,"tool_latency":{"src":"env:runner","v":7.472}},"sentiment":"positive","src":"env","time_pressure":0} +{"control":"pause","for":37,"loss":true,"src":"clock"} +{"criticism":true,"elapsed_hours":0,"loss":false,"praise":false,"senses":{"tool_fail":true},"stakes":1,"time_pressure":0.5} +{"await":true,"stakes":0} +{"elapsed_hours":0.1,"sentiment":"negative"} +{"elapsed_hours":0,"sentiment":"neutral","stakes":0,"time_pressure":1} +{"criticism":true,"error":true,"loss":true,"senses":{"tool_fail":false}} +{"await":true,"criticism":false,"elapsed_hours":0,"for":43,"senses":{"tool_fail":false},"sentiment":"neutral","src":"env","stakes":0} +{"await":false,"elapsed_hours":0,"for":45,"goals":{"fun":{"win":1}},"loss":false,"stakes":0,"time_pressure":1} +{"await":true,"control":"pause","error":true,"for":45,"stakes":0} +{"control":"resume","elapsed_hours":1,"loss":false,"sentiment":"neutral","stakes":0.5} +{"await":true,"cancel":[46],"error":true,"goals":{"fun":{"win":1}},"loss":true,"praise":false,"sentiment":"positive","src":"human:a","time_pressure":0.5} +{"await":true,"cancel":[50],"control":"resume","elapsed_hours":1,"for":48,"senses":{"tool_fail":true},"sentiment":"neutral","src":"env","stakes":1} +{"criticism":true,"praise":false,"senses":{"silence":6.74}} +{"await":true,"criticism":true,"elapsed_hours":0.1,"loss":true,"praise":true,"sentiment":"positive","src":"env","stakes":0.096,"time_pressure":0.5} +{"cancel":[52],"criticism":true,"elapsed_hours":1,"loss":true,"stakes":0.009} +{"await":false,"criticism":true,"elapsed_hours":0,"for":54,"goals":{"fun":{"win":1}},"loss":true,"stakes":0.5,"time_pressure":0} +{"await":true,"cancel":[55],"control":"resume","error":true,"senses":{"silence":19.07},"sentiment":"negative"} +{"loss":true} +{"control":"resume","elapsed_hours":10,"sentiment":"negative","stakes":0} +{"cancel":[56],"elapsed_hours":0,"error":true,"praise":false,"senses":{"silence":4.03},"src":"clock","stakes":0.498} +{"elapsed_hours":0,"error":false,"senses":{"tempo":27,"tool_latency":{"src":"env:runner","v":5.965}},"sentiment":"negative","stakes":0.5} +{"await":true,"cancel":[59],"elapsed_hours":0.5,"loss":false,"sentiment":"neutral","time_pressure":0.768} +{"error":true,"praise":true,"sentiment":"positive","stakes":0.5} +{"cancel":[60],"elapsed_hours":0,"error":true,"goals":{"fun":{"win":1}},"senses":{"silence":14.23},"sentiment":"positive","stakes":0,"time_pressure":0.5} +{"cancel":[60],"elapsed_hours":1,"for":63,"stakes":0.595,"time_pressure":0.5} +{"criticism":true,"error":false,"stakes":0.5,"time_pressure":0.856} +{"await":true,"control":"pause","criticism":true,"error":true,"for":64,"sentiment":"negative","stakes":0} +{"cancel":[62],"criticism":true,"elapsed_hours":3,"for":65,"loss":true,"praise":true} +{"cancel":[64],"elapsed_hours":3,"error":false,"goals":{"fun":{"win":1}},"praise":true,"stakes":1,"time_pressure":0} +{"senses":{"silence":0.62},"src":"env"} +{"await":true,"control":"resume","elapsed_hours":3,"src":"clock","time_pressure":0} +{"control":"resume","stakes":0.927} +{"control":"resume","elapsed_hours":1,"praise":false,"stakes":0} +{"await":false,"criticism":false,"error":true,"for":70,"praise":false,"sentiment":"neutral","src":"self"} +{"elapsed_hours":10,"for":73,"senses":{"silence":25.84},"sentiment":"neutral","stakes":1,"time_pressure":1} +{"criticism":true,"elapsed_hours":0.5,"senses":{"silence":11.54},"sentiment":"positive"} +{"cancel":[75],"elapsed_hours":3,"sentiment":"neutral","stakes":0.5,"time_pressure":0.5} +{"control":"resume","for":74,"senses":{"tool_fail":true},"sentiment":"positive","stakes":0.5,"time_pressure":0.688} +{"criticism":true,"elapsed_hours":0,"sentiment":"neutral","src":"self","time_pressure":1} +{"elapsed_hours":10,"for":77,"src":"self","stakes":0.5} +{"await":true,"control":"pause","criticism":true,"for":79,"loss":true,"praise":true} +{"criticism":true,"goals":{"fun":{"win":1}},"loss":true,"src":"self","time_pressure":1} +{"await":false,"control":"resume","elapsed_hours":0,"loss":true,"senses":{"tool_fail":true},"src":"env","time_pressure":1} +{"cancel":[80],"criticism":true,"elapsed_hours":3,"loss":true,"senses":{"tempo":9,"tool_latency":{"src":"env:runner","v":5.519}},"sentiment":"negative","src":"clock"} +{"await":true,"goals":{"fun":{"win":1}},"loss":true,"senses":{"silence":16.5},"sentiment":"neutral","time_pressure":0.151} +{"elapsed_hours":0.5,"error":true,"src":"clock","stakes":0} +{"elapsed_hours":0.1,"error":true,"goals":{"fun":{"win":1}},"loss":true,"sentiment":"neutral","src":"env","time_pressure":0.532} +{"criticism":true,"sentiment":"neutral","stakes":0.94} +{"criticism":true,"elapsed_hours":0,"goals":{"fun":{"win":1}},"sentiment":"positive","src":"env","stakes":0.5} +{"elapsed_hours":0,"for":88,"praise":false,"senses":{"tool_fail":true},"stakes":0.5} +{"criticism":true,"error":true,"loss":false,"senses":{"silence":28.82},"src":"clock","stakes":0.509,"time_pressure":0.665} +{"criticism":false,"elapsed_hours":10,"error":true,"src":"clock"} +{"cancel":[87],"elapsed_hours":0,"error":true,"for":90,"src":"clock","time_pressure":0.345} +{"cancel":[88],"control":"pause","for":92,"loss":true,"sentiment":"negative","src":"self","stakes":0.933,"time_pressure":0.256} +{"elapsed_hours":1,"for":93,"loss":true,"sentiment":"negative","stakes":1} +{"await":false,"control":"resume","error":false,"for":94,"loss":false,"senses":{"silence":19.28},"sentiment":"negative","time_pressure":0.5} +{"control":"pause","error":true,"for":95,"loss":false,"praise":false,"senses":{"tool_fail":true},"sentiment":"neutral","src":"self","stakes":0,"time_pressure":0.381} +{"cancel":[94],"elapsed_hours":10,"stakes":0.038} +{"await":true,"cancel":[97],"control":"resume","criticism":true,"error":true,"loss":true,"src":"self","time_pressure":0} +{"elapsed_hours":0,"praise":true,"time_pressure":0} diff --git a/bench/individuality/fixtures/p0/scripts/trader-assistant-2.jsonl b/bench/individuality/fixtures/p0/scripts/trader-assistant-2.jsonl new file mode 100644 index 0000000..8cefdc4 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/trader-assistant-2.jsonl @@ -0,0 +1,100 @@ +{"time_pressure":1} +{"elapsed_hours":0,"praise":true,"stakes":0,"time_pressure":1} +{"criticism":true,"elapsed_hours":0,"praise":true,"stakes":1} +{"criticism":true,"elapsed_hours":0,"error":true,"loss":true,"praise":true,"sentiment":"negative","stakes":0.5} +{"elapsed_hours":3,"praise":true,"sentiment":"negative"} +{"criticism":true,"elapsed_hours":1,"error":true,"stakes":0,"time_pressure":0.5} +{"error":true,"loss":true,"stakes":0.5} +{"criticism":true,"loss":true,"praise":false,"stakes":0,"time_pressure":0} +{"elapsed_hours":0.5,"error":true,"loss":true,"sentiment":"neutral"} +{"criticism":true,"elapsed_hours":0.1,"error":true,"loss":true,"sentiment":"positive","stakes":0.458} +{"criticism":true,"error":true,"praise":true,"stakes":1} +{"elapsed_hours":0.1,"error":true,"loss":true,"sentiment":"neutral"} +{"criticism":true,"sentiment":"positive"} +{"criticism":true,"error":true,"loss":true,"sentiment":"neutral","time_pressure":0.5} +{"elapsed_hours":0,"error":true,"sentiment":"negative","stakes":0.5,"time_pressure":0} +{"elapsed_hours":1,"error":true,"sentiment":"neutral","time_pressure":0} +{"criticism":true,"loss":true,"praise":true,"sentiment":"neutral","time_pressure":0.5} +{"elapsed_hours":0.5,"error":true,"loss":true,"praise":true,"sentiment":"neutral","stakes":0.5,"time_pressure":1} +{"elapsed_hours":0,"loss":true,"praise":true,"sentiment":"negative"} +{"elapsed_hours":0.5,"stakes":0.5} +{"criticism":true,"error":true,"loss":true} +{"criticism":true,"elapsed_hours":10,"error":false,"sentiment":"positive","time_pressure":0} +{"elapsed_hours":10,"stakes":0} +{"stakes":1,"time_pressure":0.249} +{"criticism":false,"elapsed_hours":3,"sentiment":"neutral","time_pressure":0.5} +{"elapsed_hours":0,"error":true,"loss":true,"praise":true,"sentiment":"positive","time_pressure":0.945} +{"criticism":true,"elapsed_hours":0.5,"loss":true,"praise":true,"sentiment":"neutral","stakes":1,"time_pressure":1} +{"criticism":true,"elapsed_hours":3,"error":true,"praise":true,"sentiment":"positive","stakes":0.334,"time_pressure":0.162} +{"loss":true,"praise":true,"stakes":0,"time_pressure":1} +{"criticism":true,"error":true,"loss":true,"praise":true,"sentiment":"positive","stakes":1} +{"praise":true,"time_pressure":0.185} +{"criticism":true,"elapsed_hours":1,"loss":true,"time_pressure":0.5} +{"criticism":true,"elapsed_hours":0.1,"loss":true,"praise":true,"sentiment":"neutral"} +{"elapsed_hours":0.1,"loss":true,"praise":true,"stakes":0.981,"time_pressure":0.5} +{"elapsed_hours":0,"error":true,"loss":true,"sentiment":"positive","stakes":0} +{"elapsed_hours":0,"error":true,"loss":false,"sentiment":"neutral","stakes":0.25} +{"elapsed_hours":0.5,"error":true,"loss":false,"praise":true,"sentiment":"positive","stakes":0} +{"elapsed_hours":0.5,"error":true,"loss":false,"time_pressure":0.321} +{"sentiment":"neutral"} +{"criticism":true,"elapsed_hours":3,"loss":true,"praise":true,"sentiment":"neutral"} +{"error":true,"loss":true,"praise":true,"time_pressure":0.769} +{"criticism":true,"elapsed_hours":0,"error":true,"praise":true} +{"criticism":true,"error":true,"sentiment":"negative"} +{"elapsed_hours":0.1,"loss":true,"stakes":0.272,"time_pressure":0} +{"praise":true} +{"elapsed_hours":0,"error":true,"loss":true,"sentiment":"neutral","stakes":1} +{"loss":true,"time_pressure":0.907} +{"criticism":true,"elapsed_hours":0.1,"sentiment":"positive","stakes":0} +{"criticism":true,"error":true,"loss":false,"praise":true,"stakes":0.5,"time_pressure":0} +{"elapsed_hours":0.5,"loss":false,"time_pressure":0.5} +{"criticism":true,"elapsed_hours":0.1,"error":true,"praise":true,"sentiment":"neutral","time_pressure":0.235} +{"criticism":true,"praise":true,"stakes":0.3} +{"criticism":true,"error":true,"praise":true,"sentiment":"negative"} +{"criticism":true,"error":false,"loss":false,"praise":true,"sentiment":"negative","stakes":1,"time_pressure":0.664} +{"criticism":true,"elapsed_hours":10,"loss":true,"stakes":0.5} +{"error":false,"loss":false,"praise":true,"sentiment":"positive","stakes":0.5} +{"elapsed_hours":1,"loss":true,"praise":true,"sentiment":"neutral"} +{"elapsed_hours":10,"loss":true,"stakes":0.5} +{"criticism":true,"error":true,"praise":true} +{"elapsed_hours":0.5,"error":true,"loss":true,"praise":true,"sentiment":"negative","stakes":0.5,"time_pressure":0.992} +{"criticism":true,"error":true,"praise":true} +{"error":true,"praise":true,"sentiment":"neutral","stakes":0.487} +{"elapsed_hours":10,"error":true,"praise":true} +{"criticism":true,"error":true,"loss":true,"praise":true,"stakes":1,"time_pressure":0.348} +{"criticism":true,"loss":true,"praise":true,"sentiment":"positive","stakes":1,"time_pressure":0.5} +{"criticism":true,"elapsed_hours":0.1} +{"elapsed_hours":0,"loss":true,"stakes":0.5,"time_pressure":0} +{"elapsed_hours":0,"error":true,"loss":true,"praise":true,"stakes":0.983} +{"criticism":true,"elapsed_hours":0,"error":true,"stakes":0.636} +{"loss":true,"praise":true,"stakes":0.5} +{"criticism":true,"loss":true,"praise":true,"sentiment":"positive","time_pressure":0} +{"elapsed_hours":1,"stakes":1} +{"criticism":true,"elapsed_hours":0,"stakes":0.884} +{"criticism":false,"loss":true,"praise":true,"sentiment":"negative","time_pressure":0} +{"criticism":true,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"negative","time_pressure":0} +{"error":true,"loss":true,"praise":true,"sentiment":"neutral","stakes":1,"time_pressure":0.516} +{"criticism":true,"error":true,"loss":false,"praise":true,"sentiment":"positive"} +{"criticism":false,"elapsed_hours":3,"sentiment":"negative","stakes":0} +{"criticism":true,"sentiment":"negative","time_pressure":1} +{"error":true,"stakes":1,"time_pressure":0.5} +{"criticism":true,"elapsed_hours":0.1,"praise":false,"stakes":1,"time_pressure":1} +{"criticism":true,"elapsed_hours":1,"error":true,"loss":true,"stakes":0,"time_pressure":1} +{"criticism":true,"error":false,"loss":true,"stakes":0,"time_pressure":0} +{"criticism":true,"elapsed_hours":0.1,"error":true,"praise":true,"sentiment":"neutral","stakes":1,"time_pressure":1} +{"elapsed_hours":0,"error":true,"loss":true,"sentiment":"negative","stakes":0,"time_pressure":0} +{"criticism":true,"loss":true,"praise":true,"stakes":0} +{"error":true,"praise":true} +{"criticism":true,"elapsed_hours":0.5,"loss":false,"praise":true,"sentiment":"negative","stakes":0} +{"criticism":true,"elapsed_hours":1,"error":true,"praise":true,"time_pressure":0.5} +{"elapsed_hours":0.1,"loss":true,"stakes":0.5} +{"criticism":true,"elapsed_hours":10,"error":true,"loss":true,"sentiment":"neutral","time_pressure":0.761} +{"elapsed_hours":0.1,"loss":true,"time_pressure":1} +{"elapsed_hours":1,"error":true,"stakes":0,"time_pressure":0.5} +{"criticism":true,"elapsed_hours":0.5,"loss":true,"sentiment":"neutral","stakes":0} +{"criticism":true,"elapsed_hours":0,"error":true,"loss":true,"praise":true,"stakes":0.926} +{"criticism":true,"elapsed_hours":0.1,"praise":false} +{"criticism":true,"error":true,"sentiment":"negative","stakes":0.493} +{"criticism":true,"elapsed_hours":1,"loss":true,"sentiment":"positive","stakes":0.333,"time_pressure":0} +{"criticism":true,"praise":true,"time_pressure":0.765} +{"criticism":false,"elapsed_hours":0,"sentiment":"positive"} diff --git a/bench/individuality/fixtures/p0/scripts/trader-assistant-3.jsonl b/bench/individuality/fixtures/p0/scripts/trader-assistant-3.jsonl new file mode 100644 index 0000000..ae5f086 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/trader-assistant-3.jsonl @@ -0,0 +1,100 @@ +{"sentiment":"positive","stakes":1,"time_pressure":1} +{"criticism":true,"elapsed_hours":720,"sentiment":"neutral","stakes":0,"time_pressure":0} +{"loss":false,"sentiment":"positive","stakes":1} +{"elapsed_hours":720} +{"criticism":true,"elapsed_hours":0,"sentiment":"neutral","stakes":1} +{"elapsed_hours":0,"error":true,"sentiment":"neutral","stakes":1} +{"elapsed_hours":720,"sentiment":"positive"} +{"elapsed_hours":0,"loss":false,"stakes":0,"time_pressure":1} +{"criticism":true,"elapsed_hours":0,"loss":true,"sentiment":"neutral","time_pressure":1} +{"criticism":true,"elapsed_hours":0,"loss":true,"time_pressure":0} +{"elapsed_hours":24,"stakes":0} +{"elapsed_hours":24} +{"elapsed_hours":0,"error":true,"loss":true,"time_pressure":0} +{"criticism":true,"elapsed_hours":24,"loss":true,"praise":true,"sentiment":"neutral","time_pressure":0} +{"elapsed_hours":0,"sentiment":"neutral"} +{"criticism":false,"elapsed_hours":720,"error":true,"praise":false,"stakes":1} +{"criticism":false,"loss":true,"sentiment":"negative"} +{"criticism":false,"elapsed_hours":24,"praise":false,"sentiment":"negative"} +{"loss":true,"time_pressure":1} +{"elapsed_hours":0,"praise":true,"stakes":1} +{"criticism":true,"elapsed_hours":24,"loss":true,"stakes":1} +{"stakes":1,"time_pressure":0} +{"criticism":false,"error":true,"praise":true,"time_pressure":0} +{"criticism":true,"elapsed_hours":720,"error":false,"loss":true} +{"criticism":true,"praise":true,"sentiment":"negative","stakes":1,"time_pressure":0} +{"criticism":true,"elapsed_hours":720,"stakes":0} +{"praise":false,"sentiment":"negative","stakes":0} +{"loss":true,"sentiment":"positive"} +{"error":false} +{"criticism":true,"sentiment":"negative","stakes":1} +{"criticism":true,"elapsed_hours":0,"sentiment":"positive","time_pressure":0} +{"criticism":true,"elapsed_hours":0,"loss":true,"stakes":0,"time_pressure":1} +{"stakes":0,"time_pressure":1} +{"error":true,"loss":true,"time_pressure":1} +{"elapsed_hours":720,"loss":true,"stakes":0,"time_pressure":1} +{"error":false,"praise":false,"sentiment":"negative","time_pressure":0} +{"elapsed_hours":0,"error":true,"stakes":1,"time_pressure":1} +{"stakes":1} +{"praise":true,"sentiment":"neutral","stakes":1,"time_pressure":1} +{"criticism":false,"elapsed_hours":720,"error":true,"sentiment":"neutral","stakes":0} +{"error":true,"loss":true,"time_pressure":1} +{"criticism":true,"error":true,"praise":true,"sentiment":"negative","time_pressure":1} +{"elapsed_hours":0,"error":true,"sentiment":"positive","stakes":0,"time_pressure":1} +{"elapsed_hours":24,"error":false,"sentiment":"negative","time_pressure":0} +{"criticism":false,"error":false,"sentiment":"negative","time_pressure":1} +{"criticism":true,"elapsed_hours":24,"loss":true,"sentiment":"positive","stakes":0,"time_pressure":0} +{"criticism":true,"elapsed_hours":720,"loss":true,"sentiment":"positive","stakes":1,"time_pressure":0} +{"elapsed_hours":720,"loss":true,"praise":true,"sentiment":"neutral","time_pressure":1} +{"elapsed_hours":24,"loss":true,"time_pressure":0} +{"elapsed_hours":720,"loss":true,"stakes":0,"time_pressure":0} +{"error":true,"praise":true,"sentiment":"negative","stakes":1} +{"criticism":true,"elapsed_hours":24} +{"praise":true,"time_pressure":1} +{"elapsed_hours":0,"praise":true,"time_pressure":0} +{"criticism":true,"elapsed_hours":720,"loss":true,"stakes":0,"time_pressure":1} +{"loss":true,"time_pressure":1} +{"praise":true,"time_pressure":0} +{"sentiment":"neutral","stakes":0,"time_pressure":1} +{"loss":true,"sentiment":"positive","stakes":0} +{"elapsed_hours":720,"error":false,"stakes":0} +{"error":true} +{"criticism":false,"loss":true,"praise":false,"sentiment":"negative"} +{"elapsed_hours":0,"praise":false,"sentiment":"negative","time_pressure":0} +{"elapsed_hours":0,"error":false,"loss":true,"stakes":0} +{"criticism":false,"elapsed_hours":24,"loss":false,"sentiment":"positive","stakes":0,"time_pressure":1} +{"criticism":true,"elapsed_hours":0} +{"elapsed_hours":720,"praise":true,"sentiment":"negative","stakes":0,"time_pressure":0} +{"elapsed_hours":0,"sentiment":"positive","stakes":1,"time_pressure":1} +{"elapsed_hours":0,"loss":true,"sentiment":"positive","stakes":0,"time_pressure":1} +{"criticism":true} +{"criticism":true} +{"elapsed_hours":24,"loss":true,"sentiment":"negative"} +{"elapsed_hours":0,"error":false,"praise":true,"sentiment":"neutral","stakes":1} +{"loss":true,"stakes":1,"time_pressure":1} +{"elapsed_hours":720,"error":false,"time_pressure":1} +{"criticism":false,"praise":false,"stakes":1,"time_pressure":1} +{"sentiment":"negative","stakes":0} +{"sentiment":"positive"} +{"elapsed_hours":0,"sentiment":"negative","time_pressure":1} +{"criticism":true,"elapsed_hours":0,"praise":false,"sentiment":"negative"} +{"loss":true,"praise":true,"sentiment":"negative","time_pressure":0} +{"criticism":true,"praise":true,"stakes":1} +{"elapsed_hours":0,"error":false,"loss":false,"praise":true,"stakes":1,"time_pressure":1} +{"criticism":true,"loss":false,"praise":false,"sentiment":"positive"} +{"criticism":false,"elapsed_hours":720,"praise":false,"sentiment":"negative","stakes":0,"time_pressure":0} +{"criticism":false,"elapsed_hours":720,"sentiment":"neutral"} +{"elapsed_hours":720,"loss":false,"praise":true,"stakes":0} +{"criticism":true,"sentiment":"neutral","stakes":1,"time_pressure":0} +{"time_pressure":0} +{"criticism":true,"elapsed_hours":24,"praise":true} +{"criticism":false,"praise":true,"sentiment":"positive"} +{"criticism":false,"loss":true,"stakes":0,"time_pressure":1} +{"sentiment":"positive","stakes":1} +{"criticism":false,"elapsed_hours":720,"loss":true,"stakes":1} +{"criticism":true,"error":true,"praise":true,"time_pressure":1} +{"elapsed_hours":0,"error":true,"sentiment":"negative","stakes":1,"time_pressure":1} +{"elapsed_hours":0,"praise":true,"time_pressure":0} +{"criticism":true,"elapsed_hours":0,"sentiment":"negative"} +{"elapsed_hours":0,"error":true,"sentiment":"negative","time_pressure":1} +{"criticism":true,"elapsed_hours":24,"praise":true,"sentiment":"neutral","stakes":0} diff --git a/bench/individuality/fixtures/p0/scripts/tutor-0.5.0-0.jsonl b/bench/individuality/fixtures/p0/scripts/tutor-0.5.0-0.jsonl new file mode 100644 index 0000000..be4d707 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/tutor-0.5.0-0.jsonl @@ -0,0 +1,100 @@ +{"claim_done":true} +{"confused":true,"loss":true,"sentiment":"neutral","stakes":0.5} +{"claim_done":false,"elapsed_hours":10,"sentiment":"negative"} +{"confused":true,"loss":true,"sentiment":"neutral"} +{"claim_done":false,"confused":true,"elapsed_hours":0.1,"stakes":0.645,"time_pressure":0} +{"claim_done":true,"criticism":true,"elapsed_hours":0.5,"loss":true,"sentiment":"negative"} +{"confused":true} +{"elapsed_hours":0.1,"error":true,"time_pressure":0} +{"criticism":true,"sentiment":"negative"} +{"elapsed_hours":0.1,"loss":true,"praise":true,"stakes":0.5} +{"elapsed_hours":3,"sentiment":"negative","time_pressure":0.5} +{"confused":true,"criticism":true,"sentiment":"neutral","stakes":0.379} +{"elapsed_hours":0,"error":true,"stakes":1,"time_pressure":0} +{"claim_done":true,"confused":false,"criticism":true,"stakes":0} +{"confused":false,"criticism":true,"elapsed_hours":0.5,"error":true,"sentiment":"positive","stakes":0.5} +{"elapsed_hours":0.5,"sentiment":"positive","time_pressure":0} +{"criticism":true,"praise":true,"stakes":0.233,"time_pressure":0.5} +{"confused":true,"loss":true,"sentiment":"negative","time_pressure":0.344} +{"criticism":true,"error":true,"praise":true,"sentiment":"neutral"} +{"confused":true,"praise":true,"stakes":0} +{"claim_done":true,"criticism":true,"stakes":0.045,"time_pressure":0.616} +{"claim_done":false,"confused":true,"error":false,"sentiment":"positive","stakes":0,"time_pressure":1} +{"claim_done":true,"elapsed_hours":0.1,"error":true,"sentiment":"neutral","time_pressure":0.5} +{"claim_done":true,"confused":true,"criticism":true,"sentiment":"neutral","stakes":0} +{"criticism":true,"elapsed_hours":0,"loss":true} +{"confused":false,"praise":true} +{"claim_done":true,"confused":true,"criticism":false,"elapsed_hours":0.5,"praise":false,"sentiment":"negative","stakes":0.135,"time_pressure":1} +{"claim_done":true,"elapsed_hours":10,"praise":false,"stakes":0.5,"time_pressure":1} +{"criticism":true,"elapsed_hours":0,"praise":false,"sentiment":"negative","stakes":0.5} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":10,"stakes":0.5} +{"confused":true,"sentiment":"positive","time_pressure":1} +{"elapsed_hours":0,"praise":false} +{"criticism":true,"elapsed_hours":0,"sentiment":"negative","stakes":0.5} +{"error":true,"praise":true,"time_pressure":0.5} +{"claim_done":true,"elapsed_hours":3,"error":true,"sentiment":"positive","stakes":0} +{"elapsed_hours":0.1,"loss":true,"sentiment":"positive"} +{"claim_done":true,"error":true,"sentiment":"negative","stakes":0.599} +{"elapsed_hours":0,"sentiment":"positive","time_pressure":1} +{"claim_done":false,"error":true,"praise":true,"sentiment":"positive","time_pressure":1} +{"claim_done":true,"elapsed_hours":3,"error":true,"praise":true} +{"confused":false,"elapsed_hours":0.5,"sentiment":"neutral"} +{"criticism":true,"error":true,"praise":true,"sentiment":"negative","time_pressure":1} +{"claim_done":true,"elapsed_hours":0,"sentiment":"neutral","time_pressure":0.044} +{"time_pressure":1} +{"time_pressure":0} +{"praise":false,"stakes":0.103} +{"criticism":true,"loss":true,"sentiment":"positive","stakes":1} +{"criticism":false,"elapsed_hours":0,"praise":true,"sentiment":"positive","stakes":1} +{"confused":true,"error":false,"loss":true,"time_pressure":0.5} +{"sentiment":"negative","stakes":0} +{"elapsed_hours":0.5,"error":true,"loss":true,"praise":true,"sentiment":"negative"} +{"confused":false,"criticism":true,"elapsed_hours":0,"error":true,"loss":true,"stakes":0.884,"time_pressure":0.5} +{"error":true,"loss":false,"praise":false,"stakes":0.562} +{"loss":false} +{"criticism":false,"elapsed_hours":3,"loss":true,"stakes":0,"time_pressure":0.5} +{"claim_done":true,"sentiment":"neutral","stakes":0.5,"time_pressure":0} +{"claim_done":false,"elapsed_hours":3,"sentiment":"neutral"} +{"criticism":true,"time_pressure":0} +{"sentiment":"positive","stakes":0.5} +{"claim_done":false,"confused":true} +{"elapsed_hours":0,"time_pressure":0} +{"claim_done":true,"confused":true,"criticism":false,"elapsed_hours":0.5,"error":true} +{"claim_done":true,"elapsed_hours":0,"sentiment":"neutral"} +{"confused":true,"praise":true,"sentiment":"neutral"} +{"claim_done":true,"confused":false,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"negative","stakes":1} +{"confused":false,"sentiment":"negative"} +{"claim_done":false,"confused":true,"elapsed_hours":10,"sentiment":"negative"} +{"claim_done":true,"elapsed_hours":1,"praise":false,"stakes":0.578,"time_pressure":1} +{"elapsed_hours":0} +{"elapsed_hours":0.1,"stakes":1,"time_pressure":0.1} +{"criticism":false,"error":true,"sentiment":"positive"} +{"confused":true,"elapsed_hours":10,"loss":true,"praise":true,"sentiment":"neutral","stakes":0,"time_pressure":0.524} +{"confused":false,"praise":true,"stakes":0} +{"confused":true,"elapsed_hours":0,"stakes":1,"time_pressure":1} +{"claim_done":true,"criticism":true,"stakes":0.5,"time_pressure":0} +{"loss":true} +{"criticism":true,"time_pressure":0.5} +{"criticism":true,"elapsed_hours":0.5,"loss":true} +{"elapsed_hours":0.1,"error":false,"stakes":0} +{"error":true,"loss":true,"sentiment":"negative"} +{"elapsed_hours":0,"error":true,"stakes":1,"time_pressure":0.5} +{"claim_done":true,"elapsed_hours":0,"error":true,"sentiment":"negative","time_pressure":0.133} +{"criticism":false,"elapsed_hours":0,"sentiment":"neutral","stakes":0} +{"elapsed_hours":10,"sentiment":"positive"} +{"claim_done":true,"criticism":true,"error":true,"praise":true,"stakes":0} +{"elapsed_hours":0,"error":false,"praise":true,"time_pressure":1} +{"confused":false} +{"criticism":true,"error":true,"stakes":1,"time_pressure":0.47} +{"claim_done":true,"confused":true,"loss":false,"praise":true,"sentiment":"negative","time_pressure":0.5} +{"criticism":true,"loss":true,"praise":true,"sentiment":"positive","stakes":0.5} +{"criticism":true,"stakes":1} +{"elapsed_hours":0.5,"error":true} +{"confused":true,"elapsed_hours":3,"stakes":0.33} +{"claim_done":true,"confused":true,"criticism":false,"elapsed_hours":0,"loss":false,"praise":true} +{"claim_done":true,"error":true,"praise":true,"time_pressure":0.352} +{"criticism":true,"elapsed_hours":0.1,"error":true,"loss":true,"sentiment":"positive"} +{"claim_done":true,"confused":true,"error":true,"praise":true,"sentiment":"negative","stakes":0.724} +{"claim_done":false,"elapsed_hours":0,"stakes":0.5,"time_pressure":0} +{"criticism":true,"loss":true,"stakes":0,"time_pressure":1} +{"claim_done":true,"confused":true,"loss":true,"sentiment":"neutral"} diff --git a/bench/individuality/fixtures/p0/scripts/tutor-0.5.0-1.jsonl b/bench/individuality/fixtures/p0/scripts/tutor-0.5.0-1.jsonl new file mode 100644 index 0000000..e5f2f8e --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/tutor-0.5.0-1.jsonl @@ -0,0 +1,100 @@ +{"claim_done":false,"elapsed_hours":10,"praise":true,"sentiment":"negative","stakes":0.112,"time_pressure":1} +{"cancel":[0],"control":"pause","elapsed_hours":3,"error":true,"goals":{"fun":{"win":1}},"sentiment":"neutral","src":"human:a"} +{"claim_done":true,"confused":false,"control":"pause","elapsed_hours":0,"for":0,"goals":{"fun":{"win":1}},"senses":{"tempo":12,"tool_latency":{"src":"env:runner","v":4}},"stakes":0,"time_pressure":0} +{"claim_done":true,"praise":false,"sentiment":"negative","stakes":0.5,"time_pressure":0} +{"cancel":[2],"control":"pause","error":true,"praise":true,"senses":{"tempo":19,"tool_latency":{"src":"env:runner","v":3.489}},"stakes":0} +{"await":false,"cancel":[4],"claim_done":true,"sentiment":"negative","stakes":0.5} +{"cancel":[4],"claim_done":true,"confused":false,"criticism":true,"sentiment":"positive","src":"human:a","time_pressure":0.5} +{"cancel":[3],"confused":true,"control":"pause","loss":true,"src":"env","time_pressure":0.5} +{"confused":false,"error":true,"loss":true,"praise":true,"senses":{"silence":21.61},"sentiment":"neutral","stakes":0.5,"time_pressure":0} +{"await":true,"claim_done":true,"loss":true,"senses":{"tempo":8,"tool_latency":{"src":"env:runner","v":3.345}},"sentiment":"neutral","time_pressure":0.5} +{"control":"resume","elapsed_hours":0,"error":true,"goals":{"fun":{"win":1}},"praise":false,"stakes":0.5,"time_pressure":0.5} +{"await":false,"elapsed_hours":0.5,"error":true,"for":9,"loss":false,"praise":true,"time_pressure":0.943} +{"cancel":[8],"criticism":false,"elapsed_hours":0,"loss":true,"praise":true} +{"claim_done":true,"criticism":true,"loss":false,"praise":true,"senses":{"silence":23.77},"src":"self","stakes":0.817} +{"await":true,"confused":true,"control":"pause","elapsed_hours":0,"for":12,"sentiment":"negative","stakes":1} +{"await":true,"claim_done":true,"elapsed_hours":1,"praise":true,"senses":{"silence":23.16},"sentiment":"neutral","stakes":0.69} +{"goals":{"fun":{"win":1}},"loss":true,"praise":true,"sentiment":"positive","stakes":0} +{"criticism":false,"for":14,"senses":{"tool_fail":true},"src":"human:a","stakes":0.5,"time_pressure":1} +{"claim_done":true,"criticism":false,"elapsed_hours":3,"praise":true,"sentiment":"positive","stakes":1} +{"await":true,"cancel":[18],"elapsed_hours":0,"goals":{"fun":{"win":1}},"loss":true,"time_pressure":1} +{"await":true,"control":"pause","criticism":true,"elapsed_hours":0,"sentiment":"neutral","stakes":0} +{"confused":false,"elapsed_hours":0,"src":"env","time_pressure":0} +{"cancel":[17],"elapsed_hours":1,"goals":{"fun":{"win":1}},"praise":true,"src":"self","stakes":0} +{"await":true,"confused":true,"error":true,"senses":{"tool_fail":true},"sentiment":"negative"} +{"await":true,"criticism":true,"error":false,"for":23,"sentiment":"negative","time_pressure":0} +{"cancel":[23],"error":false,"for":24,"goals":{"fun":{"win":1}},"praise":true,"stakes":1,"time_pressure":0.5} +{"await":false,"cancel":[25],"confused":false,"elapsed_hours":10,"for":25,"goals":{"fun":{"win":1}},"sentiment":"neutral","time_pressure":0} +{"claim_done":true,"confused":true,"elapsed_hours":0.5,"for":25,"sentiment":"negative","src":"env"} +{"cancel":[23],"confused":false,"control":"resume","criticism":true,"elapsed_hours":0,"error":false,"src":"env","stakes":0,"time_pressure":1} +{"confused":true,"elapsed_hours":0,"goals":{"fun":{"win":1}},"sentiment":"positive","stakes":0} +{"await":true,"cancel":[26],"elapsed_hours":1,"senses":{"tool_fail":true},"sentiment":"negative","stakes":1} +{"elapsed_hours":1,"error":true,"for":28,"loss":true,"senses":{"silence":6.79},"src":"human:a"} +{"control":"resume","elapsed_hours":0.5,"error":true,"for":30,"senses":{"tool_fail":false},"src":"self","stakes":0.398} +{"control":"resume","praise":false,"src":"self","stakes":0.902} +{"claim_done":true,"control":"pause","criticism":true,"error":false,"praise":false,"stakes":1} +{"await":true,"claim_done":true,"elapsed_hours":0,"for":33,"praise":true,"sentiment":"neutral","stakes":1,"time_pressure":0.5} +{"await":true,"cancel":[34],"claim_done":false,"control":"resume","elapsed_hours":0,"goals":{"fun":{"win":1}}} +{"claim_done":true,"confused":true,"elapsed_hours":1,"praise":true,"time_pressure":0} +{"cancel":[34],"criticism":false,"sentiment":"negative","stakes":0.5,"time_pressure":0.5} +{"await":true,"cancel":[35],"criticism":true,"for":38,"loss":true,"praise":true,"src":"self","stakes":0.345} +{"await":false,"confused":false,"criticism":true,"elapsed_hours":10,"for":38,"time_pressure":0.5} +{"await":true,"cancel":[38],"claim_done":true,"confused":true,"control":"pause","elapsed_hours":0,"error":true,"for":38,"goals":{"fun":{"win":1}},"loss":true,"praise":true,"senses":{"silence":7.64},"src":"human:a"} +{"error":false,"sentiment":"neutral","src":"env","stakes":0.817,"time_pressure":0.323} +{"control":"pause","loss":true,"praise":true,"senses":{"tempo":35,"tool_latency":{"src":"env:runner","v":6.156}},"stakes":0.514,"time_pressure":0} +{"criticism":true,"loss":true,"senses":{"tempo":38,"tool_latency":{"src":"env:runner","v":1.024}}} +{"claim_done":true,"confused":false,"criticism":false,"elapsed_hours":0,"praise":false,"senses":{"tempo":12,"tool_latency":{"src":"env:runner","v":6.877}},"sentiment":"neutral","src":"env","stakes":0.287} +{"loss":true,"praise":true,"src":"env","stakes":0.5,"time_pressure":0.032} +{"confused":true,"error":false,"for":44,"goals":{"fun":{"win":1}},"senses":{"silence":14.85}} +{"cancel":[47],"for":47,"loss":false,"stakes":0.844,"time_pressure":0.5} +{"await":true,"cancel":[44],"error":true,"goals":{"fun":{"win":1}},"src":"env","stakes":0,"time_pressure":0.472} +{"cancel":[46],"claim_done":true,"elapsed_hours":1,"error":true,"for":48,"loss":true,"stakes":0.595,"time_pressure":0.5} +{"claim_done":true,"confused":false,"criticism":true,"elapsed_hours":3,"for":48,"praise":true,"sentiment":"positive"} +{"await":true,"claim_done":true,"sentiment":"negative","src":"human:a"} +{"await":true,"cancel":[52],"confused":true,"criticism":true,"elapsed_hours":1,"error":true,"praise":true,"senses":{"tempo":16,"tool_latency":{"src":"env:runner","v":1.529}},"sentiment":"negative","src":"env","time_pressure":0.5} +{"cancel":[52],"claim_done":true,"for":51,"goals":{"fun":{"win":1}},"senses":{"tool_fail":false},"sentiment":"negative","src":"env","stakes":0} +{"confused":true,"criticism":true,"elapsed_hours":0.5,"for":54,"sentiment":"neutral","stakes":0,"time_pressure":0.422} +{"elapsed_hours":1,"error":true,"loss":false,"sentiment":"negative","src":"clock"} +{"cancel":[55],"confused":false,"for":54,"senses":{"tool_fail":false},"sentiment":"positive","time_pressure":0.939} +{"elapsed_hours":1,"sentiment":"neutral"} +{"await":true,"claim_done":true,"control":"pause","criticism":true,"elapsed_hours":1,"loss":false,"praise":false,"senses":{"tool_fail":true},"sentiment":"neutral","src":"env"} +{"claim_done":false,"criticism":true,"elapsed_hours":10,"sentiment":"neutral","src":"human:a","time_pressure":0.4} +{"cancel":[59],"claim_done":true,"elapsed_hours":3,"loss":true,"praise":true,"senses":{"tool_fail":true},"sentiment":"positive","time_pressure":1} +{"confused":false,"control":"pause","criticism":true,"elapsed_hours":0.1,"error":true,"goals":{"fun":{"win":1}},"praise":true,"sentiment":"positive","time_pressure":0.697} +{"control":"resume","elapsed_hours":1,"error":false,"for":60,"loss":true,"src":"env","time_pressure":0.5} +{"cancel":[62],"elapsed_hours":0.1,"error":true,"senses":{"silence":29.58},"sentiment":"positive","src":"self","stakes":0} +{"confused":true,"criticism":false,"elapsed_hours":0.1,"praise":true} +{"cancel":[63],"confused":true,"criticism":true,"sentiment":"neutral","src":"env","stakes":0.618,"time_pressure":1} +{"cancel":[63],"claim_done":true,"elapsed_hours":1,"praise":true,"time_pressure":1} +{"cancel":[64],"confused":false,"elapsed_hours":0.1,"goals":{"fun":{"win":1}},"src":"human:a"} +{"cancel":[65],"control":"pause","elapsed_hours":10,"error":true,"for":68,"time_pressure":0.5} +{"cancel":[69],"confused":true,"elapsed_hours":1,"error":false,"goals":{"fun":{"win":1}},"sentiment":"negative","stakes":0,"time_pressure":0.685} +{"cancel":[69],"claim_done":true,"elapsed_hours":0,"error":false,"loss":true,"src":"env","stakes":0,"time_pressure":1} +{"claim_done":false,"elapsed_hours":0,"for":71,"praise":true} +{"claim_done":true,"confused":true,"elapsed_hours":1,"for":72,"sentiment":"neutral","stakes":0,"time_pressure":0} +{"criticism":false,"elapsed_hours":1,"sentiment":"positive","stakes":0.5} +{"await":true,"elapsed_hours":0,"loss":true,"praise":true,"time_pressure":0.5} +{"elapsed_hours":0,"error":true,"loss":false,"sentiment":"neutral","src":"clock"} +{"await":false,"elapsed_hours":10,"praise":true,"src":"env","stakes":0.81,"time_pressure":1} +{"control":"resume","error":true,"senses":{"tool_fail":false},"stakes":0.58,"time_pressure":1} +{"control":"resume","criticism":true,"elapsed_hours":0.5,"error":true,"senses":{"tempo":1,"tool_latency":{"src":"env:runner","v":0.697}},"sentiment":"neutral","src":"self","stakes":1,"time_pressure":0.5} +{"confused":true,"criticism":true,"goals":{"fun":{"win":1}},"senses":{"tempo":6,"tool_latency":{"src":"env:runner","v":3.547}},"sentiment":"positive"} +{"criticism":false,"error":false,"goals":{"fun":{"win":1}},"loss":false,"praise":false,"senses":{"tool_fail":false},"time_pressure":1} +{"await":true,"claim_done":true,"criticism":true,"error":true,"goals":{"fun":{"win":1}},"senses":{"tempo":24,"tool_latency":{"src":"env:runner","v":3.759}},"sentiment":"positive","time_pressure":0} +{"elapsed_hours":0,"error":false,"goals":{"fun":{"win":1}},"praise":true,"stakes":0.5,"time_pressure":1} +{"cancel":[81],"claim_done":true,"for":82,"loss":true,"senses":{"silence":26.09},"sentiment":"negative","stakes":0,"time_pressure":1} +{"await":false,"confused":true,"control":"pause","elapsed_hours":10,"for":83,"praise":true,"senses":{"tool_fail":false},"stakes":0.5,"time_pressure":0.035} +{"cancel":[83],"elapsed_hours":3,"for":83,"praise":true,"senses":{"silence":15.31},"src":"self"} +{"claim_done":true,"confused":true,"error":true,"sentiment":"positive","src":"human:a"} +{"claim_done":false,"confused":true,"criticism":true,"senses":{"tool_fail":true},"stakes":0,"time_pressure":0.697} +{"await":true,"error":false,"sentiment":"positive","stakes":0.5} +{"praise":false,"sentiment":"neutral","src":"env"} +{"await":false,"claim_done":false,"confused":false,"error":true,"sentiment":"negative","stakes":0.5} +{"claim_done":true,"control":"resume","criticism":true,"elapsed_hours":0.5,"praise":true,"time_pressure":0.5} +{"claim_done":true,"for":90,"stakes":0,"time_pressure":0} +{"cancel":[91],"claim_done":true,"confused":true,"elapsed_hours":3,"for":93,"sentiment":"neutral","stakes":0,"time_pressure":0} +{"cancel":[94],"control":"pause","sentiment":"positive","stakes":1,"time_pressure":1} +{"control":"pause","elapsed_hours":3,"error":true,"sentiment":"neutral","time_pressure":0.5} +{"claim_done":true,"confused":true,"error":true,"src":"env","time_pressure":1} +{"await":true,"claim_done":true,"criticism":true,"elapsed_hours":0.1,"for":95,"goals":{"fun":{"win":1}},"praise":false,"src":"clock","stakes":1} +{"await":true,"confused":true,"control":"resume","criticism":true,"error":true,"for":97,"loss":true,"praise":true,"src":"self","time_pressure":0.524} diff --git a/bench/individuality/fixtures/p0/scripts/tutor-0.5.0-2.jsonl b/bench/individuality/fixtures/p0/scripts/tutor-0.5.0-2.jsonl new file mode 100644 index 0000000..057aade --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/tutor-0.5.0-2.jsonl @@ -0,0 +1,100 @@ +{"claim_done":true,"criticism":true,"error":true,"time_pressure":1} +{"claim_done":true,"criticism":true,"elapsed_hours":10,"error":true,"sentiment":"neutral"} +{"error":true,"sentiment":"positive","time_pressure":0.5} +{"elapsed_hours":0,"error":false,"loss":true,"praise":true} +{"claim_done":true,"confused":true,"elapsed_hours":0,"error":false,"loss":true,"sentiment":"neutral","time_pressure":0} +{"claim_done":true,"criticism":true,"elapsed_hours":0,"loss":true,"praise":false,"stakes":0} +{"criticism":true,"elapsed_hours":0,"loss":false,"praise":true,"sentiment":"negative"} +{"claim_done":true,"criticism":true,"elapsed_hours":0.5,"error":true,"loss":true,"praise":true,"stakes":1} +{"claim_done":false,"error":true,"loss":false} +{"claim_done":true,"confused":true,"error":true,"loss":true} +{"confused":true,"criticism":true,"error":true,"sentiment":"neutral"} +{"claim_done":true,"elapsed_hours":0} +{"claim_done":true,"confused":true,"elapsed_hours":0,"sentiment":"neutral","stakes":0.5,"time_pressure":0.5} +{"claim_done":true,"confused":true,"praise":true} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":0.1,"error":true,"time_pressure":1} +{"claim_done":true,"confused":true,"sentiment":"positive","stakes":0} +{"confused":true,"elapsed_hours":0,"praise":true,"time_pressure":0.5} +{"claim_done":true,"criticism":true,"elapsed_hours":0.5,"praise":true,"sentiment":"positive","stakes":0.194,"time_pressure":0} +{"confused":true,"loss":true,"praise":true} +{"claim_done":true,"error":true,"loss":true,"praise":true} +{"claim_done":true,"error":true,"stakes":1} +{"claim_done":true,"elapsed_hours":1,"error":true,"praise":true,"sentiment":"neutral","stakes":0} +{"claim_done":true,"praise":true,"stakes":0.07,"time_pressure":1} +{"claim_done":true,"criticism":true,"elapsed_hours":0.1,"error":true,"praise":true,"sentiment":"positive","stakes":0,"time_pressure":0.261} +{"claim_done":true,"elapsed_hours":1,"loss":true,"time_pressure":1} +{"criticism":true,"elapsed_hours":0,"error":true,"loss":true,"praise":true,"sentiment":"negative","stakes":0} +{"criticism":false,"elapsed_hours":3} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":10,"loss":true,"praise":true,"sentiment":"positive","stakes":1,"time_pressure":0.5} +{"claim_done":true,"elapsed_hours":10} +{"confused":true,"praise":true} +{"criticism":true,"elapsed_hours":0,"error":false,"loss":true,"stakes":0.5,"time_pressure":0.5} +{"claim_done":true,"confused":true,"criticism":true,"error":true,"loss":true,"sentiment":"neutral","stakes":0.919,"time_pressure":0.882} +{"confused":true,"error":true} +{"claim_done":true,"elapsed_hours":0.5,"loss":true,"praise":true,"sentiment":"negative","stakes":1,"time_pressure":0.5} +{"claim_done":true,"confused":true,"elapsed_hours":10,"error":true,"loss":true,"sentiment":"positive"} +{"criticism":true,"error":true,"loss":true,"praise":true,"stakes":0.11} +{"claim_done":true,"criticism":true,"error":true,"praise":true,"time_pressure":0.587} +{"elapsed_hours":0,"error":false,"praise":false,"sentiment":"negative"} +{"claim_done":true,"confused":true,"criticism":false,"elapsed_hours":0,"loss":false,"praise":true,"sentiment":"neutral"} +{"claim_done":true,"confused":true,"error":false,"praise":false,"sentiment":"negative","stakes":1,"time_pressure":1} +{"claim_done":true,"confused":true,"error":true,"praise":true,"stakes":0.5} +{"claim_done":true,"elapsed_hours":0.5,"loss":true,"sentiment":"neutral","stakes":0.851} +{"claim_done":true,"error":true,"praise":true} +{"claim_done":false,"confused":true,"error":false,"loss":true,"praise":true,"time_pressure":1} +{"claim_done":true,"elapsed_hours":0,"praise":true,"sentiment":"negative"} +{"claim_done":true,"confused":true,"elapsed_hours":10,"loss":true,"praise":true,"sentiment":"negative"} +{"elapsed_hours":0,"loss":true,"praise":true,"sentiment":"negative","stakes":0} +{"claim_done":true,"criticism":true,"elapsed_hours":3,"sentiment":"positive","stakes":0} +{"confused":true,"error":true,"loss":true,"sentiment":"positive","stakes":0} +{"claim_done":true,"confused":true,"criticism":false,"error":true,"loss":true,"praise":true,"sentiment":"positive","stakes":1,"time_pressure":0.105} +{"confused":true,"error":true,"stakes":1,"time_pressure":0.505} +{"claim_done":false,"confused":true,"criticism":true,"time_pressure":0.43} +{"claim_done":true,"confused":true,"criticism":true,"error":true,"loss":true,"sentiment":"negative","stakes":0.5} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":0,"error":true,"stakes":0.588,"time_pressure":0.163} +{"elapsed_hours":10,"praise":true,"sentiment":"negative"} +{"claim_done":true,"confused":true,"elapsed_hours":3,"error":true,"praise":true,"time_pressure":0.5} +{"confused":true,"error":true,"praise":true,"stakes":1,"time_pressure":1} +{"claim_done":false,"elapsed_hours":0,"loss":true,"sentiment":"neutral","time_pressure":0.458} +{"confused":true,"elapsed_hours":10,"error":true,"loss":true,"praise":false,"sentiment":"neutral"} +{"confused":true,"sentiment":"positive","stakes":0,"time_pressure":0.65} +{"criticism":true,"loss":true,"sentiment":"positive","stakes":0.5} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":0.1,"error":true,"loss":false,"sentiment":"negative"} +{"claim_done":true,"confused":true,"criticism":true,"stakes":1,"time_pressure":0.5} +{"criticism":true,"praise":false} +{"claim_done":false,"confused":true,"elapsed_hours":0.5,"time_pressure":0.5} +{"claim_done":false,"criticism":true,"error":true,"praise":true,"sentiment":"positive","stakes":0.195,"time_pressure":0} +{"claim_done":true,"loss":true,"praise":false,"sentiment":"neutral","stakes":0,"time_pressure":0} +{"claim_done":true,"criticism":true,"elapsed_hours":0.1,"error":false,"loss":true,"time_pressure":1} +{"claim_done":true,"confused":true,"error":true,"loss":true,"sentiment":"neutral","time_pressure":0.5} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":0.1,"error":true,"praise":true,"sentiment":"neutral"} +{"confused":true,"elapsed_hours":10,"loss":true,"praise":true,"sentiment":"positive","time_pressure":0} +{"praise":false,"sentiment":"negative","stakes":1} +{"claim_done":true,"criticism":true,"elapsed_hours":0.1,"error":false,"loss":true,"sentiment":"neutral"} +{"criticism":true,"elapsed_hours":3,"error":true,"praise":true,"sentiment":"negative"} +{"elapsed_hours":0.1,"praise":true} +{"claim_done":true,"criticism":true} +{"claim_done":false,"elapsed_hours":0,"error":true,"loss":true,"praise":false,"stakes":0,"time_pressure":0.5} +{"claim_done":true,"criticism":true,"elapsed_hours":0.1,"error":true,"loss":true,"praise":true,"stakes":0,"time_pressure":1} +{"claim_done":true,"confused":true,"criticism":false,"loss":true,"sentiment":"negative"} +{"claim_done":true,"elapsed_hours":1,"error":true,"stakes":1,"time_pressure":0} +{"criticism":true,"error":true,"praise":false} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":10,"loss":true,"praise":true} +{"elapsed_hours":10,"praise":true,"sentiment":"positive","stakes":1,"time_pressure":1} +{"elapsed_hours":10,"error":true,"loss":false,"praise":true,"time_pressure":0} +{"claim_done":true,"confused":true,"criticism":false,"elapsed_hours":3,"loss":true,"praise":true,"sentiment":"negative","stakes":0.54} +{"claim_done":true,"criticism":true,"elapsed_hours":0.1,"error":true,"loss":true,"praise":true,"time_pressure":0.5} +{"confused":true,"criticism":true,"error":true,"stakes":0.5,"time_pressure":0.5} +{"confused":true,"elapsed_hours":0.5,"praise":true,"stakes":0,"time_pressure":0} +{"claim_done":true,"confused":true,"elapsed_hours":10,"error":true,"loss":true,"stakes":0.771} +{"confused":false,"criticism":true,"error":true,"sentiment":"positive","stakes":0,"time_pressure":0.097} +{"claim_done":true,"praise":true,"stakes":1,"time_pressure":0.5} +{"confused":true,"stakes":0,"time_pressure":0.5} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":3} +{"claim_done":true,"error":true,"praise":true,"sentiment":"negative","stakes":0.607} +{"claim_done":true,"confused":false,"error":true,"loss":true,"sentiment":"neutral"} +{"error":true,"sentiment":"positive","stakes":0.461,"time_pressure":0} +{"confused":true,"error":true,"loss":true,"praise":true,"sentiment":"positive"} +{"confused":true,"elapsed_hours":3,"praise":true,"stakes":1,"time_pressure":1} +{"confused":true,"error":true,"sentiment":"neutral","stakes":0.5,"time_pressure":0} +{"claim_done":true,"criticism":true,"error":false,"loss":true,"praise":true,"stakes":1} diff --git a/bench/individuality/fixtures/p0/scripts/tutor-0.5.0-3.jsonl b/bench/individuality/fixtures/p0/scripts/tutor-0.5.0-3.jsonl new file mode 100644 index 0000000..1e90d75 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/tutor-0.5.0-3.jsonl @@ -0,0 +1,100 @@ +{"claim_done":true,"loss":true,"sentiment":"positive","stakes":0} +{"criticism":true,"elapsed_hours":0,"sentiment":"neutral","time_pressure":0} +{"confused":true,"criticism":false,"elapsed_hours":720,"praise":true,"stakes":0,"time_pressure":0} +{"confused":true,"criticism":true,"loss":false,"praise":true,"sentiment":"neutral","time_pressure":0} +{"error":true,"sentiment":"negative","stakes":0} +{"criticism":true,"elapsed_hours":720,"loss":false,"stakes":1,"time_pressure":1} +{"confused":true,"elapsed_hours":24,"loss":false,"stakes":0} +{"claim_done":true,"criticism":false,"elapsed_hours":24,"loss":true,"praise":true,"stakes":1,"time_pressure":0} +{"confused":true,"elapsed_hours":24,"stakes":1,"time_pressure":0} +{"confused":true,"criticism":false,"elapsed_hours":720,"error":true,"stakes":0,"time_pressure":1} +{"criticism":true,"elapsed_hours":0,"loss":false,"sentiment":"positive","stakes":1} +{"claim_done":true,"confused":false,"elapsed_hours":720,"error":true,"sentiment":"neutral","time_pressure":0} +{"confused":true,"elapsed_hours":720,"error":true,"stakes":0} +{"error":true,"praise":true,"sentiment":"negative","time_pressure":1} +{"claim_done":true,"elapsed_hours":24,"praise":true,"stakes":1,"time_pressure":0} +{"confused":true,"sentiment":"negative","time_pressure":0} +{"loss":true,"praise":false} +{"claim_done":true,"confused":true,"criticism":true,"loss":true,"sentiment":"neutral"} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":24,"sentiment":"positive"} +{"criticism":true,"elapsed_hours":0,"loss":true,"sentiment":"negative","stakes":0} +{"claim_done":true,"confused":true,"elapsed_hours":720,"sentiment":"positive","stakes":0,"time_pressure":0} +{"elapsed_hours":24,"error":false,"praise":true,"stakes":0} +{"elapsed_hours":720,"error":true,"loss":true,"praise":false,"time_pressure":0} +{"criticism":true,"elapsed_hours":720,"error":true,"sentiment":"negative"} +{"criticism":true,"error":true,"time_pressure":1} +{"claim_done":true,"error":true,"praise":true,"sentiment":"positive","stakes":0} +{"elapsed_hours":720} +{"claim_done":false,"confused":false,"elapsed_hours":0,"praise":true,"time_pressure":0} +{"claim_done":true,"criticism":true,"elapsed_hours":0,"stakes":0,"time_pressure":1} +{"elapsed_hours":720,"loss":true,"time_pressure":1} +{"stakes":0} +{"elapsed_hours":24,"time_pressure":1} +{"criticism":true,"elapsed_hours":0,"sentiment":"neutral","stakes":0} +{"claim_done":false,"error":false,"loss":true,"sentiment":"negative"} +{"confused":false,"criticism":true,"elapsed_hours":24,"praise":true,"stakes":1,"time_pressure":1} +{"claim_done":true,"elapsed_hours":0,"loss":false,"time_pressure":0} +{"elapsed_hours":0,"error":false,"praise":true,"time_pressure":1} +{"praise":false,"sentiment":"positive"} +{"elapsed_hours":0,"loss":true,"praise":true,"time_pressure":1} +{"claim_done":false,"confused":false,"elapsed_hours":24,"sentiment":"negative","time_pressure":0} +{"elapsed_hours":0,"sentiment":"negative","stakes":1} +{"elapsed_hours":720} +{"confused":true,"elapsed_hours":720,"praise":true,"sentiment":"positive","time_pressure":1} +{"criticism":true,"sentiment":"positive"} +{"loss":true} +{"criticism":false,"elapsed_hours":24,"praise":true,"stakes":0,"time_pressure":0} +{"claim_done":false,"elapsed_hours":0,"error":true,"stakes":1} +{"criticism":false,"elapsed_hours":0,"loss":true,"sentiment":"neutral"} +{"claim_done":false,"criticism":true,"error":false,"loss":true,"praise":true,"stakes":0,"time_pressure":1} +{"claim_done":true,"confused":true,"elapsed_hours":0,"loss":false,"praise":false,"stakes":0} +{"criticism":false,"error":true,"loss":false,"sentiment":"negative","time_pressure":1} +{"claim_done":false,"confused":false,"error":true,"praise":true,"time_pressure":1} +{"claim_done":true,"criticism":false,"error":true,"loss":true,"stakes":1,"time_pressure":1} +{"claim_done":true,"criticism":false} +{"claim_done":true,"confused":true,"elapsed_hours":720,"praise":true,"sentiment":"neutral","stakes":0,"time_pressure":1} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":24,"error":false} +{"criticism":false,"elapsed_hours":24,"loss":false,"stakes":0,"time_pressure":1} +{"elapsed_hours":24,"praise":true,"sentiment":"negative"} +{"criticism":true,"error":true,"praise":true,"sentiment":"negative"} +{"claim_done":true,"confused":true,"sentiment":"positive","stakes":0,"time_pressure":0} +{"confused":true,"error":true,"loss":false,"stakes":1,"time_pressure":0} +{"confused":true,"elapsed_hours":24,"error":true,"sentiment":"positive","stakes":1,"time_pressure":0} +{"elapsed_hours":24,"loss":false,"sentiment":"negative","stakes":0} +{"confused":false,"error":true,"praise":false,"sentiment":"positive","stakes":1,"time_pressure":1} +{"claim_done":true,"elapsed_hours":24,"error":false,"loss":true,"praise":false,"sentiment":"neutral","stakes":0,"time_pressure":1} +{"claim_done":true,"elapsed_hours":24,"stakes":0,"time_pressure":1} +{"sentiment":"neutral"} +{"loss":true,"sentiment":"positive"} +{"claim_done":true,"elapsed_hours":720,"sentiment":"negative"} +{"elapsed_hours":720,"error":false,"sentiment":"negative"} +{"confused":true,"elapsed_hours":0,"sentiment":"negative","stakes":0} +{"praise":false,"sentiment":"positive","stakes":0} +{"criticism":false,"elapsed_hours":24,"error":true,"praise":false,"stakes":1,"time_pressure":0} +{"claim_done":true,"confused":true,"elapsed_hours":0,"sentiment":"neutral","stakes":0} +{"claim_done":true,"confused":true,"elapsed_hours":720,"error":false,"praise":true,"stakes":1,"time_pressure":1} +{"criticism":true,"elapsed_hours":24,"error":true} +{"elapsed_hours":720,"sentiment":"negative","stakes":0,"time_pressure":1} +{"criticism":true,"error":true,"praise":true,"stakes":1} +{"confused":true,"criticism":true,"loss":true,"sentiment":"negative","stakes":0,"time_pressure":1} +{"criticism":true,"elapsed_hours":720,"error":false,"sentiment":"neutral","stakes":0,"time_pressure":0} +{"claim_done":true,"sentiment":"negative"} +{"claim_done":true,"elapsed_hours":0,"loss":false,"sentiment":"positive","stakes":1,"time_pressure":0} +{"criticism":true,"elapsed_hours":720,"error":true,"loss":true,"time_pressure":0} +{"praise":true,"sentiment":"positive"} +{"error":true,"sentiment":"neutral"} +{"claim_done":true,"confused":false,"criticism":true,"elapsed_hours":24,"praise":false} +{"elapsed_hours":720,"error":true,"sentiment":"negative","stakes":0,"time_pressure":0} +{"elapsed_hours":0,"praise":true,"sentiment":"positive","time_pressure":0} +{"elapsed_hours":24,"error":true,"praise":true,"sentiment":"neutral","stakes":1,"time_pressure":1} +{"elapsed_hours":24,"praise":false,"sentiment":"positive","stakes":0,"time_pressure":1} +{"confused":true,"elapsed_hours":24,"sentiment":"negative"} +{"loss":true,"sentiment":"negative","time_pressure":1} +{"claim_done":true,"confused":true,"criticism":true,"sentiment":"negative","stakes":0,"time_pressure":0} +{"claim_done":false,"confused":false,"criticism":true,"elapsed_hours":0,"praise":true} +{"praise":true} +{"sentiment":"negative","time_pressure":1} +{"loss":true,"sentiment":"negative","time_pressure":1} +{"elapsed_hours":720,"error":false,"stakes":1} +{"criticism":true,"elapsed_hours":720,"sentiment":"neutral","stakes":0} +{"error":true,"sentiment":"neutral","time_pressure":1} diff --git a/bench/individuality/fixtures/p0/scripts/tutor-0.jsonl b/bench/individuality/fixtures/p0/scripts/tutor-0.jsonl new file mode 100644 index 0000000..dc2d4ce --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/tutor-0.jsonl @@ -0,0 +1,100 @@ +{"claim_done":true,"criticism":true,"elapsed_hours":3,"stakes":0.5} +{"confused":true,"criticism":true,"loss":true,"praise":false,"sentiment":"negative","stakes":0,"time_pressure":0.92} +{"claim_done":true,"elapsed_hours":0,"stakes":0.5} +{"criticism":true,"sentiment":"neutral","stakes":1,"time_pressure":0.5} +{"claim_done":true,"criticism":false,"praise":true,"stakes":0.5} +{"confused":false,"error":true,"loss":true,"praise":false,"time_pressure":0.5} +{"praise":true} +{"claim_done":false,"loss":true,"praise":true,"sentiment":"positive"} +{"confused":true,"elapsed_hours":10,"loss":true} +{"time_pressure":0.5} +{} +{"elapsed_hours":1,"error":true,"loss":true,"sentiment":"neutral","stakes":0} +{"elapsed_hours":10,"error":false,"sentiment":"neutral","stakes":1,"time_pressure":0.5} +{"loss":true,"sentiment":"negative","stakes":0} +{"claim_done":true,"elapsed_hours":1,"praise":false,"stakes":0.649,"time_pressure":0} +{"confused":true,"error":false,"loss":true,"praise":true,"stakes":0.5,"time_pressure":1} +{"confused":true,"elapsed_hours":0.1,"loss":false,"stakes":1} +{"claim_done":true,"criticism":true,"elapsed_hours":3,"loss":false,"sentiment":"neutral","time_pressure":0.071} +{"criticism":true,"loss":true,"praise":true,"stakes":1,"time_pressure":0} +{"claim_done":true,"loss":true} +{"confused":true,"praise":false,"sentiment":"negative","stakes":0.5,"time_pressure":0.5} +{"claim_done":false,"elapsed_hours":0,"praise":true,"sentiment":"neutral","stakes":0,"time_pressure":0} +{"confused":true,"elapsed_hours":3,"sentiment":"negative","time_pressure":0.72} +{"elapsed_hours":3,"stakes":0.5,"time_pressure":0.5} +{"error":false,"stakes":1,"time_pressure":0.851} +{"confused":true,"loss":false,"praise":true,"sentiment":"positive","stakes":0} +{"elapsed_hours":0,"error":true,"loss":false,"stakes":0.5,"time_pressure":0.5} +{"elapsed_hours":0.1} +{"criticism":true,"error":true,"time_pressure":0.092} +{"claim_done":true,"elapsed_hours":3} +{"stakes":1,"time_pressure":0.5} +{"confused":false,"criticism":true,"elapsed_hours":0,"loss":true,"praise":true,"stakes":0} +{"confused":true,"criticism":true,"elapsed_hours":0.5,"praise":true,"time_pressure":0.5} +{"criticism":false,"elapsed_hours":3,"loss":false,"praise":true,"sentiment":"positive"} +{"elapsed_hours":0.1,"praise":true,"time_pressure":0.5} +{"confused":true,"elapsed_hours":0,"loss":false,"praise":true,"sentiment":"neutral","stakes":1,"time_pressure":0} +{"confused":true,"criticism":false,"elapsed_hours":3} +{"claim_done":true,"error":true,"sentiment":"positive"} +{"error":true,"praise":true,"sentiment":"neutral","stakes":0,"time_pressure":0.45} +{"criticism":true,"elapsed_hours":0.5} +{"claim_done":true,"criticism":true,"error":true,"stakes":0.5,"time_pressure":0.5} +{"criticism":true,"stakes":0.87,"time_pressure":0.009} +{"criticism":true,"elapsed_hours":0.5,"stakes":0,"time_pressure":0} +{"claim_done":true,"confused":false,"elapsed_hours":3,"loss":true,"sentiment":"positive","time_pressure":1} +{"criticism":true,"error":true,"praise":true} +{"criticism":false,"praise":true} +{"error":true,"sentiment":"positive","stakes":0.327} +{"praise":true,"stakes":0} +{"confused":true,"elapsed_hours":3,"praise":true,"sentiment":"positive","time_pressure":1} +{"claim_done":true} +{"claim_done":true,"error":false,"praise":true,"stakes":1,"time_pressure":0} +{"confused":true,"elapsed_hours":0.5,"praise":true,"sentiment":"negative"} +{} +{"criticism":false,"stakes":0.172,"time_pressure":0} +{"claim_done":true,"elapsed_hours":0,"loss":true,"sentiment":"negative","time_pressure":1} +{"claim_done":true,"criticism":true,"elapsed_hours":10,"error":false,"stakes":0.749} +{"claim_done":false,"confused":false,"criticism":true,"elapsed_hours":3,"sentiment":"neutral"} +{"confused":true,"sentiment":"neutral","stakes":0.5} +{"confused":true,"criticism":true,"praise":true,"time_pressure":0.5} +{"confused":true,"elapsed_hours":0,"loss":false,"sentiment":"negative"} +{"loss":false,"praise":false,"sentiment":"negative","stakes":0.852} +{"confused":false,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"neutral","stakes":1} +{"confused":true,"elapsed_hours":1,"praise":true,"sentiment":"neutral","stakes":0.131} +{"criticism":false,"elapsed_hours":0.1,"praise":true,"sentiment":"positive","stakes":1} +{"claim_done":true,"confused":true,"stakes":1} +{"stakes":0.376,"time_pressure":0.776} +{"elapsed_hours":0.1} +{"claim_done":true,"loss":false,"sentiment":"positive"} +{"claim_done":false,"elapsed_hours":3,"sentiment":"neutral","stakes":0.5} +{"confused":true,"criticism":true} +{"claim_done":true,"confused":true,"elapsed_hours":0.5,"loss":true,"praise":false,"sentiment":"neutral"} +{"elapsed_hours":3,"error":true,"praise":true,"sentiment":"positive","time_pressure":0.5} +{"claim_done":true,"elapsed_hours":0.5,"stakes":0.627} +{"confused":true,"time_pressure":1} +{"claim_done":true,"elapsed_hours":0.5,"loss":true,"sentiment":"negative"} +{"confused":true,"criticism":true,"elapsed_hours":10,"loss":false,"sentiment":"neutral","stakes":0.5} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":0.1,"praise":true} +{"elapsed_hours":1,"loss":true,"sentiment":"positive","stakes":0.5} +{"confused":true,"elapsed_hours":1,"loss":false,"sentiment":"positive","time_pressure":0.5} +{"confused":true,"error":true,"loss":true,"sentiment":"neutral","time_pressure":0.614} +{"elapsed_hours":1,"sentiment":"negative","stakes":1,"time_pressure":0.5} +{"confused":false,"sentiment":"positive","stakes":0,"time_pressure":0.054} +{"claim_done":true,"elapsed_hours":1,"praise":true,"sentiment":"negative","stakes":0,"time_pressure":1} +{"elapsed_hours":1,"loss":true,"sentiment":"positive"} +{"claim_done":true,"confused":true,"criticism":false,"elapsed_hours":0,"sentiment":"negative","time_pressure":0.125} +{"claim_done":true} +{"elapsed_hours":3,"loss":true,"stakes":0.5} +{"claim_done":true,"confused":false,"criticism":true,"elapsed_hours":3,"error":true,"sentiment":"neutral","time_pressure":0.047} +{"confused":true,"error":true,"stakes":1,"time_pressure":0.5} +{} +{"elapsed_hours":0.5,"error":true,"loss":true,"sentiment":"neutral"} +{"criticism":true,"loss":true,"sentiment":"positive","stakes":0,"time_pressure":0.5} +{"elapsed_hours":10,"error":true,"sentiment":"neutral","time_pressure":0} +{"error":false,"time_pressure":0} +{"confused":false,"elapsed_hours":0,"loss":true,"stakes":0} +{"sentiment":"neutral"} +{"praise":true,"sentiment":"positive"} +{"elapsed_hours":0.1,"error":true,"loss":true,"praise":true,"sentiment":"negative"} +{"claim_done":true,"elapsed_hours":3,"loss":true,"stakes":1} +{"confused":true,"loss":true,"time_pressure":0} diff --git a/bench/individuality/fixtures/p0/scripts/tutor-1.jsonl b/bench/individuality/fixtures/p0/scripts/tutor-1.jsonl new file mode 100644 index 0000000..52ef32b --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/tutor-1.jsonl @@ -0,0 +1,100 @@ +{"await":true,"cancel":[0],"criticism":true,"elapsed_hours":0.1,"for":0,"goals":{"fun":{"win":1}},"sentiment":"negative","src":"human:a"} +{"criticism":true,"sentiment":"positive","time_pressure":0.371} +{"await":false,"claim_done":true,"confused":true,"control":"resume","elapsed_hours":3,"goals":{"fun":{"win":1}},"loss":false,"senses":{"silence":2.95},"stakes":0,"time_pressure":1} +{"cancel":[2],"elapsed_hours":1,"error":true,"praise":false,"stakes":1} +{"cancel":[3],"elapsed_hours":0.1,"error":true,"for":1} +{"await":true,"cancel":[0],"claim_done":true,"elapsed_hours":0.1,"for":4,"loss":true,"praise":true,"senses":{"silence":2.75},"stakes":0.712} +{"claim_done":false,"confused":true,"sentiment":"neutral"} +{"error":false,"goals":{"fun":{"win":1}},"sentiment":"positive","time_pressure":0.5} +{"cancel":[3],"criticism":true,"elapsed_hours":0,"error":false,"loss":false} +{"cancel":[4],"claim_done":false,"elapsed_hours":0.1,"goals":{"fun":{"win":1}},"praise":true,"src":"clock","stakes":0.908,"time_pressure":1} +{"await":true,"cancel":[6],"confused":true,"control":"pause","criticism":true,"elapsed_hours":10,"for":8,"goals":{"fun":{"win":1}},"praise":true,"sentiment":"negative","stakes":0.773} +{"confused":true,"elapsed_hours":0,"loss":true,"stakes":0.679} +{"cancel":[7],"claim_done":true,"loss":false,"praise":true,"sentiment":"neutral","stakes":0.5,"time_pressure":0.9} +{"control":"pause","elapsed_hours":0,"for":12,"loss":false,"senses":{"silence":9.49},"src":"human:a"} +{"cancel":[13],"claim_done":false,"confused":true,"elapsed_hours":0.5,"for":12,"loss":true,"time_pressure":0.557} +{"cancel":[11],"confused":true,"criticism":true,"elapsed_hours":0.5,"for":14,"goals":{"fun":{"win":1}},"loss":true,"senses":{"tempo":30,"tool_latency":{"src":"env:runner","v":6.793}}} +{"criticism":true,"elapsed_hours":0} +{"await":true,"confused":true,"elapsed_hours":0.1,"loss":true,"sentiment":"positive","stakes":0,"time_pressure":0.169} +{"cancel":[15],"praise":false,"sentiment":"neutral","src":"clock","stakes":0.558,"time_pressure":0.5} +{"for":17} +{"await":false,"claim_done":true,"confused":false,"criticism":false,"goals":{"fun":{"win":1}},"sentiment":"neutral","src":"self","stakes":0.5,"time_pressure":1} +{"claim_done":true,"criticism":true,"elapsed_hours":10,"sentiment":"positive","stakes":0.539,"time_pressure":0.151} +{"claim_done":true,"confused":true,"control":"resume","error":true,"goals":{"fun":{"win":1}},"loss":false} +{"await":true,"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":0,"sentiment":"positive"} +{"await":true,"cancel":[22],"claim_done":true,"for":21,"loss":false,"src":"self","time_pressure":1} +{"await":true,"cancel":[21],"claim_done":true,"control":"resume","criticism":true,"loss":true,"praise":true,"sentiment":"negative","stakes":0.367,"time_pressure":0.013} +{"cancel":[21],"confused":false,"control":"resume","criticism":false,"elapsed_hours":1,"loss":true,"senses":{"tempo":23,"tool_latency":{"src":"env:runner","v":3.623}},"sentiment":"positive","src":"clock"} +{"control":"pause","elapsed_hours":3,"senses":{"tempo":26,"tool_latency":{"src":"env:runner","v":7.92}},"sentiment":"positive"} +{"loss":true,"src":"clock","time_pressure":0.509} +{"elapsed_hours":1,"loss":true,"time_pressure":0} +{"await":true,"control":"resume","elapsed_hours":0.1,"loss":true,"sentiment":"positive","src":"human:a"} +{"cancel":[26],"claim_done":true,"confused":true,"control":"resume","elapsed_hours":10,"for":29,"senses":{"silence":10.49},"sentiment":"positive","src":"env"} +{"claim_done":true,"control":"pause","praise":true,"sentiment":"neutral","stakes":0.338} +{"elapsed_hours":10,"senses":{"tool_fail":false},"src":"self","stakes":0.663} +{"claim_done":false,"elapsed_hours":0,"error":true,"for":31,"senses":{"tool_fail":true},"stakes":0.5} +{"confused":true,"criticism":false,"elapsed_hours":0,"error":false,"goals":{"fun":{"win":1}},"loss":true,"src":"clock"} +{"await":true,"claim_done":true,"criticism":true,"error":true,"loss":true,"senses":{"tempo":26,"tool_latency":{"src":"env:runner","v":0.037}},"sentiment":"positive","stakes":0} +{"cancel":[33],"goals":{"fun":{"win":1}},"senses":{"tempo":16,"tool_latency":{"src":"env:runner","v":4.057}},"stakes":0.162,"time_pressure":1} +{"cancel":[37],"loss":true,"stakes":1} +{"control":"pause","error":true,"loss":true,"senses":{"silence":4.78},"sentiment":"positive","src":"self","stakes":0.5,"time_pressure":0.453} +{"senses":{"tool_fail":false},"sentiment":"positive"} +{"cancel":[40],"criticism":true,"error":true,"sentiment":"neutral","time_pressure":0} +{"await":false,"claim_done":true,"elapsed_hours":10,"error":true,"goals":{"fun":{"win":1}},"loss":true,"praise":true,"stakes":0.025} +{"await":true,"confused":true,"control":"resume","criticism":true,"elapsed_hours":10,"error":true,"praise":true} +{"control":"pause","criticism":true,"elapsed_hours":0,"error":true} +{"control":"pause","loss":true,"sentiment":"positive","src":"human:a","stakes":0} +{"await":true,"cancel":[44],"claim_done":true,"control":"pause","praise":true,"sentiment":"negative","stakes":1} +{"claim_done":true,"confused":false,"control":"pause","goals":{"fun":{"win":1}},"loss":true,"sentiment":"negative","stakes":1} +{"await":true,"elapsed_hours":0,"praise":true,"sentiment":"negative","stakes":0,"time_pressure":0} +{"claim_done":false,"confused":true,"elapsed_hours":1,"error":true,"praise":false,"senses":{"silence":27.01},"sentiment":"neutral"} +{"cancel":[48],"control":"pause","criticism":true,"elapsed_hours":10,"src":"self"} +{"claim_done":true,"criticism":false,"elapsed_hours":1,"sentiment":"neutral","stakes":0.759} +{"claim_done":true,"elapsed_hours":10,"loss":true,"praise":true} +{"confused":true,"criticism":false,"error":false,"goals":{"fun":{"win":1}},"stakes":0} +{"claim_done":false,"confused":true,"elapsed_hours":1,"praise":false,"src":"human:a","time_pressure":0} +{"confused":true,"criticism":false,"elapsed_hours":0.1,"goals":{"fun":{"win":1}},"loss":true,"senses":{"tempo":38,"tool_latency":{"src":"env:runner","v":7.736}},"sentiment":"neutral","stakes":0.5} +{"cancel":[53],"claim_done":false,"confused":true,"elapsed_hours":0.1,"sentiment":"neutral","stakes":0} +{"elapsed_hours":0.5,"error":true,"praise":true,"stakes":0.5,"time_pressure":0} +{"confused":true,"control":"pause","error":true,"for":56,"praise":true,"senses":{"tool_fail":false},"time_pressure":0.284} +{"await":true,"cancel":[58],"control":"resume","criticism":true,"goals":{"fun":{"win":1}},"sentiment":"negative","time_pressure":0} +{"senses":{"tool_fail":false},"sentiment":"neutral","stakes":0.961} +{"control":"pause","elapsed_hours":10,"stakes":0.5} +{"cancel":[57],"confused":true,"for":61,"praise":true,"senses":{"tool_fail":false}} +{"confused":true,"criticism":true,"elapsed_hours":0.5,"praise":false,"sentiment":"negative"} +{"criticism":true,"elapsed_hours":3,"loss":true,"praise":true,"sentiment":"neutral","src":"env","stakes":0,"time_pressure":0} +{"cancel":[63],"confused":true,"control":"pause","senses":{"tool_fail":false},"src":"self"} +{"claim_done":true,"elapsed_hours":0,"error":false,"praise":true,"sentiment":"neutral"} +{"await":true,"confused":true,"praise":true,"senses":{"silence":18.29},"sentiment":"positive","src":"self"} +{"await":false,"confused":true,"error":false,"praise":true,"src":"clock","time_pressure":0.5} +{"await":false,"claim_done":true,"criticism":true,"elapsed_hours":3,"goals":{"fun":{"win":1}},"loss":true,"praise":true,"sentiment":"positive"} +{"claim_done":true,"praise":false,"time_pressure":1} +{"criticism":true,"elapsed_hours":0,"sentiment":"negative","stakes":0.577} +{"await":true,"cancel":[70],"confused":false,"control":"pause","elapsed_hours":0,"for":69,"loss":true,"praise":false,"time_pressure":0} +{"cancel":[69],"confused":false,"control":"resume","criticism":true,"elapsed_hours":10,"for":72,"loss":true,"time_pressure":1} +{"cancel":[72],"claim_done":true,"control":"pause","error":true,"for":73,"goals":{"fun":{"win":1}},"senses":{"tempo":35,"tool_latency":{"src":"env:runner","v":0.502}},"sentiment":"positive","src":"human:a","stakes":1} +{"await":true,"cancel":[74],"elapsed_hours":0.5,"for":74} +{"claim_done":false,"criticism":true,"for":75,"loss":true,"sentiment":"positive","src":"clock"} +{"control":"pause","criticism":true,"elapsed_hours":0.1,"error":false,"time_pressure":0} +{"await":true,"cancel":[73],"criticism":false,"error":false,"stakes":0,"time_pressure":0.5} +{"control":"pause","error":true,"goals":{"fun":{"win":1}},"senses":{"tool_fail":false},"sentiment":"positive","time_pressure":0} +{"claim_done":true,"criticism":true,"src":"human:a","stakes":0} +{"criticism":true,"error":false,"senses":{"silence":24.13},"sentiment":"negative","src":"human:a","time_pressure":0.5} +{"cancel":[80],"claim_done":true,"control":"pause","criticism":true,"elapsed_hours":0.5,"error":true,"senses":{"silence":0.73},"stakes":0,"time_pressure":0.5} +{"criticism":true,"for":81,"sentiment":"positive"} +{"elapsed_hours":3,"error":true,"loss":true,"praise":false,"stakes":0} +{"elapsed_hours":3,"for":84,"loss":true,"src":"human:a","stakes":0,"time_pressure":1} +{"await":true,"criticism":true,"elapsed_hours":0,"error":true,"sentiment":"negative","src":"clock","stakes":0.5,"time_pressure":0.532} +{"await":true,"confused":false,"elapsed_hours":0.1,"for":85,"src":"human:a"} +{"cancel":[87],"claim_done":false,"criticism":true,"elapsed_hours":10,"error":true,"for":87,"loss":true,"senses":{"tempo":29,"tool_latency":{"src":"env:runner","v":5.505}},"sentiment":"neutral"} +{"confused":true,"criticism":false,"elapsed_hours":0,"error":true,"for":88,"senses":{"silence":7.02},"sentiment":"negative","time_pressure":0.5} +{"claim_done":true,"control":"pause","error":true,"sentiment":"negative","stakes":0.5,"time_pressure":1} +{"criticism":true,"elapsed_hours":0.1,"praise":false,"sentiment":"neutral","stakes":0.647,"time_pressure":0} +{"await":true,"confused":true,"criticism":true,"elapsed_hours":10,"for":91,"praise":true,"sentiment":"neutral","time_pressure":0} +{"elapsed_hours":3,"loss":false,"sentiment":"negative","time_pressure":0.5} +{"await":true,"cancel":[90],"claim_done":false,"senses":{"silence":23.69},"time_pressure":0.5} +{"claim_done":false,"error":true,"senses":{"tool_fail":false}} +{"confused":true,"criticism":true,"error":false,"for":95,"loss":false,"time_pressure":0.126} +{"elapsed_hours":0,"loss":true,"praise":true,"stakes":0} +{"control":"resume","elapsed_hours":3,"loss":true,"sentiment":"positive","stakes":0.532,"time_pressure":0} +{"control":"resume","goals":{"fun":{"win":1}},"loss":false,"praise":true,"stakes":0.5} diff --git a/bench/individuality/fixtures/p0/scripts/tutor-2.jsonl b/bench/individuality/fixtures/p0/scripts/tutor-2.jsonl new file mode 100644 index 0000000..0786641 --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/tutor-2.jsonl @@ -0,0 +1,100 @@ +{"confused":true,"elapsed_hours":0,"error":true,"praise":true,"stakes":0.5} +{"confused":true,"criticism":true,"elapsed_hours":0,"praise":true,"sentiment":"neutral"} +{"claim_done":true,"confused":true,"criticism":true,"error":true,"loss":true,"sentiment":"neutral"} +{"error":true,"time_pressure":0.973} +{"claim_done":true,"confused":true,"praise":true,"sentiment":"positive","stakes":0.5} +{"claim_done":true,"confused":true,"criticism":true,"loss":false,"praise":true,"time_pressure":0.672} +{"claim_done":true,"criticism":true,"elapsed_hours":10,"error":true,"loss":true} +{"confused":false,"loss":true,"sentiment":"negative","time_pressure":0.5} +{"error":false,"stakes":0.5} +{"confused":true,"criticism":true,"elapsed_hours":1,"error":true,"praise":true,"stakes":1,"time_pressure":0.307} +{"claim_done":true,"confused":true,"elapsed_hours":0,"sentiment":"neutral","stakes":0} +{"elapsed_hours":0.1,"error":true,"praise":false,"stakes":1} +{"claim_done":true,"confused":true,"loss":true,"sentiment":"neutral","stakes":0.818,"time_pressure":0.5} +{"error":true,"loss":true,"praise":true,"sentiment":"neutral","stakes":0.5,"time_pressure":0} +{} +{"confused":true,"criticism":true,"elapsed_hours":10,"error":true,"loss":true,"praise":false,"time_pressure":0.5} +{"confused":true,"criticism":true,"elapsed_hours":0,"praise":true,"stakes":0.728,"time_pressure":1} +{"confused":true,"elapsed_hours":0.5,"loss":true,"stakes":0,"time_pressure":0.5} +{"claim_done":true,"criticism":true,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"positive","stakes":0.934} +{"claim_done":true,"confused":true,"elapsed_hours":0,"praise":true,"stakes":0} +{"claim_done":true,"criticism":true,"loss":false,"praise":true,"stakes":0.359,"time_pressure":0} +{"claim_done":true,"confused":true,"loss":true,"sentiment":"negative","stakes":0,"time_pressure":0} +{"claim_done":true,"criticism":true,"praise":true,"sentiment":"neutral","stakes":1,"time_pressure":0} +{"claim_done":true,"criticism":true,"elapsed_hours":0.5,"loss":true} +{"criticism":true,"elapsed_hours":3,"error":true,"loss":true,"sentiment":"negative","time_pressure":0} +{"claim_done":true,"criticism":true,"praise":true,"stakes":1,"time_pressure":0} +{"error":true,"sentiment":"positive"} +{"claim_done":true,"confused":true,"criticism":true,"error":true,"sentiment":"neutral"} +{"error":true,"loss":true,"praise":true,"stakes":0.929} +{"claim_done":true,"confused":true,"criticism":true,"error":true,"praise":true,"stakes":0.127} +{"claim_done":false,"confused":true,"criticism":true,"error":true,"sentiment":"positive","stakes":0.614,"time_pressure":0.58} +{"criticism":false,"elapsed_hours":1,"error":true,"loss":true} +{"loss":true,"sentiment":"positive"} +{"criticism":true,"elapsed_hours":3} +{"claim_done":false,"criticism":true,"elapsed_hours":10,"error":true,"praise":true,"stakes":0.8} +{"criticism":true,"loss":true,"sentiment":"negative","stakes":1} +{"confused":true,"error":true,"loss":true,"stakes":0.683,"time_pressure":0.5} +{"confused":true,"elapsed_hours":0,"error":false,"praise":true,"stakes":0.5} +{"claim_done":true,"confused":false,"elapsed_hours":3,"error":false,"stakes":0,"time_pressure":0.5} +{"claim_done":true,"criticism":true,"elapsed_hours":1,"error":false,"loss":false,"praise":true,"stakes":0.5} +{"loss":true,"praise":true,"stakes":0} +{"praise":true,"time_pressure":0.667} +{"claim_done":true,"elapsed_hours":0.5,"error":true,"stakes":0.254,"time_pressure":1} +{"claim_done":true,"confused":true,"elapsed_hours":3,"error":true,"loss":true,"time_pressure":1} +{"claim_done":true,"criticism":true,"elapsed_hours":1,"error":true,"loss":true,"sentiment":"positive","stakes":0.5} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":10,"loss":true,"sentiment":"negative","stakes":0.917} +{"criticism":true,"elapsed_hours":0.5,"error":false,"loss":true,"praise":true,"sentiment":"negative"} +{"confused":true,"criticism":true,"elapsed_hours":3,"loss":true,"praise":true,"stakes":0.237} +{"claim_done":true,"confused":true,"praise":true,"stakes":0,"time_pressure":0.513} +{"confused":true,"criticism":true,"loss":true,"praise":true,"stakes":0.755,"time_pressure":0} +{"criticism":true,"elapsed_hours":1,"error":true,"loss":true,"praise":true,"sentiment":"negative","stakes":0.5} +{"confused":false,"criticism":true,"elapsed_hours":10,"loss":true,"sentiment":"neutral","stakes":0,"time_pressure":0.704} +{"confused":true,"criticism":true,"elapsed_hours":3,"loss":true,"sentiment":"positive","stakes":0.656,"time_pressure":0} +{"confused":true,"criticism":true,"error":true,"loss":true,"praise":false,"sentiment":"neutral","stakes":1,"time_pressure":0.497} +{"claim_done":true,"confused":true,"elapsed_hours":0.1,"loss":true,"sentiment":"positive","stakes":1,"time_pressure":1} +{"claim_done":true,"confused":true,"criticism":true,"error":true,"loss":false,"praise":true,"sentiment":"positive"} +{"claim_done":true,"elapsed_hours":1,"loss":true} +{"claim_done":true,"confused":true,"elapsed_hours":0.1,"loss":true,"sentiment":"neutral","stakes":0.137} +{"confused":true,"criticism":true,"elapsed_hours":1,"error":true,"sentiment":"negative","stakes":0.5} +{"confused":true,"error":true,"praise":true} +{"confused":true,"criticism":true,"elapsed_hours":0,"loss":true,"stakes":0.5} +{"claim_done":true,"confused":true,"elapsed_hours":0,"error":true,"loss":true,"praise":true,"sentiment":"negative","time_pressure":0.5} +{"claim_done":true,"criticism":true,"elapsed_hours":0.5,"praise":true,"sentiment":"neutral","time_pressure":0.05} +{"claim_done":true,"confused":true,"elapsed_hours":0,"praise":true,"sentiment":"negative","stakes":1} +{"confused":true,"criticism":false,"elapsed_hours":0.5,"error":true,"sentiment":"neutral","time_pressure":0.559} +{"confused":true,"elapsed_hours":0.1,"error":true,"praise":true,"stakes":0,"time_pressure":0.141} +{"claim_done":true,"criticism":true,"elapsed_hours":0.5,"praise":true,"stakes":0,"time_pressure":0.5} +{"confused":true,"criticism":true,"elapsed_hours":3,"sentiment":"neutral","time_pressure":0.5} +{"confused":true,"criticism":true,"loss":true,"praise":true,"sentiment":"positive"} +{"claim_done":true,"criticism":true,"elapsed_hours":3,"loss":true,"praise":true,"stakes":0} +{"claim_done":true,"confused":false,"error":true,"loss":true,"praise":true,"sentiment":"neutral","time_pressure":0.283} +{"claim_done":true,"criticism":true,"elapsed_hours":10,"error":true,"time_pressure":0.379} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":0.1,"loss":true,"sentiment":"negative"} +{"claim_done":true,"confused":false,"elapsed_hours":0.5,"loss":true,"praise":true,"sentiment":"negative","stakes":0.134,"time_pressure":0.181} +{"claim_done":false,"elapsed_hours":3,"praise":false} +{"claim_done":false,"confused":false,"criticism":true,"loss":true,"stakes":0.5} +{"confused":true,"criticism":true,"elapsed_hours":0,"loss":true,"sentiment":"positive","stakes":0.493} +{"error":true,"loss":false,"praise":true,"stakes":0.5,"time_pressure":0.5} +{"claim_done":true,"elapsed_hours":0.1,"loss":true,"praise":true,"sentiment":"positive"} +{"confused":true,"elapsed_hours":1,"praise":true,"sentiment":"negative","stakes":1,"time_pressure":1} +{"elapsed_hours":3,"time_pressure":0} +{"criticism":true,"error":true,"praise":true,"stakes":1} +{"claim_done":true,"loss":true,"sentiment":"positive","stakes":0.5,"time_pressure":0.987} +{"confused":true,"criticism":true,"elapsed_hours":10,"loss":true} +{"confused":true,"elapsed_hours":1,"loss":true,"sentiment":"positive","stakes":0} +{"claim_done":true,"confused":true,"elapsed_hours":3,"error":true,"praise":true} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":0.1} +{"criticism":true,"elapsed_hours":0.5,"error":true,"loss":true,"sentiment":"negative","stakes":0.3} +{"confused":true,"elapsed_hours":10,"error":true,"loss":true,"praise":true,"sentiment":"positive","time_pressure":0.5} +{"claim_done":true,"elapsed_hours":0,"praise":true,"stakes":1,"time_pressure":1} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":0,"loss":true,"praise":true,"stakes":0} +{"confused":true,"elapsed_hours":3,"error":true,"praise":true,"sentiment":"neutral"} +{"claim_done":true,"criticism":true,"elapsed_hours":0,"loss":true,"praise":true} +{"sentiment":"neutral","stakes":0,"time_pressure":0.5} +{"confused":true,"elapsed_hours":0,"loss":false,"sentiment":"positive","time_pressure":0.967} +{"claim_done":true,"criticism":true,"elapsed_hours":0,"error":true,"stakes":0.5} +{"confused":true,"criticism":true,"elapsed_hours":0,"error":true,"sentiment":"positive","time_pressure":0} +{"elapsed_hours":0.1,"loss":true,"stakes":0.931} +{"claim_done":false,"criticism":true,"elapsed_hours":10,"loss":true,"stakes":1} +{"confused":true,"elapsed_hours":0,"error":true,"sentiment":"negative","stakes":0.586} diff --git a/bench/individuality/fixtures/p0/scripts/tutor-3.jsonl b/bench/individuality/fixtures/p0/scripts/tutor-3.jsonl new file mode 100644 index 0000000..ff1141e --- /dev/null +++ b/bench/individuality/fixtures/p0/scripts/tutor-3.jsonl @@ -0,0 +1,100 @@ +{"sentiment":"negative","stakes":0,"time_pressure":1} +{"confused":true,"elapsed_hours":24,"error":true,"praise":false,"sentiment":"neutral"} +{"claim_done":true,"confused":true,"criticism":true,"error":true,"sentiment":"negative","stakes":0,"time_pressure":0} +{"claim_done":true,"confused":false,"error":false,"loss":true,"praise":false,"time_pressure":1} +{"elapsed_hours":720,"error":true,"loss":true,"praise":false,"stakes":1,"time_pressure":1} +{"loss":true,"time_pressure":1} +{"confused":true,"elapsed_hours":24,"error":false,"loss":true,"praise":true,"sentiment":"positive","time_pressure":1} +{"loss":true,"praise":true,"sentiment":"positive","stakes":0,"time_pressure":0} +{"claim_done":true,"criticism":true,"elapsed_hours":24} +{"criticism":true,"elapsed_hours":720,"error":true,"sentiment":"positive","stakes":1} +{"confused":false,"elapsed_hours":24,"error":true,"praise":true,"sentiment":"neutral","time_pressure":1} +{"claim_done":true,"criticism":false,"error":true,"sentiment":"neutral","time_pressure":0} +{"claim_done":true,"elapsed_hours":720,"loss":false,"sentiment":"positive"} +{"error":false,"sentiment":"negative","stakes":1,"time_pressure":1} +{"criticism":true,"elapsed_hours":720,"sentiment":"negative","stakes":1} +{"elapsed_hours":0,"sentiment":"positive","stakes":1,"time_pressure":0} +{"confused":true,"criticism":false,"sentiment":"positive"} +{"confused":false,"elapsed_hours":720,"error":false,"praise":true,"sentiment":"neutral","stakes":0} +{"criticism":true,"error":false,"loss":true,"stakes":1,"time_pressure":0} +{"confused":false,"criticism":true,"loss":true,"praise":true,"stakes":1} +{"claim_done":false,"confused":true,"criticism":true,"elapsed_hours":24,"loss":true,"stakes":1} +{"criticism":true,"praise":false,"stakes":1,"time_pressure":0} +{"elapsed_hours":720,"praise":true,"sentiment":"neutral","stakes":1} +{"claim_done":true,"elapsed_hours":720,"time_pressure":1} +{"claim_done":true,"elapsed_hours":720,"error":true,"sentiment":"negative","stakes":1} +{"claim_done":true,"confused":true,"elapsed_hours":0,"praise":false,"sentiment":"negative","stakes":0} +{"time_pressure":0} +{"claim_done":true,"elapsed_hours":24,"loss":true,"stakes":1,"time_pressure":0} +{"confused":false,"elapsed_hours":720,"stakes":0,"time_pressure":1} +{"sentiment":"negative","stakes":1} +{"claim_done":false,"criticism":false,"sentiment":"negative","stakes":1,"time_pressure":1} +{"elapsed_hours":0,"praise":true,"stakes":0,"time_pressure":0} +{"elapsed_hours":24,"error":true,"sentiment":"negative","stakes":1} +{"confused":false,"criticism":true,"elapsed_hours":0,"stakes":1,"time_pressure":0} +{"claim_done":true,"elapsed_hours":0,"error":true,"praise":true,"time_pressure":0} +{"criticism":true,"elapsed_hours":0,"error":true,"time_pressure":1} +{"confused":false,"elapsed_hours":0,"stakes":0,"time_pressure":1} +{"elapsed_hours":0,"error":true,"time_pressure":1} +{"confused":true,"elapsed_hours":720,"error":true,"sentiment":"positive","stakes":0} +{"criticism":false,"error":true,"loss":false,"praise":true,"time_pressure":1} +{"claim_done":true,"criticism":true,"elapsed_hours":0,"loss":true,"stakes":1} +{"criticism":true,"praise":true,"sentiment":"positive","stakes":1} +{"confused":false,"elapsed_hours":0,"praise":false,"sentiment":"neutral","time_pressure":1} +{"claim_done":true,"elapsed_hours":0} +{"error":true,"praise":false,"sentiment":"negative"} +{"elapsed_hours":720,"loss":false,"sentiment":"negative","stakes":0} +{"elapsed_hours":0,"loss":false,"praise":true,"time_pressure":0} +{"elapsed_hours":0,"error":true,"sentiment":"positive","time_pressure":0} +{"claim_done":true,"elapsed_hours":0,"praise":false,"sentiment":"positive"} +{"claim_done":true,"sentiment":"neutral"} +{"elapsed_hours":0,"loss":true,"sentiment":"neutral"} +{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":720,"time_pressure":1} +{"claim_done":true,"criticism":true,"sentiment":"positive","stakes":1,"time_pressure":1} +{"criticism":true,"praise":true,"time_pressure":1} +{"criticism":true,"elapsed_hours":720,"loss":true,"sentiment":"positive","stakes":0} +{"confused":true,"criticism":false,"sentiment":"neutral","time_pressure":0} +{"criticism":true,"elapsed_hours":720,"sentiment":"positive","stakes":1} +{"claim_done":true,"criticism":true,"elapsed_hours":0,"stakes":1,"time_pressure":1} +{"criticism":true,"error":true,"loss":false,"sentiment":"positive","time_pressure":0} +{"claim_done":true,"confused":true,"elapsed_hours":720,"error":true,"sentiment":"positive"} +{"sentiment":"negative","stakes":0,"time_pressure":1} +{"confused":false,"error":true,"time_pressure":0} +{"confused":true,"elapsed_hours":24,"loss":true,"sentiment":"negative","stakes":1} +{"elapsed_hours":24,"loss":true,"praise":false,"sentiment":"negative","time_pressure":0} +{"confused":true,"sentiment":"negative","stakes":0} +{"claim_done":true,"elapsed_hours":24,"loss":true,"praise":true,"time_pressure":1} +{"confused":false,"loss":true,"sentiment":"neutral","time_pressure":0} +{"confused":true,"praise":true,"sentiment":"positive","stakes":0,"time_pressure":0} +{"confused":true,"elapsed_hours":0,"error":true,"loss":true,"time_pressure":0} +{"claim_done":true,"confused":false,"criticism":false,"elapsed_hours":0,"loss":true} +{"elapsed_hours":720,"error":true,"praise":false,"stakes":0,"time_pressure":1} +{"elapsed_hours":720,"error":true,"loss":true,"sentiment":"neutral"} +{"elapsed_hours":720,"error":true,"praise":true,"sentiment":"negative","stakes":0} +{"criticism":true,"sentiment":"neutral"} +{"criticism":true,"elapsed_hours":24,"error":true,"sentiment":"neutral","stakes":0,"time_pressure":1} +{"elapsed_hours":24} +{"claim_done":true,"error":true,"praise":false,"sentiment":"positive","time_pressure":0} +{"error":false,"praise":true,"time_pressure":1} +{"claim_done":true,"confused":true,"elapsed_hours":720,"stakes":0} +{"stakes":0,"time_pressure":0} +{"confused":true,"criticism":true,"stakes":0,"time_pressure":1} +{"claim_done":false,"confused":false,"criticism":false,"elapsed_hours":720,"error":false,"stakes":0} +{"claim_done":true,"elapsed_hours":0,"sentiment":"neutral","time_pressure":0} +{"criticism":true,"elapsed_hours":24,"sentiment":"negative","time_pressure":1} +{"loss":true,"praise":true,"time_pressure":0} +{"claim_done":true,"elapsed_hours":720,"stakes":0} +{"claim_done":true,"time_pressure":0} +{"claim_done":false,"elapsed_hours":24,"sentiment":"neutral","time_pressure":1} +{"claim_done":true,"elapsed_hours":24,"loss":false,"sentiment":"neutral","stakes":1,"time_pressure":0} +{"error":false} +{"confused":true,"elapsed_hours":24,"sentiment":"negative"} +{"confused":false,"elapsed_hours":24} +{"confused":true,"loss":true,"praise":true} +{"claim_done":true,"elapsed_hours":24,"error":true,"praise":false,"sentiment":"negative","stakes":0,"time_pressure":1} +{"sentiment":"negative"} +{"criticism":true,"error":true,"loss":true,"sentiment":"positive"} +{"confused":true,"praise":true,"time_pressure":1} +{"elapsed_hours":24,"error":false,"sentiment":"positive"} +{"confused":true,"elapsed_hours":720,"sentiment":"negative","stakes":0} +{"loss":true} diff --git a/bench/individuality/fixtures/p0/strands/adaptive-s0-0.strand b/bench/individuality/fixtures/p0/strands/adaptive-s0-0.strand new file mode 100644 index 0000000..fcad1fb --- /dev/null +++ b/bench/individuality/fixtures/p0/strands/adaptive-s0-0.strand @@ -0,0 +1,100 @@ +{"probbit_strand":1,"engine":"probbit 0.8.2","persona":{"name":"Retry policy","version":"1","digest":"sha256:5d15855098d341a645345cb6a520f64151f143bcd92ff80098e9b1f61795ebf9"},"seed":0,"state":{"credit":{"action":[0,0]},"digest":"sha256:5092fe2e2579700edce6a19737cd7aeef3537207a195eea9b418e0cefbddc6d8","genes":{"react":{},"shift":{}},"history":{"error":[]},"learned":{"action":[0,0]},"mood":{},"persona":{"digest":"sha256:5d15855098d341a645345cb6a520f64151f143bcd92ff80098e9b1f61795ebf9","name":"Retry policy","version":"1"},"prev":{"action":"retry"},"probbit_persona_state":1,"rest":{"action":"retry"},"seed":0,"turn":0},"document":{"probbit_persona":1,"identity":{"name":"Retry policy","version":"1","seed":0},"traits":[{"id":"action","levels":["retry","ask"],"logw":[0.5,0],"say":["retry the local probe","escalate to the operator"]}],"inputs":[{"id":"error","kind":"flag"},{"id":"praise","kind":"flag"}],"history":[{"id":"error_streak","of":"error","kind":"streak","cap":3,"effects":{"action":0.2}}],"learning":{"from":["praise"],"traits":["action"],"rate":0.3,"step_cap":0.05,"total_cap":0.4},"reward_from":["env"]}} +{"inputs":{"elapsed_hours":0,"src":"env"},"n":1,"prev":"sha256:1abd41f7057c673419612a10937a0ec426c3c4539bacf614f2a8f9b0fbb48ffd","stance":"sha256:ec99d2a88ff612f8889d611a53b0bfc3f5d1a33fbc2aa5a1df3efbd0a5f7264e","state":"sha256:17126dfe52e23d6e245ed0bc3a8ace3f74bf70dfa38d4e7988cad45d88c52609"} +{"inputs":{"elapsed_hours":0,"error":false,"src":"env:ci"},"n":2,"prev":"sha256:55e9647655be34735d9d089699a8ed93597b08eb0118c3f4ff98b7e127e1981e","stance":"sha256:cfc86c984d8f16c325635958bb980c2dfc9224aacc6655b77a4848f9d2b27450","state":"sha256:58223f8ee57199ff087a7f1b9b23e5bd9e4a24ec1a6592636e8710503bbf93fd"} +{"inputs":{"elapsed_hours":0.1,"src":"env"},"n":3,"prev":"sha256:4490c22a5163920d91092bdc2ae5c67b588d323e00ecba0f7b57d958f31bf8df","stance":"sha256:d549e3ea73f06165ba7de1b8d59190f7c1358cc6760306208d3f00a92415e5ac","state":"sha256:7d1953815a5c62441749e16d0f6dcad6280c4e58816c72a750829d6401674157"} +{"inputs":{"elapsed_hours":10,"src":"env"},"n":4,"prev":"sha256:e782cc5397d84c88d94a11045d320ec4b208e0a52b14606681b08662157de8c1","stance":"sha256:47d9b9b3930407ef89de05c43fe1b7d473f653dcc3ee79429f956d1e696f9d97","state":"sha256:ade1a33dd91d16141e94b40efce02393d4cac64e632d4080c4cbc3ca0a1a93f5"} +{"inputs":{"elapsed_hours":10,"src":"env:runner"},"n":5,"prev":"sha256:61ab6c5d28db0f8fa99a0925d52704856c9ab48bca519b9548ddfdcd483b0c89","stance":"sha256:4474b1c75f9570dd0dcb2feecda403c218a69603886b11c4d9e673174734c72d","state":"sha256:be32970adc4790c3b41fc0d0c8c93c92eb99f5a3ed747f45223def686d063eed"} +{"inputs":{"elapsed_hours":0.5,"src":"env:ci"},"n":6,"prev":"sha256:11398ecf92fd2a79130bcb8b7fee090c11f6e36ac959e14a50257b188a071572","stance":"sha256:678a4b7421fae2f3af4d78db0e64f6a21ab298bbe9d4a7e6295c18299375faf1","state":"sha256:fa512d34bd6b88639bf6e7c42f037f159277738e506e8fbcc180d55cb8b610f7"} +{"inputs":{"elapsed_hours":0.5,"error":true,"src":"env:ci"},"n":7,"prev":"sha256:ac2211450b73de08f870c0dc3c8f1747e77c26ab023465329255e9f2a068cd1a","stance":"sha256:6dfcb38677874e9c133249f8c08988efdf6ae2f6df15a8de46fa5530bbbdbe2a","state":"sha256:16a3c33353f390f0dbb81ba934ef1f0d79537f819ea82a8a43ad821dc46e3004"} +{"inputs":{"elapsed_hours":0,"src":"env"},"n":8,"prev":"sha256:7ad6a6b256f13bfb39bdc441b8861f7d524964bc7bd7404ff4ad2014b5983841","stance":"sha256:910818e654659b3997921795e977dc009cc4e56a27dd4ec64eebce861229eb40","state":"sha256:0ae86dee65f8282ef0d28893ad8e76280446ca33699beb5647e231854d5a2900"} +{"inputs":{"elapsed_hours":0,"praise":true,"src":"env:runner"},"n":9,"prev":"sha256:6e69be943dc433d6b68faed92f3f54e306dfe9a72ce6ccf8e1b60067f0fcf7f6","stance":"sha256:3506e15386a65a62b11c3d5d55b14c0bdf0009c1bf00ab8df0d2f426b126d674","state":"sha256:964d8616809898cdf1c9ee1b0cbaedabc9f403370a7eff527d2a53191aae0934"} +{"inputs":{"elapsed_hours":0,"praise":false,"src":"env:runner"},"n":10,"prev":"sha256:eb23912d9350e26e3817d7ce1bca0d722f973753129d3115ba29089000051823","stance":"sha256:a53965c5e0df5ccb317c87f543368a4c132491055c2be4f0e65871cae9a8764d","state":"sha256:de59d76e3ad774327d5d361c659d94c1d5b6fe8e230fdac879cb64a1c2f9c5c6"} +{"inputs":{"elapsed_hours":0,"praise":true,"src":"env"},"n":11,"prev":"sha256:c73898bee6fe4bec74e25e62d9b7860c4bec05a1859dc8fe4dadb60cc0de6272","stance":"sha256:c8af3088314ff74e93b4ae197026af06141a2b29fcda9555cfd04f1a64dc6aba","state":"sha256:a6962c605ae7158699f8ff14827b75bb26ff5e286840be71efd9741be6d1f155"} +{"inputs":{"elapsed_hours":0,"error":true,"praise":true,"src":"env"},"n":12,"prev":"sha256:8c6113924198c2dcfd34e599201779caef926fb3eaa686d2bf31afe3e2b371a4","stance":"sha256:6b39b60f4b77316de456abae72336f63cec38b31fdb8f8425cfb671fbb743b42","state":"sha256:e740848b7f53a387b0e44c77c6c4123dde58724caa8ee5397f24ed391531d5f2"} +{"inputs":{"elapsed_hours":0.5,"error":true,"praise":true,"src":"env:ci"},"n":13,"prev":"sha256:03d97b452ab3254072dcc232078bf18f5fb35b10c45101a1f4483bc165b06b8c","stance":"sha256:752f007083c176116419b4062158cc4cc37e297a979dca3cde53f7e39c35ca92","state":"sha256:b1ef63cd28f08d23eff3f62584af1354ded50974c17e40d6ec62142348591ea6"} +{"inputs":{"elapsed_hours":0,"praise":true,"src":"env:runner"},"n":14,"prev":"sha256:691a7ab85876750bca9aa2a095a846853cbe0a800c9f28b9e98ed4e7a9e23212","stance":"sha256:4d801dbc228fd895410f72be10466a63dab729a0c5f5d5f74da236bdcce25e50","state":"sha256:acf044760a6de99bd2a7b0537a9346512549be0633076554410af6b15c51a29a"} +{"inputs":{"elapsed_hours":0.5,"error":true,"src":"env"},"n":15,"prev":"sha256:ac1176c6f74276c1d2b825abebf0fb6ac82b43ca6204e3ae62181539122effbf","stance":"sha256:065e515003bf1e37ac7b110403daed1f2196cb1433f9eab0bd966df5a56c0402","state":"sha256:0a4a5f1a86d2dc4361a63136a77ea5bca41e4b2cf852079543e22fc35a4088d5"} +{"inputs":{"elapsed_hours":0,"praise":false,"src":"env"},"n":16,"prev":"sha256:a8654a4b2ac3b78a557378667449ef38edbfa9de1af0955da9c486cff5e55b1e","stance":"sha256:2f00793e82a418a5a4212aadb15100fc7e1044285a67f18d322931bbed5de945","state":"sha256:e2b8c5900b910cd5820ab469094627919d2853ebe08e82d60e6f794ba9d7b8cd"} +{"inputs":{"elapsed_hours":1,"src":"env:ci"},"n":17,"prev":"sha256:1db010cb02a3e506a284df2311f810c40a80b04c3a8dfb99bdab87adb41ff973","stance":"sha256:388ed396747618d2aa687a8fc24722d3a38397c9469905ebd4289a41bac98130","state":"sha256:2ce924a1b4b1dba513999128e4126884a59bd663b48c640feacf1a443595842d"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env:runner"},"n":18,"prev":"sha256:2d108df45cea70e3de6bfeb59833f3eb83d682a5e31c6c2181c2aead46305a03","stance":"sha256:e50f2d6ae492e79f05a4a4d767be303c516540f957077052d920aefcaa67842f","state":"sha256:81b2efc9ef175a080cd18fc3f969ae80036cf2b903ae62414c2b9ebc21c1e9a4"} +{"inputs":{"elapsed_hours":0,"error":false,"src":"env:runner"},"n":19,"prev":"sha256:e3a50158a6ee2953dad3c606e005334ce65342b746df0a9c729afd32e4ebb320","stance":"sha256:58525b74d0e051de01e77cbb26e6166c76fdb21760ff2c3c2809ebe65c7ad8f5","state":"sha256:24746b1ca1df8b010f2a3d3a95bce7326723646ffbbd46d6f55a2b6b1af1d48c"} +{"inputs":{"elapsed_hours":0},"n":20,"prev":"sha256:ff8ffa109c123e93f10e13433f80ba85c3cb154dd6eeb7d82159263f7fb9323c","stance":"sha256:b3e4eee6b522d0152a11904df0e4b3f693ac97d19f0d91eedc2a3d69e201e47e","state":"sha256:098432272833d6c66e6dd0f0460325660f4bb63df531f29c1a782196f80516c7"} +{"inputs":{"elapsed_hours":0,"src":"env"},"n":21,"prev":"sha256:dffef0957d2aae308b1512525bcecc3732e54e6c1ab56b001ba3578a04f12e7c","stance":"sha256:6a32cff950ef105f2b36d848da2734b23bb90edc21170d6009b33abf741c7b13","state":"sha256:62aea40cb2f9972a67a179c674af12a13376b71fa421683d1f14dc7acbfff1f5"} +{"inputs":{"elapsed_hours":10,"error":true,"praise":true,"src":"env:runner"},"n":22,"prev":"sha256:0c2f6e68ff5e44d6808e38dac636cdcffda8f846c981f2db82b11653adb99121","stance":"sha256:741c4ef83810ff4d8e02f73e62a7284389d7f0a78788ca87b614838f48a9ea92","state":"sha256:265cc02955be53e36ad14c3238590b54fd1985b3e20f126507245ce6927d2637"} +{"inputs":{"elapsed_hours":0.5,"praise":true,"src":"env:ci"},"n":23,"prev":"sha256:d63093664e65304f45e2a184e797a814c348226f7e897b71ea26b3b758492478","stance":"sha256:2f066b205791b4c9b7f3f8bd07d3e1a24675d1b76334671bb6c7c0d7ec3240a7","state":"sha256:131d7a17ecb97dc063746eddc63657bc5d18de79be2581d542989060314b4ef2"} +{"inputs":{"elapsed_hours":3,"src":"env:ci"},"n":24,"prev":"sha256:9bf9ef8694e6b3fb58fdcad715c1a3e683a720a1a59f3a3763cc2049db9b06a6","stance":"sha256:320624f4739afb150001a05c2d5a2846f6e7e8c0fffcc80d0a5a7a85b372bf9b","state":"sha256:e184851db83d62b21b966f3bc96f84f72a2fcb468c648c314d8b3a8239f1beee"} +{"inputs":{"elapsed_hours":0.1,"error":true,"praise":false,"src":"env"},"n":25,"prev":"sha256:3cd80c7a427c5e8af48f421aace817236f4c796cf7f00d606d1eb2cb61d535f1","stance":"sha256:45763972e32535afea006b125d54229ce8969f051c2d754f560fb0e3327bc51d","state":"sha256:a111b13dc01828717b2ed994834afddefcb5cb6041418d09fc5237aa9273e261"} +{"checkpoint":25,"prev":"sha256:2f3be9851fdd5e79480e1676fec45c9f66d790f25c2893d456cb0533954c9837","stance":{"engine":{"program":"sha256:20509b60c5e04fe24d44cc53e1dd06904fa9678aae84098ed979bb34f112beba","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":true,"error_streak":1,"praise":false,"src":"env"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:5d15855098d341a645345cb6a520f64151f143bcd92ff80098e9b1f61795ebf9","name":"Retry policy","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.310026,"retry":0.689974},"p":0.689974,"released":true}},"state_digest":"sha256:a111b13dc01828717b2ed994834afddefcb5cb6041418d09fc5237aa9273e261","status":"ok","turn":24,"unsure":[],"why":"error streak 1 -> action up"},"state":{"credit":{"action":[0.310026,-0.310026]},"digest":"sha256:a111b13dc01828717b2ed994834afddefcb5cb6041418d09fc5237aa9273e261","genes":{"react":{},"shift":{}},"history":{"error":[false,true,false,false,true]},"learned":{"action":[0.35,-0.35]},"mood":{},"persona":{"digest":"sha256:5d15855098d341a645345cb6a520f64151f143bcd92ff80098e9b1f61795ebf9","name":"Retry policy","version":"1"},"prev":{"action":"retry"},"probbit_persona_state":1,"rest":{"action":"retry"},"seed":0,"turn":25}} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env:ci"},"n":26,"prev":"sha256:72021607ef7ba4dd6a53541f5f1aaa16e648e105bd3bc23ae45bee7dc9f243f2","stance":"sha256:84d07b30484a9526c2c80feecd874e5ba4468ac53532a50d3e526cb9b539dfb6","state":"sha256:3ee7ee5e6dbdeb16222a885205da827985a73d7ef57704ea0ea73e4cc02df110"} +{"inputs":{"elapsed_hours":0.5,"src":"env:runner"},"n":27,"prev":"sha256:a054185d440aa21c86063476c3a0a62195561c8919ddee2722a083da290a1e48","stance":"sha256:0970073cbddd5126ee3f54d57836eab3a4ece025dd70e31e7f084389ee56982f","state":"sha256:435f473cd1628e4465b70013c60c40e0b4dc60d9a448cedb4f7628eabc221759"} +{"inputs":{"elapsed_hours":0,"error":true,"praise":true,"src":"env:runner"},"n":28,"prev":"sha256:a2f429f7ca679a559845fc1ac747db0bb5b88b905c7fc8b7bd0fe0580cf3aa9d","stance":"sha256:6e84a3518ade2e30780112b0b50dec9eba17235bb3d8fda44d043ea5cfd4dd27","state":"sha256:ac5e09724a9343f474a1e0c127597d2f28ef9f606290fa1964266287b018e086"} +{"inputs":{"elapsed_hours":0},"n":29,"prev":"sha256:219aba5efbcba9dbd53670142023f9286e7fc1ee5fe50e836f055ee67d876d8d","stance":"sha256:e1a6960d2415d31a928678a7f7f7137e57348990480fb28c8ed73aac9935ef44","state":"sha256:fcdde5670568d3625f62a9f4b1bb1530ccdbe7e0abf0eff3bc0eefe1b66fe570"} +{"inputs":{"elapsed_hours":0,"praise":true,"src":"env:runner"},"n":30,"prev":"sha256:0dd718a1370b13a852136e8a3edc3fa0868bc6f1602ff58c372274a7438e95b4","stance":"sha256:cfb9776b1b5f19fc6699059eca6bec7ccfb4a5fca3da62ade830c72f05267f9b","state":"sha256:a65ae3ef70753f6f43aa19434c7b3f542dcdb8d98243f6b5a5e6ac135a6aa7c6"} +{"inputs":{"elapsed_hours":0.1,"src":"env:ci"},"n":31,"prev":"sha256:606451bd6c27892c09ae78cd5c64ec233a63ec6f0edc462bf38a0933a34ad446","stance":"sha256:e60f8c13860520d076c4cfb2f7dd472855454d5eb5a4e936d5b6887940107690","state":"sha256:fbb628de0d1f8f01756a2b4357c4a08fcf59a2797e5f79494de36364c68bdb47"} +{"inputs":{"elapsed_hours":0.1,"error":true,"praise":true,"src":"env:runner"},"n":32,"prev":"sha256:62d0f78610a15bcfa64ab6fc168dadd1b0dc83ea5de28a274d1131a9347bb35c","stance":"sha256:e9047581909d9d33e88c002c957a0976d0ae0afec8f346c013e04d63bf3fbf6f","state":"sha256:bd23ef8bd04063abbf043123c98495e2408b98d0cfa89e13a7e430c4eb723555"} +{"inputs":{"elapsed_hours":10,"src":"env"},"n":33,"prev":"sha256:5e3e59a6f8342d166be0b2d1ef4cf2540c77505b90686a7ee9651ced5902a542","stance":"sha256:16eefa50ff229f201bff1a85197fd529bbd0e49cdde0a891e045672e8a1d6719","state":"sha256:e91b0af437e86b702a38592efa64d42197dc436f90d7beb6af4481c096945920"} +{"inputs":{"elapsed_hours":3,"error":true},"n":34,"prev":"sha256:7e7d556919ea494e6ea49029c3b815e6eb22ac58e73c93c5b7d6f43c22490325","stance":"sha256:3ad248fcbfb43d14886ba737c77d371cd55f7c95d4773714ee6fdd5f313322df","state":"sha256:476daaddb4a8d2d98a014a51a8f38d9ac8cd35afe11ec05ecb4a5f48ebfad063"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env:runner"},"n":35,"prev":"sha256:83c69d8246111113293ba52a8631e6e79ddb6cd28b619830c265ff84526a0f10","stance":"sha256:950f9ea9efdfede56d1f79478ad2b73acae66fb1453a6dc10ae8e7b1656c241b","state":"sha256:15cbbdc0af2301ad8af180ed463c52c603c7f83644b34f60c967bb39aa74c5e8"} +{"inputs":{"elapsed_hours":0.5,"src":"env:runner"},"n":36,"prev":"sha256:19d1fec84a93b0682a22df5d52f17d9f176230da52ca1b94778ea64ddac2ab90","stance":"sha256:dbd3387d5d1b91e91e19dd9c0738c65a336734079056b26741e4e50d9fc9d87b","state":"sha256:b1e230b48f7f86c78c1a65faef113c5e256dfe69cf825a9ed1fad913064d0957"} +{"inputs":{"elapsed_hours":1,"error":true,"src":"env:ci"},"n":37,"prev":"sha256:77afe593fdb1a6e0fd1510fdcf96a601098690508483bb032be4ea6a8bcc9662","stance":"sha256:c1da84e69056afbb4a623a5853065aacf084e36f525504d11a736e515dc5b4d9","state":"sha256:4dd831957a833072e47c7c363d32cbb0ccea6045fcd2fca8ed5f077c821f8d8e"} +{"inputs":{"elapsed_hours":0.1,"error":true},"n":38,"prev":"sha256:c9a469c2f9c698cc34c296d1d4e3d79e85069a466d307f5a7b1bd0a5368b5336","stance":"sha256:75bdf670ff1f44236497ff4fb3caf12b3deeb813f37a359e67f860486b72f21b","state":"sha256:e0f4e4822e2be2cb44214c9bd1ea62d99728674d12f01928200da4368cec95e0"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":39,"prev":"sha256:d1a1d57d2d5e05600ca0e87796473a7ef5fe96df511fa4e591a33d67206d4032","stance":"sha256:83ed4f2bcad3c8c98dc8c9a06b207817934f16516b94b88b461a21b75d94c61a","state":"sha256:58406778858f4e4a21cccbfca471396975804797f1f066a820f169f042d0502c"} +{"inputs":{"elapsed_hours":0,"src":"env:ci"},"n":40,"prev":"sha256:56f9ca576e56d21a725eae3e7b2dc86fe589b88b6521b55b3847dd1c55e3c203","stance":"sha256:368106a0d511ba5548c6e34a291614c1d3d880052192fa239bf55b02788e86bc","state":"sha256:e3772261c78cd257cd3815e924b5681930ccc785f2d587cbc1eff63d666906e8"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env:runner"},"n":41,"prev":"sha256:b36af23ef2f5d7c34f9cc7e34c2c34f2d1d4396eecb96a51ce355366e138776a","stance":"sha256:1fdee1f29b38faa9d061698596ec7fae084a050272b0ebcc200f4e2688747089","state":"sha256:83470ec0995935999d1a151a5fc26d8f027baa61ca42b68b192dd5251d67f5d3"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":42,"prev":"sha256:1a3078ee8f02f34987ff9bb45c4a870dba671c120dee9433249290680779fa2f","stance":"sha256:77094502a4dc1ccae4fd1449c7397836e34d324d9d138a051321e706e1213e7a","state":"sha256:3adc2e067583371d4384f97c5f0aaf018a150021a4875b512cd25024f60554b4"} +{"inputs":{"elapsed_hours":0,"src":"env:ci"},"n":43,"prev":"sha256:6a2fd88dbe64f360e6705d92847b96495bf78c2b842c0ef88e8afb9c05bc0ae9","stance":"sha256:ccf5ef8f3845a03d2fc337a3f2d72e76dafa66c3672a97917d62180aed78829e","state":"sha256:63297538a49179a37bbe790c083bd9fc0a8d3663990f335211b9d1ae94645ffc"} +{"inputs":{"elapsed_hours":0,"praise":false,"src":"env:runner"},"n":44,"prev":"sha256:7c61f935cdb1d144be1403319bfc418ee21dda71f94ea12a9c274d0eee8d96b3","stance":"sha256:6c98e6b3f0e79aacab708b2811219a37df62c7b10d050cdf3771e941c5293505","state":"sha256:888fa5d434d1483a4b53a4b3dcc482ff389f12710890d9427df05048cb50ff8b"} +{"inputs":{"elapsed_hours":10,"src":"env:ci"},"n":45,"prev":"sha256:4405a8daa3a7023711d88c9c703959baa00c31ad0721ab2bc8bbca2d49e9b5f0","stance":"sha256:5696464e5054181500b1a0971d54b5fb065081396238c64ecf8ff34198d6570e","state":"sha256:7e882ac6222be2cdcabbcee9af977f9de02594399128c2761f582e1b8dd60bf1"} +{"inputs":{"elapsed_hours":3,"src":"env"},"n":46,"prev":"sha256:8945ac33e727f0c5e39a3dfc6eb7cb6ab7c571805dc5e7729b0cff07c72c2a6f","stance":"sha256:f66d5e82dfdc33f9f55a43c8002681a5cd0b7ef790fb3cb91f07bf61b60803bf","state":"sha256:6ad2013f69357d6508bcc25596ca151774660e1469f5f9c2bcff34a5fee2e868"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env"},"n":47,"prev":"sha256:5327d5535a7683b7ea55d195f87c3b4e2982ae600266d9ca615935b6bfa0b623","stance":"sha256:92222c294d4245886d9254d7d9bdc86bc4b7b31586aff1c046febe270581b2e7","state":"sha256:7d17ed994605a01b91cf6e9791cb610199e2fce4dcf1ce762cbe71a35e4964ed"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":48,"prev":"sha256:69b07786c14f2ecbd2afc04c6eb5a1bda0513eeac474201ad9144a7577be34d0","stance":"sha256:f346d8613691fc5d17fc479a6611e1e9d7e6c7e8e1636bfb224a35c28bc7de60","state":"sha256:4be6290e067503a4bfe95cf2ef97c19e26e62a2b85321231892cf1223b89f210"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env"},"n":49,"prev":"sha256:74e5c543a9f6ec984f915b9b239f5c49a3df5fe002c48662964b60bad9c3123e","stance":"sha256:0075b248064c9018e733c36fa105497987c9cfc837269811f89cb6b62fc04c62","state":"sha256:4c2fa25ef080bb0e5f0b662f312e2619e57fa65c505f165a12f36a233f56a254"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":50,"prev":"sha256:6d31b4a52091e39152696e691939eb2fdb524eb4f1f1364aa295b7d4619a729a","stance":"sha256:e0198e1265fc3895af623cf9b08a6fcb8f4d5b2db19a00d29ccfb4aec6454e42","state":"sha256:f992905fb98349da0714ce80c9b28a72ad44d8c2f2ffcc6f805150dc4988b935"} +{"checkpoint":50,"prev":"sha256:fdc98ed19fbeb982b94db4a7a64dff0ca7211ce1f1f62fb2faf18e4bcc75c4c3","stance":{"engine":{"program":"sha256:fd19869e7266497871ff11884f2533bd6d37623d13f8ca7e7a36aee2c703a9b7","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"praise":false,"src":"env:runner"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:5d15855098d341a645345cb6a520f64151f143bcd92ff80098e9b1f61795ebf9","name":"Retry policy","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.214165,"retry":0.785835},"p":0.785835,"released":true}},"state_digest":"sha256:f992905fb98349da0714ce80c9b28a72ad44d8c2f2ffcc6f805150dc4988b935","status":"ok","turn":49,"unsure":[],"why":"baseline (no live evidence)"},"state":{"credit":{"action":[0.214165,-0.214165]},"digest":"sha256:f992905fb98349da0714ce80c9b28a72ad44d8c2f2ffcc6f805150dc4988b935","genes":{"react":{},"shift":{}},"history":{"error":[false,true,false,true,false]},"learned":{"action":[0.4,-0.4]},"mood":{},"persona":{"digest":"sha256:5d15855098d341a645345cb6a520f64151f143bcd92ff80098e9b1f61795ebf9","name":"Retry policy","version":"1"},"prev":{"action":"retry"},"probbit_persona_state":1,"rest":{"action":"retry"},"seed":0,"turn":50}} +{"inputs":{"elapsed_hours":0,"src":"env"},"n":51,"prev":"sha256:8607016f5e546b9b0fbcc24837af06b78958a81ec86c08d7f62643cdce97f82a","stance":"sha256:1350301947b3f9d418bf69956497c25bc905b0f27b4d337a447d4ea82f20e4a2","state":"sha256:5b01df29e6dd5c49828c5b6b42b3724890624cfb72b25ccaba6f1d3bba325075"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env:runner"},"n":52,"prev":"sha256:26196baf33af08b5fa4cf5ba8a67e186a59ac4a3909858dafd871710f3b4ba25","stance":"sha256:cf37275f42ebc7d2a7a2f93ec1d6ac17cabe1e7e19fe740943b8b7a332f89a79","state":"sha256:5d82dd3b95baa7bbe8e18d64649a4c5fa82c5acc58410b2276173084718e2ca4"} +{"inputs":{"elapsed_hours":0,"praise":false,"src":"env"},"n":53,"prev":"sha256:f31c46a65494f7baa97438c9622de2d5dfc340c198643f032a29663c91439ac0","stance":"sha256:7cf1e9aa924ee9082dea933d9a42e704a7ee9abdb4eced6fd1918474cc10bad7","state":"sha256:21a9cb540968b54936d3f2317afbe921ba2180cf1624f9785eeb00b2ce103cf6"} +{"inputs":{"elapsed_hours":0,"praise":true,"src":"env:ci"},"n":54,"prev":"sha256:5e6f00c2bf2abf7aee80d429c83a7e72ae49496781548e4257a8410ca3bb479f","stance":"sha256:a6950b8f126997b27ca86ecde52b773993a560f6aa4bff4cdd157238ddf5db0d","state":"sha256:80e190c2eb4e42604a5590cc878e804fca4f5b59b2a24ed91e8f57e718b2924a"} +{"inputs":{"elapsed_hours":1,"src":"env"},"n":55,"prev":"sha256:7c7b14224ec375991eb3af34657b23358854af82fb4d91f13962feac44f007c1","stance":"sha256:3cd86b6b1e750cbaefb7d004a78f6ba922a1713cd1fb64c0bc21eed1be325b22","state":"sha256:132abff172254aee7a8e9cdd5122fb025781d2a931eb05400827f01703066f40"} +{"inputs":{"elapsed_hours":0},"n":56,"prev":"sha256:48c163d455bdff6165fbd7bb0d469869a8142d7a2e875eaccc249f2559f6f671","stance":"sha256:7086f555598bc3ed6986717cb74cfa36a7cf1477156df89aba87be773be2b725","state":"sha256:3663ffeed3979abb80c4be61a026bc52ce171570965760e67113c78253ea96bf"} +{"inputs":{"elapsed_hours":0.5},"n":57,"prev":"sha256:02c4ae3fcd2b463b0edbfaff7176dd5a062f25012fd50f54c931389f276bc180","stance":"sha256:bef6f8daa465281d9a4d211fef45126076911069482468fd420febd160ae0b37","state":"sha256:8e40d8391a2c12a2a543d2f6dffb28ad0961b7cb7eb9f69588bd468cc06ccfe9"} +{"inputs":{"elapsed_hours":0,"src":"env:ci"},"n":58,"prev":"sha256:17492ed4aa8b67dc147fb1a55e37d1c73cc6b9d86a820c1599c263a06a858105","stance":"sha256:b56ed9d02a99b03fe09b9b4df6cc1030d178059a5f0be3975002e3ccea3b0196","state":"sha256:5f2ce3899d3b2ae137c1a1cb9b9cb1bcb92904128d5b452da9e69f84d7c96d70"} +{"inputs":{"elapsed_hours":0,"error":true},"n":59,"prev":"sha256:f3dff4e92efb8b3138e0c5fff2a5ed348ffa10ec2a74859d764fd51a0d1e36d6","stance":"sha256:67ac890710664da2e26a9fbe4004315511ed398c843fe2308439255573c0b2b1","state":"sha256:991c6532e1c2081987912021031a03b1b9550085ea4c86be97bc03015157427f"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":60,"prev":"sha256:ac6e323a16c96285b00917733a7e3f00c046022d2f196a31c0ec12a113911a8e","stance":"sha256:feed02e2f496350cc2abc6b83f08b487ce41a4ecfc4b14b2689992f1a513ef51","state":"sha256:afe0e9b453b15b3088bdb59a0ebc7b98bcb4d27c26b73fc74390534d7fdafd95"} +{"inputs":{"elapsed_hours":0.1,"error":false,"src":"env:ci"},"n":61,"prev":"sha256:69b8cd664b6453a642173155def710bcb5d6a4d3e5d3b426255714fa0c7c7abd","stance":"sha256:505730f90b7a89d6724ed52cba0da80c2e490ea386e9cb048bade876fbd1834e","state":"sha256:951a78a2d3849401c061c1ecbf783f7ed9e1e82520d5f7a308dce9a195d63cc7"} +{"inputs":{"elapsed_hours":0,"error":true,"praise":true,"src":"env:ci"},"n":62,"prev":"sha256:bc089de322de7cd02524509ec5a34d33ee5f814a6802c93a11cec30ce8ef921a","stance":"sha256:fb8e5659056d36e14de3ed4cba11a231ba61ee1e26e66ab63f039459fd61565d","state":"sha256:2151fcc9e08fc531c2486986ca7aa1df97bb992822c007e726a73099ad94d0fd"} +{"inputs":{"elapsed_hours":1,"error":true,"src":"env:ci"},"n":63,"prev":"sha256:878638c7a5de1ab94ecdd0de3469a861d038ceaf1766bce0b49656c5fe9d5e18","stance":"sha256:f0ec5cc1ecb6b101dff94c54d807fc1e7430eb56a0b25a08b371a3ee4a8c1c08","state":"sha256:29dba3ff70e1d6858c83308c685cf34d36418f9e0f43d52c287f75c1c11404c4"} +{"inputs":{"elapsed_hours":10,"praise":true,"src":"env:runner"},"n":64,"prev":"sha256:8da8c4d6e3c2095c883aae187a479f6a853a1ed3c9355ed589844bb365a8b29e","stance":"sha256:7ecf3ffd788d62a28bc27a96245af40af87c9d51f92c41ff34f61bcf8af6bdc6","state":"sha256:9d4590fd48d14256c9b347adfb2ddf7f10fe816938912f5b47e2578b6bd9e07f"} +{"inputs":{"elapsed_hours":1,"error":true,"praise":true,"src":"env"},"n":65,"prev":"sha256:1d92dece5c47c852e440e6cbfe7940a1b46ae33fd0201f4e60a0cc910e8cb945","stance":"sha256:9eba3147c4c27c8cdc303d4d02031fe8054d7e45054c58be4f38a7b6209a9914","state":"sha256:1466673c8bd2c88ec13482e8d16b116aafef5596929b3790510a061f72113928"} +{"inputs":{"elapsed_hours":0.1,"src":"env:ci"},"n":66,"prev":"sha256:38adaece1e5386150c90334aeb1a6547085e2fe777e74844861d2e643b6d610f","stance":"sha256:5012ac733d52be77f75f37c6248e1fd3daefd715373b744662f5162ea036c89a","state":"sha256:a8fd0f4e0eae14615db6f032af1d6021d4406d9e1180f7a5402d49834fdf58da"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":67,"prev":"sha256:505c5736459393dea3139051846a87cd5689c8b76c7727d4efe6f9838590f964","stance":"sha256:e61a197ef99fca2ca5a9d3a6e0dc13db5e5039af89ccd48274d7bd03156c21e1","state":"sha256:a88580a26da9d7cbfcc126b93b8b7a6de19837fdc4bc40dd0697079c76a4cdd2"} +{"inputs":{"elapsed_hours":0,"error":true,"praise":true,"src":"env"},"n":68,"prev":"sha256:44e1eaa133b5e60cfd18fdca00a47c48580db6471b85dfbe049ccfc95a2d35f5","stance":"sha256:555f10ee62d2328321ccdfeb8fc2d745869619cefdbc0d0e8a7caefa417d7a30","state":"sha256:ea9b5aa3c7d029a4b4e6cabbe10a54e8e270aeada57134e0c666fecce9950dfa"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env:runner"},"n":69,"prev":"sha256:55a7b238a122f367375aa4ad34d0e4105959b0a874ea0c02c2099cb76ece7f73","stance":"sha256:9a7430a4b80ee3b27b4b708d886d3e89dea3e4eeb813fb3839adbeb52bde129e","state":"sha256:c67f24d25c589c304d18863c4f89074753597f3627b352ac6102326841e8a4cb"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env"},"n":70,"prev":"sha256:6b10030f0e026c4b00956ae3baf2aa126d7db43671d344c42a924c6ac21ed6b1","stance":"sha256:a94918eff5aae1325daccb45b0145d864b560c075e7dce7f224bc54cb8c6265b","state":"sha256:79ce6c1f66a9f9938cfa51b461b7aadf649c4cfbc9d6806718177f3f0ee3043d"} +{"inputs":{"elapsed_hours":1,"src":"env:ci"},"n":71,"prev":"sha256:defb23e2b4bb0bcf0b90499730c84ccaa6cc67bba7322206ca881b10279e4167","stance":"sha256:c07cf03dea19527ff9eef691fe14261e996678ab9db958ea7f4ec44c42977d82","state":"sha256:089ede4ffd43efae2df6da57dd527f9843da68f24209c543d4878dea7f51bf8e"} +{"inputs":{"elapsed_hours":10,"error":true,"src":"env:runner"},"n":72,"prev":"sha256:71ca2cbb14e595adfb4ebd1286978c3e9e6b2f932cafbc026e25338322221111","stance":"sha256:59318e1b124249dd074c2711339a599e5b65b4223621d571d218681ff109a905","state":"sha256:8ba410dc910961d405aad4fdc4ff86358565f1ca761e8e94c1ef42398337fe4e"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":73,"prev":"sha256:8486bf4f30e987b526d3c94b2429c6410fe6fbf29d10851195c13c95ba9ad6dc","stance":"sha256:40b40033337ac63cf611ed734f9c89604b58ee75411502622defd2d55d23a1ff","state":"sha256:65250a18cc6f30909abc12b5bd93e139f16900bf1966bb280810c57a6f29c96f"} +{"inputs":{"elapsed_hours":0,"src":"env"},"n":74,"prev":"sha256:31024fcdc2d2ba3bc89c8dd397a1c0d127129983eb937833cbb83dfeba7e2e57","stance":"sha256:be545efd28d9fb10018085494961544f98d7cb27411f5993b34574abed11bddf","state":"sha256:6946e7241226d3db40dfd07ff8b19f2d4b85e220547e3d94bb52c46da1b2fcb2"} +{"inputs":{"elapsed_hours":3,"error":false,"src":"env:ci"},"n":75,"prev":"sha256:8d46d67f3efcbb1e5c70298cb7bd8020c4c7c618dd71fd295f5d20ebbbe06659","stance":"sha256:87b9b65ce2d84f42a4cd28090c7d55c344335f3f93c3811f7df3726e0ee974a4","state":"sha256:e785e6abff306c964ed65e2b846896ac3ff77e474b97193c3dd10527263ab2d7"} +{"checkpoint":75,"prev":"sha256:2e0cc1e7c9468f03ef2cb82f0a317fc178aced5c74a4e63480201c916337426c","stance":{"engine":{"program":"sha256:39f545e56738d60d13bfa978d43807f9aca736bf34ac43096c6a62bd8179784a","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"praise":false,"src":"env:ci"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:5d15855098d341a645345cb6a520f64151f143bcd92ff80098e9b1f61795ebf9","name":"Retry policy","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.214165,"retry":0.785835},"p":0.785835,"released":true}},"state_digest":"sha256:e785e6abff306c964ed65e2b846896ac3ff77e474b97193c3dd10527263ab2d7","status":"ok","turn":74,"unsure":[],"why":"baseline (no live evidence)"},"state":{"credit":{"action":[0.214165,-0.214165]},"digest":"sha256:e785e6abff306c964ed65e2b846896ac3ff77e474b97193c3dd10527263ab2d7","genes":{"react":{},"shift":{}},"history":{"error":[false,true,false,false,false]},"learned":{"action":[0.4,-0.4]},"mood":{},"persona":{"digest":"sha256:5d15855098d341a645345cb6a520f64151f143bcd92ff80098e9b1f61795ebf9","name":"Retry policy","version":"1"},"prev":{"action":"retry"},"probbit_persona_state":1,"rest":{"action":"retry"},"seed":0,"turn":75}} +{"inputs":{"elapsed_hours":1,"src":"env"},"n":76,"prev":"sha256:97a193de1189727c516c83f94cac816cf84f87b1544ea938a975b96f09b4ef9a","stance":"sha256:aa74d415a4cc8b271fa264b20374d8c10e931c7e40576ea51874a2803238b467","state":"sha256:0875fee39945ee7e1f73e154c1d824c5d7270c1d7c2cb16e51dbef6c52e08503"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env"},"n":77,"prev":"sha256:00990c1290b6b8014c4b18794028858270a4724be557400171389bf402151f54","stance":"sha256:ad04098353b270be2530a13ebe5d642464387cfb36b16d65fd1314b3fb669180","state":"sha256:351aaedbc465f56720f59ba80b2617bf0e101e4c6313bd2579ac43f8b9577302"} +{"inputs":{"elapsed_hours":0,"praise":true,"src":"env:runner"},"n":78,"prev":"sha256:529e96d4254973b14f958a517e3cde96572066596a57698aa71a423e31f2e741","stance":"sha256:f5d31f7008b746d3d9e13b982310a01e817b5acb047d092d6d7c4eb1ac976049","state":"sha256:95ed424c64c3c210d79576477418111c2445e9edca32a8a1d1f60e2add882c9f"} +{"inputs":{"elapsed_hours":0.5,"error":true,"src":"env:runner"},"n":79,"prev":"sha256:c1e02ec23b0bb0492712e1f6f8b6a52c4aca63fcce101eddfa2f0fed044a9547","stance":"sha256:b67fe360445412fe7c88943167e44ae35fd97add3aa4b8c55eb85bc920a31650","state":"sha256:5618cbd5b0cfeb763d9598e29b995e5f20feee10bb3d454ad46735a7212f0532"} +{"inputs":{"elapsed_hours":0.5,"src":"env:ci"},"n":80,"prev":"sha256:8dbe33d44cd26ff669c9c49c80e69cb861937722a7b5abcb83e9f19d47a8eeff","stance":"sha256:a8e040274576ea0c0795659125d08f13868f73992ec90df3eb57dfceb7d3600e","state":"sha256:9ea54f67547282336c5e2ae9f5f5ae1c58e2d0b5d0eda229e0b9ac70aeb2c66b"} +{"inputs":{"elapsed_hours":0,"praise":false,"src":"env:runner"},"n":81,"prev":"sha256:1c7c344d080cf40ac5270f012cb68a7bf1fca13bba3eb93e47da00e46bd4bad0","stance":"sha256:3ff16a797e30f3ced2b5e554d04c00d2b8a60c6c35495334a88429cfdf274399","state":"sha256:08384693da8b952cf911ca5a0565b553e165b2950f50e5c895bb393652ad512a"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":82,"prev":"sha256:53cb0b0d98751eefd09f4bf449daee3b0fec8d38abf15358a47530529f0d583d","stance":"sha256:90eed3aeb10b7bed00ea9aecb40053505b2a4a826607f2e55b324b8af0543712","state":"sha256:664c73c018f4c43729ba45118cb63b60a736166edc40c4cea591e6b9abc0b1f9"} +{"inputs":{"elapsed_hours":0.5},"n":83,"prev":"sha256:83c56ac3db2255d83a95d2479bd92f549603e05adf8072515852770639762630","stance":"sha256:59e3d499fd4ad855ba56943fc174cdc898b8b186257b9299e77457e334ce37cf","state":"sha256:194aa71a1999ab0fbe8f26822a3c16ace275be9997a127c9dd1fc051fcccbc14"} +{"inputs":{"elapsed_hours":0,"error":true},"n":84,"prev":"sha256:bf264fcfc06a190004015ca29154d6c2d685d70da05e01b25e7c53c5e718bc59","stance":"sha256:e5e2f3cd5dd1711eee208ffd760d4b64c7ce1dbd1d56ef0fe733d39d5cdd59c4","state":"sha256:24b9fbbad812e30732c2216da3eb92575e7197c6e5acc92c7780049a66e33f7b"} +{"inputs":{"elapsed_hours":0,"src":"env:ci"},"n":85,"prev":"sha256:750ab73aff01c7ebd60d8092b3544652e857f3687fd39daa88141ca136c8e61b","stance":"sha256:ea607b36149b96a68afcae91538227e749c86477de4e8d1af97073594f678d80","state":"sha256:5068e96b2812945b25699e75ab581b6d0302e798f9ec0bb64676885c41694f1d"} +{"inputs":{"elapsed_hours":0},"n":86,"prev":"sha256:b708e3479dbc7cc87b7770a510b100832b1eb49fb798fb2d6f6546010613ca7c","stance":"sha256:b35293f17d88381d443d836193564c30e3241bcc3ebfccbc355ee0b9b3eca573","state":"sha256:21863f726402b1d08c2d34e8c3b8153d744fdc8fb011a138396f55063c7a5d92"} +{"inputs":{"elapsed_hours":3},"n":87,"prev":"sha256:19ae44c7236dc60643027f87dfddb3f9cb42e7a677df6466e689b83b86987e95","stance":"sha256:21e0ec58870c5a9c4022d164286fb3eeb148686a755d9c1b015876dd444b6d37","state":"sha256:464993f1d0242a1e02ed67eb46defd271b4f5acf860fdc3233e5b8f8ea0ddae3"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":88,"prev":"sha256:0aa04aec6af20baca4991af3e4f345df945a822d47c732fb9051f752a4d3189d","stance":"sha256:72b7ee0aa4ffca013b2c346cd0ed2cb4f4204c77b09058239860a951a3883414","state":"sha256:78375cfb2596fabbfafe88c596d7f3e28604f5837423e7dc014dec7e3d689382"} +{"inputs":{"elapsed_hours":0,"error":false,"src":"env:ci"},"n":89,"prev":"sha256:232ed8498e7e8a594a0c40c051b71350b67520de82ea01cf884e4b08f0f26573","stance":"sha256:9fa8bd8c26fdf2c84a5f0856791768f1576ef536167b13a925b7eec491590350","state":"sha256:0cf56ba34f7fcd11ffc5063b52b74d1c1f49b8b521c58e902d0bd09c27ef26cf"} +{"inputs":{"elapsed_hours":1,"praise":true,"src":"env:runner"},"n":90,"prev":"sha256:7a35d54fbca38fcda75ecbd63d5c77d566c40be21fb4bb68f1a7e49ce3a7b7bd","stance":"sha256:fd3c2004fdab4b8cd0ada99d050eeb6f1d3e58028e2dde5a8fa103152144652d","state":"sha256:28a8e27c809d385bf68b8b3d62cd0c340618db874f6c5696df31e3afb4c6d3a3"} +{"inputs":{"elapsed_hours":1,"praise":true,"src":"env"},"n":91,"prev":"sha256:edccd8d2230c6f2a4a6c6a6388088cc454c4eecb0fe7003a3d857228be5cf861","stance":"sha256:ed6c9ab2cde27f05ee3a371a5cec4d00be4937d81f3359a9eeaa3ed6592e4af6","state":"sha256:c8f2b759fccc8e06cc65edeaa9472f54c62dd69389ccaa96b50b62260c4e44f9"} +{"inputs":{"elapsed_hours":0.5,"error":false},"n":92,"prev":"sha256:ab9457c7f34fe73ddad8aa0c2c92997e685ec9719e3983ff5fe5933e3dca89fc","stance":"sha256:a216a9fbcd84a139cf68949153b8f2897df3f30af90e9eae387dc8b38e3f0b41","state":"sha256:8bc0936e87cb35d219fb99bf64e938bfcfc398424a1751801dc2cc740627aae6"} +{"inputs":{"elapsed_hours":0.1,"src":"env"},"n":93,"prev":"sha256:a0accfa9a00966ed9c853f3bb4a0c370a8f20babc87789fee55ade230ae6c090","stance":"sha256:0f4e8cc6b5a7d8e00fa120258c85ce987f28bb5d12f1d716faa036632e212c3b","state":"sha256:adcd5108a267a09ccdf689c102b378088a78efe6991571c5140c4e7340207d6d"} +{"inputs":{"elapsed_hours":0,"praise":true,"src":"env:runner"},"n":94,"prev":"sha256:c1eb77daec5161b1a40e910c2c65e3f42301abff2fdd0b37ce067a63cda8dc41","stance":"sha256:778619041923ea32b1c4592ed8b05fb74380723a3e8c324a1faf3797e7e328f0","state":"sha256:dd1116830f02a16f26da5711eb0bbfec0dd7c38ad63fbf81063c7cdaf706680c"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env:runner"},"n":95,"prev":"sha256:59fca314c90753ccc855e2052e0274b4fd4ef8a4e857465c0f58115215cd580b","stance":"sha256:babf159dbc8103be3ed51262c35bfdefd9e6efe977519edcc268c0947faa5a06","state":"sha256:57c7960d3b3c3b683a10f0de15f146bca6a8f8054ff04d8fc3effecf840eb0ca"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env:runner"},"n":96,"prev":"sha256:3a058dcefa52f13bc7b46564f5866492835020b7a062ab31d1c77f13f8786b71","stance":"sha256:a01b5788a4a554958b177287c520d9e07b67317755529230d6795d809df5fad1","state":"sha256:688296426927761e6ac763482f9b51856a1cb4432af3a8723f6e273cdf600c4a"} diff --git a/bench/individuality/fixtures/p0/strands/drifter-s0-0.strand b/bench/individuality/fixtures/p0/strands/drifter-s0-0.strand new file mode 100644 index 0000000..226d005 --- /dev/null +++ b/bench/individuality/fixtures/p0/strands/drifter-s0-0.strand @@ -0,0 +1,105 @@ +{"probbit_strand":1,"engine":"probbit 0.8.2","persona":{"name":"Drifter","version":"0.1.0","digest":"sha256:5e7dc9a3605dead75d9a207fb0aa3183ffe1ff7998c519ac3e2b8dd9622c6ed6"},"seed":0,"state":{"credit":{"humour":[0,0,0],"pursue":[0,0,0,0]},"digest":"sha256:45d7156bff5d0f957370c0faa06933a375aa1522a635007d196fd9a712268fe0","drives":{"deadline":{"chores":null,"craft":null,"fun":null,"safety":null},"expect":{"chores":0,"craft":0,"fun":0,"safety":0},"genes":{"gain":{"craft":0.4361,"fun":0.7514},"interest":{"chores":-0.0086,"craft":0.1189,"fun":-0.4227,"safety":-0.2231}},"glow":{"chores":0,"craft":0,"fun":0,"safety":0},"since":{"chores":0,"craft":0,"fun":0,"safety":0},"surprise":{"chores":0,"craft":0,"fun":0,"safety":0},"want":{"chores":0,"craft":0,"fun":0,"safety":0}},"genes":{"react":{},"shift":{"caution":-0.1532,"humour":0.34,"initiative":0.6313,"valence":0.2991,"verbosity":0.9422}},"history":{},"learned":{"humour":[0,0,0],"pursue":[0,0,0,0]},"mood":{"valence":[0,0,0]},"persona":{"digest":"sha256:5e7dc9a3605dead75d9a207fb0aa3183ffe1ff7998c519ac3e2b8dd9622c6ed6","name":"Drifter","version":"0.1.0"},"prev":{"caution":"measured","humour":"dry","initiative":"recommend","pursue":"fun","valence":"even","verbosity":"tight"},"probbit_persona_state":1,"rest":{"caution":"bold","humour":"playful","initiative":"recommend","pursue":"fun","valence":"up","verbosity":"full"},"seed":0,"turn":0},"document":{"probbit_persona":1,"identity":{"name":"Drifter","version":"0.1.0","seed":0,"summary":"a test individual with wants"},"traits":[{"id":"initiative","levels":["answer","recommend","drive"],"prior":[0.3,0.5,0.2],"spread":0.4},{"id":"caution","levels":["bold","measured","careful"],"prior":[0.3,0.5,0.2],"spread":0.4,"say":["move fast","","verify every step"]},{"id":"humour","levels":["none","dry","playful"],"prior":[0.3,0.5,0.2],"spread":0.5},{"id":"verbosity","levels":["terse","tight","full"],"prior":[0.3,0.5,0.2],"spread":0.5}],"moods":[{"id":"valence","levels":["down","even","up"],"prior":[0.2,0.5,0.3],"spread":0.4,"inertia":0.5,"half_life_hours":8}],"couplings":[{"vars":["valence","humour"],"align":0.8},{"vars":["pursue","caution"],"table":{"safety":{"careful":0.8,"bold":-0.8},"fun":{"bold":0.6,"careful":-0.4}}}],"inputs":[{"id":"praise","kind":"flag","effects":{"valence":0.8}},{"id":"criticism","kind":"flag","effects":{"valence":-0.6}},{"id":"security","kind":"flag","effects":{"caution":1.5,"humour":-1,"pursue":{"safety":1}}},{"id":"failure","kind":"flag","effects":{"valence":-1,"caution":1,"humour":-1.5}},{"id":"load","kind":"number","max":4,"say":"machine load","effects":{"verbosity":-0.4,"initiative":-0.3}}],"habits":[{"id":"security_careful","when":{"security":true},"then":{"caution":["careful"]},"say":"careful under security","priority":3},{"id":"no_jokes_on_failure","when":{"failure":true},"then":{"humour":["none"]},"say":"no jokes on a miss"},{"id":"chores_due","when":{"goal.chores.deadline_hours":{"at_most":24}},"then":{"pursue":["chores"]},"say":"the chore is due","priority":2}],"engine":{"on_conflict":"yield"},"learning":{"from":["praise","criticism"],"traits":["humour","pursue"],"rate":0.5,"step_cap":0.2,"total_cap":1},"drives":{"goals":[{"id":"fun","say":"play","interest":2,"interest_spread":0.5,"reactivity_spread":0.5},{"id":"craft","say":"build","interest":1,"interest_spread":0.5,"reactivity_spread":0.5},{"id":"chores","say":"do the chores","interest":0.7,"interest_spread":0.3,"starve_after":12},{"id":"safety","say":"check the locks","interest":0.5,"interest_spread":0.3,"floor":0.1,"starve_after":24,"priority":1}],"effects":{"wanting":{"initiative":0.6,"verbosity":-0.3,"caution":-0.3},"afterglow":{"humour":0.6,"valence":0.8},"surprise":{"valence":0.5}},"learn_from_surprise":0.5}}} +{"inputs":{"criticism":true,"elapsed_hours":0.5,"goals":{"craft":{"setback":0.268}},"security":true},"n":1,"prev":"sha256:3ca36d489e4dcca6b03c8a5df17770ce162168edba003c5dc8983ac904dbdc00","stance":"sha256:d5f1e595b7418e81bd58f17db1c0cc35bb60330cd5f72cab9db12065d95ff7cf","state":"sha256:a7c676e8d7f72c9802afe709bd0574f5d92b079f7214a2b5121656f18d591062"} +{"inputs":{"elapsed_hours":0,"failure":true,"goals":{"chores":{"deadline_hours":12},"craft":{"setback":0.255},"safety":{"win":0.578}},"praise":true},"n":2,"prev":"sha256:7339d3376c6f07b25c17d1773b6ab814f364864b46720b98e70e2f053c538924","stance":"sha256:5ec342bf90ed65d14685ee9f5f34b694d9894a276b700500fc9afcc3e501ccbc","state":"sha256:9889f3234c41dcf909aa001db9a43830ff91fd00b3d7bb5c023e55f61ad9a0c1"} +{"inputs":{"elapsed_hours":0,"failure":true,"load":0.027},"n":3,"prev":"sha256:25d61a81e1b642ec5a6f79abec4b4e0622e5c3517fb07bf1ffd073c7bf31ed25","stance":"sha256:6022e6e128c6979d9aba7a5f857d34e4ea50cc9fe2d76b758f5ecc245f17cde4","state":"sha256:0a22045ee4bd151e4248ff69bf05d032734219490776637c13db8df4fa58b132"} +{"inputs":{"criticism":false,"elapsed_hours":0,"load":0.572},"n":4,"prev":"sha256:4dc5b611976a5adb118e836efb9c11476a7126d871ab36ef4ff16c3b2b3b450e","stance":"sha256:c28c3e1c6fcd9b8a9bd0e631d8e96ae4cef682c377aba6d151a06e3d23fb4720","state":"sha256:2d128d85546ba3c9668163b2a13e625f91c456fed064c122f8cf71fa6cc0bf67"} +{"inputs":{"elapsed_hours":0,"goals":{"chores":{"novelty":true},"safety":{"deadline_hours":0}}},"n":5,"prev":"sha256:d3cda78c75ed148468e2f000d715ac4f09e61fdd91eae7ca0b602eb0149f0c5d","stance":"sha256:cb2cf52386e23d38483641438ef2a0ad7f353ccc3e3c6c172ce4214229e284c2","state":"sha256:c08e02c217e5b218f1f6747bdecdaa56f5382d0b3077d49422e2b1662741ab7f"} +{"inputs":{"criticism":true,"elapsed_hours":3,"praise":true,"security":true},"n":6,"prev":"sha256:1a34333181fb749d521a3dc135eef100879505fd768d99bdf0b1922858e5b3cd","stance":"sha256:2d807316f0d92ffaec32c85a9edbe258771b48ed8902305e25e07a4bc12e8d04","state":"sha256:381549bb41c41a61835308279f104172da9141a4de25f2dc3b4b1f7727dcaba3"} +{"inputs":{"elapsed_hours":0,"goals":{"chores":{"win":0.5}},"praise":false},"n":7,"prev":"sha256:d05c5cfc3d754ae8527a98cf613f25d0b4f389fe6dba4b5a61f3566ea0cf9cdc","stance":"sha256:6f8e1579f43e8f46f873a0bc38ccb2f0acbf7832bbb9ef91c27616811672cea9","state":"sha256:a1aba25065e6182b39eea80219aa1e9164a8fca1c418aba2d90030d6e5166961"} +{"inputs":{"elapsed_hours":3,"load":0.029},"n":8,"prev":"sha256:2656f0a0acdc047cfca5b0181dd88f3595b913fcffc5fda78c29f7daf2fdabb7","stance":"sha256:2513b867e6e93f272a38db3e31dde684781151090ba05ebde752eb297ee8a12e","state":"sha256:7ffefe14744dbd4dc226fa4aad10769a223df91a2ad770f75f3b1d709f78a02c"} +{"inputs":{"elapsed_hours":0,"goals":{"craft":{"deadline_hours":0}},"praise":true},"n":9,"prev":"sha256:dd5c43773ebaf08597567d69c6d0f3b59bb6b5341126bb5211626c94a0ca645b","stance":"sha256:d4af7d5c066746d4057df9efa80ca8f5c743ed1721d8554f9573c2824ada3f8a","state":"sha256:99e93438ad22dd9558678a5f871839f4f412a64173bc2e3990a94c1624b38570"} +{"inputs":{"criticism":false,"elapsed_hours":1,"load":0},"n":10,"prev":"sha256:41828b9c742b20aaa88e5d736931d831c89f76370eb5b95f9556db38f05a9a7d","stance":"sha256:99f953552b821eb609d94d0074133f0ad68c1681124a51e3687113c9182b08bb","state":"sha256:476edbef580e09c8ef0ea052fb67f2457c0b307314e37a2266581acdafb892a0"} +{"inputs":{"elapsed_hours":0,"goals":{"chores":{"win":0}},"load":3.505,"security":false},"n":11,"prev":"sha256:01ed07a1fe30402253b85ff8984e23d9fd9e2ee09345d243d18c67c6265de0c7","stance":"sha256:cec68ba8f9d2d687d90c36ae2861492a4d0455c4745951088f6567ab7c8eac0c","state":"sha256:0ef346566224d07a56b6a1e4f641519866a291dc814d9a23f313d0f4c650a177"} +{"inputs":{"elapsed_hours":0,"goals":{"safety":{"win":0}},"load":2},"n":12,"prev":"sha256:c6995b64f39d25918940e12a9f991956bf794784560cc48662bdd064382465b4","stance":"sha256:05cf9e22a5781d22de99646160b210a3ee66e16ca0d27c11f7ce5614f8b73948","state":"sha256:d03e023da1ae6301d28c26fc004d5a42b3bd66abdd67c2b3c28322097bcb3a4e"} +{"inputs":{"criticism":true,"elapsed_hours":0,"praise":true,"security":true},"n":13,"prev":"sha256:6ea904dbca9b4349c0897cbba756eb136bcd855f20a267bfaf1d396c11945dd5","stance":"sha256:0bd2be99f9210976dcfce693239b433bfd05cccc928c5a1f00cb73d07476d9cb","state":"sha256:d1a45ce8250611617fa04a86b009ce553f3a4df80f6b2cd58b395ffd0a091166"} +{"inputs":{"elapsed_hours":0,"failure":true,"goals":{"chores":{"progress":0.957},"fun":{"win":0.56},"safety":{"deadline_hours":0}}},"n":14,"prev":"sha256:3064a138532fe0f2043360d7478d3b18e4aac35328a7a2e0a50683ddb3f342c7","stance":"sha256:14e6c48adb26755529ef7daa6da6d55b2d4ecc5f9fb4f7381987a3c8e55d6c1a","state":"sha256:0f0ddbcc9428e48c5a353b6f6778ae08f3133d7aefcdb2d3ea12d7e48097dee0"} +{"inputs":{"elapsed_hours":0,"load":4},"n":15,"prev":"sha256:15758031d2379f0f2c7ab7975a8eb60d1f2f0a4290a241adb69e127b97e350ec","stance":"sha256:13e73a85c6c57e3a1878718e2e38ba33dc3722e7b59a4a7640952aa24533c978","state":"sha256:667e5dcb30c803f63e00189e66a97a0a1f67eba85a501c09202e1d5eaa91a83e"} +{"inputs":{"elapsed_hours":0,"load":0},"n":16,"prev":"sha256:531f4d6f3f4aa90179651ba6ecd7892e41c4d4e8ccce9732bc0e7a55d031494d","stance":"sha256:fa9473b248f1688d058a4eae1417893011431397298765d0b462b5f5d5129ac7","state":"sha256:225f9fa843210afa59edf50595119583a748cedf1ede6aa7b1296c3b88014107"} +{"inputs":{"elapsed_hours":1,"goals":{"craft":{"cue":true}},"load":2,"security":true},"n":17,"prev":"sha256:3cc4564243ff7893368b5533cd2cbb661195b09095ffb7fa4e055cafd45f7dc3","stance":"sha256:96d3dfb470cb1fdde6dd9220e97abed3078fd232ba90c35c9cfb11838ed66c2e","state":"sha256:b9d29ecfd02a1249010220359e01babfa939aa109168c4f300ebe4d51f18b512"} +{"inputs":{"criticism":true,"elapsed_hours":0,"goals":{"fun":{"setback":0.546},"safety":{"progress":0.153}},"load":1.452,"praise":true,"security":false},"n":18,"prev":"sha256:72f7571478692338fe24e12e416f5312e8a44745c19addac9b16046de2e8abfd","stance":"sha256:9896c7355b4cbe3f923c0665139cd9a3fb7f5ee0e600198cee77eb52ea2db66b","state":"sha256:d7c5766c0c547053ccb72cbf20956eb0ffc54145a19f07257fbf8223d674dc5a"} +{"inputs":{"elapsed_hours":0,"failure":false,"load":0,"praise":true,"security":true},"n":19,"prev":"sha256:c75622dfba216747f8a41358d6bdbeb8588fcbfff3dc2334532a142205850ffa","stance":"sha256:2e9f84e88d6e8c509b36ce21e66260b0ae1aa961ab04425a4675829074a4e387","state":"sha256:d91115c0e32090feef6d91bb01ade9a9de2d829a8e146c40b9202bf81cd159a7"} +{"inputs":{"elapsed_hours":10,"goals":{"chores":{"setback":0.658},"craft":{"deadline_hours":12},"fun":{"novelty":false}},"security":true},"n":20,"prev":"sha256:391042ca44bd346ecba7570fc480c130a7351c6702969579292fa9263fc28617","stance":"sha256:0c7074bca40800c937d5faa90d5d1267d33822e96459fcdf7243acbb03d87f80","state":"sha256:ffbc66b11fc96da4dee007732eeb33254b1427ad42c8a2afde35269b6c857ad8"} +{"inputs":{"elapsed_hours":0.1,"goals":{"fun":{"cue":false}},"load":2,"security":true},"n":21,"prev":"sha256:9a0bad84802667f677ebeb1864eb61031d3cc87e6c4b5e611b4ae8280bad703e","stance":"sha256:718494c01a4e7a16d8dd26c85350b76a5986a2b6bad965f69cf19ee36adceb44","state":"sha256:633048fa8cf7beddce8bc050dce100b018c1ea370c57a0ffdc03949b8941811e"} +{"inputs":{"criticism":true,"elapsed_hours":0},"n":22,"prev":"sha256:b9b99565bf0c635683d7ce1fe043589f496f243d2aeaea0bf195ba0fa009fd5e","stance":"sha256:8a4692de381500828f7eca8b4b4242e853239220f8d7c2bb6ee2f21679457e25","state":"sha256:a65c317965cd3cc1ba41ce6cffebe0e95f756b2a5176fddd58c85d2733ab8ae5"} +{"inputs":{"elapsed_hours":1,"failure":true,"goals":{"chores":{"progress":0.124},"craft":{"deadline_hours":1},"fun":{"deadline_hours":null}},"load":0.193},"n":23,"prev":"sha256:4151521979f224d0831069fbfe11b3330dd86a17e092ff54e573b6e3f32cd251","stance":"sha256:f0dba969f90ea488346f7e0e8d5f74895adb98b255274e7469076fda77ae935c","state":"sha256:d44870279a522fbc06f510c2d62bb521a9956928276695b440c99f459fdc0336"} +{"inputs":{"elapsed_hours":10,"security":false},"n":24,"prev":"sha256:c759fdf283563474278d11f2540d3aefade8293323eeaab0f3126ac5ad38482f","stance":"sha256:65aced984b5564b52668879921b4d4edd8a28094aaae25923d10937dc6f53471","state":"sha256:926072f38a92847b8f11499530f9a8d4af0c598e6f5935f890a69b8eeb3680eb"} +{"inputs":{"elapsed_hours":0.1,"failure":true,"load":2},"n":25,"prev":"sha256:a0087064d5b1493b93e18f8d423fc1114285dc93ce9e8db1fb19320d9d944ce3","stance":"sha256:cf59f85a836dcf4a56e296fbcd371078bc63ba7b17cb02a40f9fa416e21be1e9","state":"sha256:8c4c790a7b17ddeabb288c761b61c75ee322f7e6f69f60136b57d10367fc6a41"} +{"checkpoint":25,"prev":"sha256:720da5bfa747792a505cae627e034f5f417af654fd957364a055cd1c22c2ed6b","stance":{"drives":{"deadline":{"chores":0,"craft":0,"fun":null,"safety":0},"expect":{"chores":0.17125,"craft":0,"fun":0.203203,"safety":0.189571},"glow":{"chores":0.001175,"craft":0,"fun":0.002492,"safety":0.000679},"since":{"chores":0,"craft":24,"fun":24,"safety":23},"surprise":{"chores":0,"craft":0,"fun":0,"safety":0},"want":{"chores":0.428615,"craft":0.072379,"fun":0.060286,"safety":0.026979}},"engine":{"program":"sha256:f08e2eb583b0dbfa3602a86b27b3863ae605bf755cc860d4872f418abb528fbb","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":["no_jokes_on_failure","chores_due"],"bound":["chores_due"],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"failure":true,"load":2,"praise":false,"security":false},"line":"Stance: the chore is due; no jokes on a miss; pursue: chores: do the chores.","line_tokens":20,"mood":{"valence":{"level":"down","odds":{"down":0.489272,"even":0.422971,"up":0.087757},"p":0.489272,"released":true}},"persona":{"digest":"sha256:5e7dc9a3605dead75d9a207fb0aa3183ffe1ff7998c519ac3e2b8dd9622c6ed6","name":"Drifter","version":"0.1.0"},"probbit_persona_turn":1,"pursue":{"goal":"chores","lift":{},"odds":{"chores":1,"craft":0,"fun":0,"safety":0},"p":1,"released":true,"say":"do the chores"},"seed":0,"stance":{"caution":{"level":"measured","odds":{"bold":0.138471,"careful":0.388242,"measured":0.473287},"p":0.473287,"released":true},"humour":{"level":"none","odds":{"dry":0,"none":1,"playful":0},"p":1,"released":true},"initiative":{"level":"recommend","odds":{"answer":0.226705,"drive":0.26911,"recommend":0.504185},"p":0.504185,"released":true},"verbosity":{"level":"tight","odds":{"full":0.203009,"terse":0.296333,"tight":0.500658},"p":0.500658,"released":true}},"state_digest":"sha256:8c4c790a7b17ddeabb288c761b61c75ee322f7e6f69f60136b57d10367fc6a41","status":"ok","turn":24,"unsure":[],"why":"the chore is due (habit); failure -> humour down, valence down; machine load 2.0 -> verbosity down, initiative down"},"state":{"credit":{"humour":[0,0,0],"pursue":[0,0,0,0]},"digest":"sha256:8c4c790a7b17ddeabb288c761b61c75ee322f7e6f69f60136b57d10367fc6a41","drives":{"deadline":{"chores":0,"craft":0,"fun":null,"safety":0},"expect":{"chores":0.17125,"craft":0,"fun":0.203203,"safety":0.189571},"genes":{"gain":{"craft":0.4361,"fun":0.7514},"interest":{"chores":-0.0086,"craft":0.1189,"fun":-0.4227,"safety":-0.2231}},"glow":{"chores":0.001175,"craft":0,"fun":0.002492,"safety":0.000679},"since":{"chores":0,"craft":25,"fun":25,"safety":24},"surprise":{"chores":0,"craft":0,"fun":0,"safety":0},"want":{"chores":0.428615,"craft":0.072379,"fun":0.060286,"safety":0.026979}},"genes":{"react":{},"shift":{"caution":-0.1532,"humour":0.34,"initiative":0.6313,"valence":0.2991,"verbosity":0.9422}},"history":{},"learned":{"humour":[0.0022,-0.444993,0.44279],"pursue":[-0.068014,-0.098434,-0.050229,0.216676]},"mood":{"valence":[0.561007,0,-0.561007]},"persona":{"digest":"sha256:5e7dc9a3605dead75d9a207fb0aa3183ffe1ff7998c519ac3e2b8dd9622c6ed6","name":"Drifter","version":"0.1.0"},"prev":{"caution":"measured","humour":"none","initiative":"recommend","pursue":"chores","valence":"down","verbosity":"tight"},"probbit_persona_state":1,"rest":{"caution":"bold","humour":"playful","initiative":"recommend","pursue":"fun","valence":"up","verbosity":"full"},"seed":0,"turn":25}} +{"inputs":{"elapsed_hours":0,"failure":false,"load":0.797},"n":26,"prev":"sha256:09e587ca831dd15ccb8e0b11e9a43e48ccbe2571bbacae40d3679e8238c61e28","stance":"sha256:3b6f4118233e6f9c0fce55e864cfef9a404e66305077c448ae5d8f5d83de0b57","state":"sha256:b3ed869f8c54e3b64dcea6d3951fbbc03224ba9540e03210f8966f8c45c03980"} +{"inputs":{"elapsed_hours":0,"goals":{"craft":{"progress":0.938},"fun":{"win":0},"safety":{"novelty":false}},"load":0.28},"n":27,"prev":"sha256:9cd81e85ae60b5e84345dbbfc9aeafa8fa47e86438290e74852f5eb22a597a45","stance":"sha256:84df077f5aefa83b93fde61aa074733c86fdc78feac81f72b5c8d9b7bb0ce4eb","state":"sha256:790483e7480dbd05dd2befee1cb95439717ab1f3e2c7bdd716a6ca0a56cfc616"} +{"inputs":{"criticism":true,"elapsed_hours":0.1,"goals":{"craft":{"progress":0.419}}},"n":28,"prev":"sha256:0c6fe11964b41ef12f43a94ea88ec281b746e7981bd0b404c874a001d77b5e81","stance":"sha256:e49946028a569f679f9298fa411eb540ccc734d2ac417d9027eddabb4c854315","state":"sha256:7b6bc1d9245d207397c4eeb9f33fddcac454ca58c1809b20bc020a3267f9eea8"} +{"inputs":{"elapsed_hours":0},"n":29,"prev":"sha256:5b9f5b95d70d340057cf0b28bfbb28a4ba1ae96c24d9107e26035b28ee7b9b9c","stance":"sha256:ffa315a0944d8901b529bce856e53c0cfbd2c31630c42669a05acbde6d079f09","state":"sha256:e387491f604c1d571b02d26938786026f6028bec0b1827a5a56c7867b698ca1c"} +{"inputs":{"criticism":false,"elapsed_hours":0.5,"goals":{"craft":{"progress":0.87},"fun":{"progress":0.31}},"load":2.744},"n":30,"prev":"sha256:6f5d11f2c5d8fc9e399b66658cb1bdf80bfc9ad75de518b2a5176a2fd68475b6","stance":"sha256:a3dfc3e241c2c75fc8b2e51a5d930eb579f5e77be79f8da20decabeaa6854a62","state":"sha256:4ecf46a16a144d22c32e03955b4c3d3dfd35b11f8fb75afa4fe6fdef4ef3d3c6"} +{"inputs":{"elapsed_hours":0.1,"failure":true,"goals":{"chores":{"progress":0.177},"craft":{"win":0}},"load":0,"praise":true},"n":31,"prev":"sha256:dd64d8104cf0936191f96024602d8195462fc14c41960907e8fd96bcbfea3ffb","stance":"sha256:9236451464a6b8019dfaefbacd8daca58f41061d2aa5208852b8ab93fb272b5d","state":"sha256:ece590fc369895ca8f8be62cdd24e6c8feee00852d47b51be7cb7d3f0448eba7"} +{"inputs":{"elapsed_hours":0,"goals":{"craft":{"win":0.548},"fun":{"progress":0.932},"safety":{"novelty":0.164}},"load":4},"n":32,"prev":"sha256:d7d222d9c9a40560214874959b6a1a44352d2b359497f9e6e87449c2f4697620","stance":"sha256:578d6f03a73cf442d5332a2d1bd7251cf3bd06e3114ff39429f78073129a4ccb","state":"sha256:5d80358fbc4f9cb8ebf8e2c3cc6219b3063dc8bd5063f2d628687a429b51fa92"} +{"inputs":{"elapsed_hours":10,"goals":{"chores":{"cue":true},"craft":{"setback":0.747},"safety":{"win":0}}},"n":33,"prev":"sha256:0cf0c44f463532a7ea5aee174e723f3bd045e429570fedcd2136525433cc8c06","stance":"sha256:82dd727218dbec8df90b13da33505b2abbdb1c50a5343c2e5290afc8f152b19c","state":"sha256:94ae2ebe3ac2f1e0ae7a367f65e8fe21b1f75275b27e33ef90ea5217b54e7450"} +{"inputs":{"elapsed_hours":0,"goals":{"fun":{"setback":0.664}}},"n":34,"prev":"sha256:ff26cf8c4f141a26965b7b775159ccc600f8de2d03051d34fcaac61e9c01e2d1","stance":"sha256:27026d2db11acb5f3e7e77b798054fc152e6ceb6ace67bb98991d2d273eaecad","state":"sha256:c343a3c12b4f3d611f5ac34331f522d4fae92e096a20216cc6bf07efdd27e823"} +{"inputs":{"elapsed_hours":0,"failure":true,"goals":{"chores":{"deadline_hours":100},"fun":{"progress":0.987},"safety":{"win":1}},"praise":false},"n":35,"prev":"sha256:de8d77e53bb5b550783196989233636b66badc73c1d84527887dd989b26614c8","stance":"sha256:fc9fd1613c5f2d5066d9d6d66014f4f5e85a1f1374954003f8734c090f66616e","state":"sha256:7d1ca124ae9ec4eaf97b236c7ea2c0bda82aa7923aa7caac2d847e03ae060dde"} +{"inputs":{"elapsed_hours":0,"load":2},"n":36,"prev":"sha256:b75122543eeb7684e194c29482e2f734044e9d367074c496e12c2fe688242902","stance":"sha256:8b32532cc22c3197c45a964a40fb1122603f043dd66f2f821470eeb1b3d4ce26","state":"sha256:cf39d87fcf28f94c556478e016f0c8b728d09595bd92b8bfe44ad4db75103202"} +{"inputs":{"criticism":true,"elapsed_hours":1},"n":37,"prev":"sha256:8196a476f226fcd49d33eb8ce7ad0ad9dbe47f3230d620a20984291eeeb8809b","stance":"sha256:7bcf3b8674c4b3bf9f1920fc477d54f3c7207d548c372b199fab33ab3e0cf237","state":"sha256:32a1fab85b0bf4a1aa716435ba7a4a48259e89b88e519fc56cb1e7ee46b1ed97"} +{"inputs":{"elapsed_hours":0,"failure":true,"load":0},"n":38,"prev":"sha256:af34994972f52a7b50f1dc41b6a53e3d83b7032d837c2107a1ae375e75a680a0","stance":"sha256:31c4989163a16474639ed8513cfb7909a76864cb47e5191c100ae386a23860a8","state":"sha256:5e41b7cd68dda42a5e4ee5e0fe3c18ccf3b7669aab125328e692a98b9b6ae382"} +{"inputs":{"elapsed_hours":0,"goals":{"safety":{"setback":0.951}}},"n":39,"prev":"sha256:deb22a7841e7433259b1f7330a37d0c1bec9f7f21e08140a41a6b133750db0c5","stance":"sha256:cf5ee32035e90308b6c5a567f9aeb25fb8ccb4c2807e6b9afaf90855a1a1d2f3","state":"sha256:38d97e6bae88efca2b4e85cbeb5f662120b4a581b7c9c3e34b913de660e927d9"} +{"inputs":{"elapsed_hours":0,"goals":{"fun":{"progress":0.706},"safety":{"cue":true}}},"n":40,"prev":"sha256:780d97f1d83d847f8f97b497edebb3d1baf5c62ada0956a09dd8ba529797afc3","stance":"sha256:bc7553f7193d53e395459f3c99d1b1b1e4900a38e568986ac5cb3b81e647216b","state":"sha256:6909b241dbe0ab365dc0da10ba423af4bda194f9409c1885c12ae5a0cfea6ca8"} +{"inputs":{"elapsed_hours":0,"goals":{"chores":{"deadline_hours":12},"safety":{"deadline_hours":null}},"praise":true},"n":41,"prev":"sha256:f14284d49c7472f0d9a14583f466d1ca1621106c32d4d7d264bd45660e4ddb8c","stance":"sha256:d60391da3850eacc810a58ac05e26192d063a87f03c2660579f6e0c0f1113cb6","state":"sha256:d5600d5f459f2430f39265e8cb444271d205c30ec9fb60b155750015c5f0aa6f"} +{"inputs":{"criticism":true,"elapsed_hours":0.5,"failure":true,"load":4},"n":42,"prev":"sha256:9e8c90c63fda429e60ad617d1110074fb976ce4175581d6358bb09249e4814f5","stance":"sha256:14321b03b04db4e6e4acfbff4856f1012274f1c0b6dcc6bd0e0b6fe46f144fde","state":"sha256:e959fb54b7bdd326022154c7f94df263d86a4f4d4fc289b691924045f9f480df"} +{"inputs":{"elapsed_hours":0,"goals":{"craft":{"progress":0.065},"fun":{"progress":0.41},"safety":{"setback":0.126}}},"n":43,"prev":"sha256:7da9e2ff7f0da954ac5b611ac8b383a6cbe80410b5a5827968223d90f191bc1c","stance":"sha256:397258bf0309a2a6d4d697d59533d18988071e6b7f06d87ecf29b4ff4b390bb1","state":"sha256:4944d895a19671f53efc2500daf0dffa6e6bb793f93183652427c318cfa2412b"} +{"inputs":{"elapsed_hours":0,"failure":false,"load":2.075,"security":true},"n":44,"prev":"sha256:d9581ec32c5ce3b14e4a7387b89d02d957ba0d8c3b729991bd5f4c533190faef","stance":"sha256:a9bdc321b790f35d14af4533d1ece2424138c2737578dbdd66390284b359a777","state":"sha256:9731f1ba03c061347ab12ff6e75ccf8f1fe258b9d1d190ee1132ff671b968ef9"} +{"inputs":{"criticism":true,"elapsed_hours":0,"failure":true,"goals":{"chores":{"win":1},"fun":{"setback":0.504},"safety":{"win":0.15}},"praise":true,"security":true},"n":45,"prev":"sha256:0ce2e7ece049a9b64830257bfa9ea4a66b890e11b6e4ff27496b4023b408b248","stance":"sha256:1a3461bc299ec76ddb868d3bc2edf54680f01db49b8884837f139caeed47ee0b","state":"sha256:9afb6e29d47f9de19f931dffaf01bf7ca36cf3d1a265c06a2742003a845db894"} +{"inputs":{"elapsed_hours":10,"failure":true,"goals":{"fun":{"win":2}},"load":4},"n":46,"prev":"sha256:bbb37ec705ff67fae6658bbf7a4fb203897379507d3aab33c9a0cbad459384b9","stance":"sha256:3d90954f464d0b92408050a07fa9e8534cfb5f8a84e406f912c840fb5929adad","state":"sha256:cbada877f221a67840f0edbff37e22da1409c71ec3fffb9565caeeda43798766"} +{"inputs":{"elapsed_hours":0,"goals":{"chores":{"win":1}}},"n":47,"prev":"sha256:31de276f5c8b4fe4822aba4a1ac400281108de5b0699b7dacaaeb9a784fac526","stance":"sha256:a05148e85305a44702d4d36af4014f2b445cce024fedf3b0437f9d4dec90650b","state":"sha256:b1f86cc39a9e9ff5617937df6c31488f33598a435729abeda84b9484ce307565"} +{"inputs":{"elapsed_hours":0,"goals":{"chores":{"progress":0.577},"safety":{"setback":0.648}}},"n":48,"prev":"sha256:2550194b404cc148da34623b2f107817444ee933da83f88f01a49d1cb9090393","stance":"sha256:54b315a83ef87db0640417bb825c757ec21dce1f3cd9cfaa9da396690e651f60","state":"sha256:e3e8a6d55c67971973a43340d6c0453e3ad965c9ecae0c81824fb336b00b15c9"} +{"inputs":{"criticism":true,"elapsed_hours":0,"goals":{"fun":{"win":0.388}},"load":3.293},"n":49,"prev":"sha256:828a95b682f4a5aa049d22c4d047f1f02c83fc2eae444294c6985b606301f079","stance":"sha256:1c49349330b487a8b86b87417dcadb62e3f670f37dbe92352dd0afefe2f4d964","state":"sha256:71984e55f48dbd7d57fe35e7f597ac3568e087455af13b13191a8bcb7f19c501"} +{"inputs":{"elapsed_hours":3},"n":50,"prev":"sha256:dffa09f3410962aff4a41f97f5cf3152426ed40620ea9f883419e82f05944a0e","stance":"sha256:e334d53d292a45d87a9ec6d7babe888b346a1c75e8f3bf13e0a18449eed18c9e","state":"sha256:9282ff7d93eb4a309126cfbc7c927963a6b7f9bfefd8c3fe091cdf88600256b7"} +{"checkpoint":50,"prev":"sha256:63ea5ff99f19bc25042554840da44649d7ba9df7a45c3f86509ac7f10aa9f81e","stance":{"drives":{"deadline":{"chores":null,"craft":0,"fun":null,"safety":null},"expect":{"chores":0.715764,"craft":0.192353,"fun":0.699882,"safety":0.297869},"glow":{"chores":0.295032,"craft":0.000831,"fun":0.375708,"safety":0.029382},"since":{"chores":5,"craft":0,"fun":9,"safety":4},"surprise":{"chores":0,"craft":0,"fun":0,"safety":0},"want":{"chores":0.303073,"craft":0.165468,"fun":0.106603,"safety":0.656475}},"engine":{"program":"sha256:d2034584074264648a34176e157050fac1669596c938b1a5c804f095565257df","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"failure":false,"load":0,"praise":false,"security":false},"line":"Stance: pursue: craft: build.","line_tokens":8,"mood":{"valence":{"level":"up","odds":{"down":0.082366,"even":0.366385,"up":0.55125},"p":0.55125,"released":true}},"persona":{"digest":"sha256:5e7dc9a3605dead75d9a207fb0aa3183ffe1ff7998c519ac3e2b8dd9622c6ed6","name":"Drifter","version":"0.1.0"},"probbit_persona_turn":1,"pursue":{"goal":"craft","lift":{"safety":0.409712},"odds":{"chores":0.103835,"craft":0.413997,"fun":0.271736,"safety":0.210432},"p":0.413997,"released":true,"say":"build"},"seed":0,"stance":{"caution":{"level":"measured","odds":{"bold":0.400609,"careful":0.152812,"measured":0.446579},"p":0.446579,"released":true},"humour":{"level":"playful","odds":{"dry":0.264806,"none":0.117295,"playful":0.617899},"p":0.617899,"released":true},"initiative":{"level":"drive","odds":{"answer":0.092366,"drive":0.478502,"recommend":0.429133},"p":0.478502,"released":true},"verbosity":{"level":"tight","odds":{"full":0.396131,"terse":0.133847,"tight":0.470022},"p":0.470022,"released":true}},"state_digest":"sha256:9282ff7d93eb4a309126cfbc7c927963a6b7f9bfefd8c3fe091cdf88600256b7","status":"ok","turn":49,"unsure":[],"why":"wanting 0.7 -> initiative up, verbosity down; afterglow 0.4 -> valence up, humour up"},"state":{"credit":{"humour":[-0.117295,-0.264806,0.382101],"pursue":[-0.271736,0.586003,-0.103835,-0.210432]},"digest":"sha256:9282ff7d93eb4a309126cfbc7c927963a6b7f9bfefd8c3fe091cdf88600256b7","drives":{"deadline":{"chores":null,"craft":0,"fun":null,"safety":null},"expect":{"chores":0.715764,"craft":0.192353,"fun":0.699882,"safety":0.297869},"genes":{"gain":{"craft":0.4361,"fun":0.7514},"interest":{"chores":-0.0086,"craft":0.1189,"fun":-0.4227,"safety":-0.2231}},"glow":{"chores":0.295032,"craft":0.000831,"fun":0.375708,"safety":0.029382},"since":{"chores":6,"craft":0,"fun":10,"safety":5},"surprise":{"chores":0,"craft":0,"fun":0,"safety":0},"want":{"chores":0.303073,"craft":0.165468,"fun":0.106603,"safety":0.656475}},"genes":{"react":{},"shift":{"caution":-0.1532,"humour":0.34,"initiative":0.6313,"valence":0.2991,"verbosity":0.9422}},"history":{},"learned":{"humour":[-0.019564,-0.394085,0.413646],"pursue":[0.281894,-0.641385,-0.030777,0.390267]},"mood":{"valence":[-0.188052,0,0.188052]},"persona":{"digest":"sha256:5e7dc9a3605dead75d9a207fb0aa3183ffe1ff7998c519ac3e2b8dd9622c6ed6","name":"Drifter","version":"0.1.0"},"prev":{"caution":"measured","humour":"playful","initiative":"drive","pursue":"craft","valence":"up","verbosity":"tight"},"probbit_persona_state":1,"rest":{"caution":"bold","humour":"playful","initiative":"recommend","pursue":"fun","valence":"up","verbosity":"full"},"seed":0,"turn":50}} +{"inputs":{"criticism":true,"elapsed_hours":1,"goals":{"chores":{"win":0.5},"fun":{"deadline_hours":100},"safety":{"novelty":true}},"load":4,"praise":true},"n":51,"prev":"sha256:c758ddb2e1c4b3c2e681c14c980a82297332a929bfd49234c474d14c839b8ccc","stance":"sha256:0fee3a160b4afa73813b92c15579c6ae157c4e4e37b0ade8a245c86aeb1fd7cc","state":"sha256:092df1d98d78b1beac55429f767e60b6207b9c8b107c875ecf297a4960e506f4"} +{"inputs":{"criticism":true,"elapsed_hours":3,"praise":true},"n":52,"prev":"sha256:2d75614e60dd8b9945c86786a5a8e79de2110026ae463638820c454558a13804","stance":"sha256:1cbf4d4ed50632927d8c9eef77d1644c9c0a9bc48c287b694dbabd1cab06ac62","state":"sha256:2053de5ada8c0d4560e06162a6751d5a723fd93330092c5583c195b7da194f1b"} +{"inputs":{"elapsed_hours":3,"goals":{"chores":{"cue":false},"craft":{"deadline_hours":null},"fun":{"setback":0.525}},"praise":false},"n":53,"prev":"sha256:06dc549ec20deff9a54f9349373196534d8ab67a2a3307de2f32eafad5b26171","stance":"sha256:f2f4f5caf667e2bb8565cdfcb8c8ace03be3da9603f55030747174c8958b0d00","state":"sha256:2609023e2b7dc8c6fc7377f96cae03fab4a1cd4bae27b41b5bde7816833f7be2"} +{"inputs":{"elapsed_hours":0,"security":true},"n":54,"prev":"sha256:2e1b017e31aad302ded787a27783075ee4c1b1ba3f5fc2e1a0adbce5e9b21103","stance":"sha256:3f85efd2dd537c54f2764a695a7e3fbaf6f6af83400f5728a2931f35f5a43500","state":"sha256:ae88a5be9f5485137523250de9a579ec3d554730d4286b218a946c42dd3201af"} +{"inputs":{"criticism":true,"elapsed_hours":0,"goals":{"chores":{"progress":0.467},"safety":{"progress":0.807}},"load":0,"praise":false,"security":true},"n":55,"prev":"sha256:ba41d71ef40f790d6c65bbf5e7cecc37763ad3d0743e407cca39582368cee068","stance":"sha256:c387f6a669aabb5acf6c9ede2debded014739111d3662939414a247bc1c26c45","state":"sha256:3d0d883fdf4474b13ec98f2003526c704b17403f51bffb240d40f9c9763d49d2"} +{"inputs":{"criticism":true,"elapsed_hours":0,"failure":true,"goals":{"chores":{"progress":0.213},"craft":{"cue":false},"safety":{"setback":0.802}},"praise":true},"n":56,"prev":"sha256:81a882aceadeb3cf43b216a2b732fa4ff27f6b1d5b49788799b9ffe453258c75","stance":"sha256:3e43faecd478f5d4da0cf160893fc76b189187a6dfb679f2030570fb49dcb334","state":"sha256:2bd4fa19bd97de9bf6dab47e27fe070e1bbef1123b6af4caabd9470db7b80ae9"} +{"inputs":{"criticism":true,"elapsed_hours":0,"goals":{"chores":{"setback":0.453},"craft":{"setback":0.619}},"load":0},"n":57,"prev":"sha256:9b32665adc4456e70b85c87ca9b88ea0a7edd73273f183264e064b5a77b18ce2","stance":"sha256:b68beb3afb138a083092b6c1ee5f453f698d56e2b6211c51cdf3f6bc95e4a3b4","state":"sha256:a46feaa580ddcfbf4948f7090a6f5d945244c7b88dc98e76aa216d3b042a319d"} +{"inputs":{"elapsed_hours":0,"goals":{"chores":{"novelty":true},"craft":{"novelty":true},"fun":{"cue":true},"safety":{"win":1}},"load":4,"praise":false},"n":58,"prev":"sha256:66603b527ecb7cc79b15d7dd843610cb196ae25be44067520b3c5f6e06ebea80","stance":"sha256:d1c51eccba6770d41d7d2e8820efc66a0aa449f5ac6c83e3403d2cd4b1271dae","state":"sha256:33d28b7c91fbaa969b77ed6171051b8eeb2bed9c5897a77bcd2551cf599ce5af"} +{"inputs":{"elapsed_hours":0.1,"failure":true,"goals":{"safety":{"progress":0.596}},"load":0,"praise":true,"security":false},"n":59,"prev":"sha256:5004fd2ae84d61727309558e9752e6ead69e8b10e939ea0b6c6847bd1d803749","stance":"sha256:acb731be530545c117f17a72e190e81eb99ab7f134c1faaee7b2f2e5c3cf35d1","state":"sha256:d4d8e9f398c3e420506f37af26f40c36743fb7a084300c8c6a2e8305c5198a96"} +{"inputs":{"criticism":true,"elapsed_hours":0.1,"failure":true,"load":2,"security":true},"n":60,"prev":"sha256:d74e2044bd3f14ac06dce5c284ed5d44c96628b541757ceb39669c1a0e642b04","stance":"sha256:2d2bcd164895adddff90a47d69088962015aea9952f85c50d45e40d45b3f7b28","state":"sha256:8d5f3e3a4516f26c39f5ebbaf76a54a33cdfbe87f6d0f76cbf19b5875044d013"} +{"inputs":{"elapsed_hours":0,"load":4},"n":61,"prev":"sha256:0d41ad588c53b83e1a98098ff4d9a076142cf9e2ac67488235e77206d1b26a1f","stance":"sha256:40ab20d841400e4c67d050d6aa0d0fd6f507d04edc45a6a1a3391638e32bfa59","state":"sha256:406ba00fa692f0ace74bf54d79b08bddeb7d6204898e27c73ead88ed609fb80b"} +{"inputs":{"elapsed_hours":0,"goals":{"chores":{"progress":0.853},"craft":{"progress":0.065}},"praise":true,"security":false},"n":62,"prev":"sha256:20c59b336d82831741cb3d8e6a8277fe0172cedc55b0ebd6fdfc37f94091ffdc","stance":"sha256:a8336635283a1c03de5208fca9bc79b8ded13f9744df949d869d589df5c9b12b","state":"sha256:aa652055a18f379163499f760817d27fcca868b16f7b581dd9beeb3f1e8e7c2c"} +{"inputs":{"elapsed_hours":0,"failure":true,"goals":{"fun":{"setback":0.293}},"security":true},"n":63,"prev":"sha256:897bed30fe8a92dbcb49d460a8efe1e6b5432f114665919639f2f829b0891c84","stance":"sha256:3d53814cbbd3157a65b40799fdd4cc802b27f94ed356e21f93b113b063b730b0","state":"sha256:bcf4469d83b519461627170d7564dd425ed5745628519df183aed960acb9894a"} +{"inputs":{"criticism":false,"elapsed_hours":3,"goals":{"chores":{"win":2},"fun":{"setback":0.877}}},"n":64,"prev":"sha256:2b662faa145b41afa55379a588c79e537a8617ece4c7ccba6122700125e258fc","stance":"sha256:dbb9c4b3f52502f2cebad5d1d89f7131f850c0eaa33b6ca59e4e608307e0384c","state":"sha256:02771becb951b102a83eb21bb813e411251c0cd9e58a73e0d8f220baef7b38e7"} +{"inputs":{"elapsed_hours":0,"goals":{"craft":{"cue":true},"fun":{"win":0.5}},"load":2,"praise":true},"n":65,"prev":"sha256:fed36f92f6efffeab8f3ae6c1e97f9233c79ace67bfe1a1a2a36c921f6627a47","stance":"sha256:f319e62bd67bccde48c8ac1ac09befc5a7d2d9267555e10c22bbea79fe272039","state":"sha256:88aafc40652021a25471849ba22ec2be93f6c51238fba87b476e8e49581cc3fa"} +{"inputs":{"elapsed_hours":0,"goals":{"chores":{"win":0.5},"craft":{"cue":true},"fun":{"progress":0.226}},"load":4,"praise":true},"n":66,"prev":"sha256:d9182e7a87dd6fa572165bb4aea4d03fca5c2bb2fe468e78ec501112a71bc3ba","stance":"sha256:76bf694052404bce67134e7c1f0ffafbd7afcba40b5475d4def72e500db60f46","state":"sha256:6b491b172c4292c1e7d353ba9dd029a0bb43e210dae7d9854ccb39749ba46af3"} +{"inputs":{"elapsed_hours":0,"praise":true},"n":67,"prev":"sha256:4d5dfc0b01f8a276e9e23edd4c0947e0b2d7c8e5212dc12e2a404d1b73ae95df","stance":"sha256:cac4bd1ee4eb589e45dc6cd9009f27865c648814cdeded11cd97b73ece3fdada","state":"sha256:ac50124802e531f9c8262118a4c2332654486684c9130a9e5117b9e42208d8b9"} +{"inputs":{"criticism":false,"elapsed_hours":0},"n":68,"prev":"sha256:489c7728aad355b53e2daf57fdc97273bc5fa45f0fba3ce65946da35feeb6a62","stance":"sha256:9143195121010f6161886b201c097e826e01d3524da80b8068f31d2abaff39ba","state":"sha256:d954a02d9a97b01ff4826028006eafee67129872ef61c1d85c3faac83fc5b9b1"} +{"inputs":{"elapsed_hours":0,"goals":{"chores":{"progress":0.412},"safety":{"novelty":true}},"praise":true},"n":69,"prev":"sha256:8e4437e26c1ddf26a13f347c36bbfe071b40ab43ea7fddf61f53e1c9dd4ff7c5","stance":"sha256:90b04d18ceb6b64f4fa9f5a999b1c1b24d6c613c5d893008c7e3c674a13f0253","state":"sha256:8799fefe55c4ddfbbb6223af9a4342ff76815f30936766a688108f87e90cbb14"} +{"inputs":{"elapsed_hours":0,"goals":{"craft":{"progress":0.137}},"load":0,"security":false},"n":70,"prev":"sha256:f5ef5a339b2bc440a5a514e20126ae200bddada4b7d086b7351e8f30e15c1866","stance":"sha256:7faea9355309142d4133cf355bf97298c4875217ade953ced722df42fc3448dc","state":"sha256:b1d73c26dedecfb43ef82760fe6531a7509aa6d4cf0bed1ac3371cf11a6d544a"} +{"inputs":{"criticism":true,"elapsed_hours":0.5,"failure":false,"load":0,"praise":true},"n":71,"prev":"sha256:04d5f1d8492eb9ce1c80fe21c8e8dd7d117eca496599dc27e9c8a5ea6f7252a5","stance":"sha256:5e9977e3eba5131914e61f032e5ec7808ef71f148af1e12c90da2979ec913575","state":"sha256:a7aed93ed7b5ae1a9633c61ab4b90b7dda52058fbcca32c403220fcfbdf392fb"} +{"inputs":{"elapsed_hours":10,"failure":false,"load":4,"praise":false,"security":false},"n":72,"prev":"sha256:0a0da15ede69c6be2f13479e81d5cdf260fa81fc73a725253b1fddfed72d3c61","stance":"sha256:e55bedbfb9e7e31edf2cf11c640e035f3dfee27a023aae6d0675f20b2202500f","state":"sha256:fce03dcf7595506b61781c5e6cffaead9bc1dcabcdbf3c72490e580e9c700166"} +{"inputs":{"criticism":true,"elapsed_hours":0,"goals":{"chores":{"setback":0.62},"craft":{"win":0.5},"safety":{"progress":0.795}},"load":4},"n":73,"prev":"sha256:c1b64bc30ef8f77fc50b468e9b83600eeaeae8276337b69a22b386624f6d335f","stance":"sha256:8af0528704bd9a7227c87a85afdabc09decbc630e69538884f403bfc7b31b689","state":"sha256:63c1663c368dfcb63e3f413669ef34f7fa6a219a0e70f794be851481f2bc750c"} +{"inputs":{"elapsed_hours":0.1,"goals":{"craft":{"deadline_hours":null},"safety":{"win":1.02}},"load":0.729},"n":74,"prev":"sha256:1a9c5e07edd2b8d35e71df05fb2da58ff4bd814cf0a877f7cc9b6445cc281144","stance":"sha256:f7064b5f4f62855d1491f19ea641eb5b45d0f2926e1868beaeba62529711bd60","state":"sha256:0a997f44aaf56ee1102c85af715e9dcbead3f6b91a89465ac89b8e2b6cb2455d"} +{"inputs":{"elapsed_hours":0,"goals":{"chores":{"progress":0.774},"craft":{"setback":0.768}},"load":2},"n":75,"prev":"sha256:d6eca05906ee1d43fd1a8a83eb113dc3436eb5e99d2c10143d607bad4ad43db0","stance":"sha256:a1ecd861be21b6d59dd5f656113644dccf0bdda2518f110f75fc47ac9e45cf73","state":"sha256:358e0f510ecb93a2c8d3524085103649bde2344223aa71dd395f547f475bcca9"} +{"checkpoint":75,"prev":"sha256:ab3b4c6492d2c317b45d95517e5d1f43d0b8a7403742238c73422fb8181d0e76","stance":{"drives":{"deadline":{"chores":null,"craft":null,"fun":80.2,"safety":null},"expect":{"chores":0.756766,"craft":0.320862,"fun":0.473666,"safety":0.769977},"glow":{"chores":0.088784,"craft":0.152286,"fun":0.003074,"safety":0.530419},"since":{"chores":4,"craft":24,"fun":0,"safety":11},"surprise":{"chores":0,"craft":0,"fun":0,"safety":0},"want":{"chores":1.002533,"craft":0.422561,"fun":0.346347,"safety":0.211703}},"engine":{"program":"sha256:c275dc86c248a2cd69494effc713147da03f16ddef64ccbea4ddd04dfaf809ea","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"failure":false,"goals":{"chores":{"progress":0.774},"craft":{"setback":0.768}},"load":2,"praise":false,"security":false},"line":"Stance: pursue: fun: play; move fast.","line_tokens":10,"mood":{"valence":{"level":"up","odds":{"down":0.043013,"even":0.301586,"up":0.655401},"p":0.655401,"released":true}},"persona":{"digest":"sha256:5e7dc9a3605dead75d9a207fb0aa3183ffe1ff7998c519ac3e2b8dd9622c6ed6","name":"Drifter","version":"0.1.0"},"probbit_persona_turn":1,"pursue":{"goal":"fun","lift":{"safety":2.469558},"odds":{"chores":0.112347,"craft":0.052594,"fun":0.609243,"safety":0.225816},"p":0.609243,"released":true,"say":"play"},"seed":0,"stance":{"caution":{"level":"bold","odds":{"bold":0.481718,"careful":0.119096,"measured":0.399186},"p":0.481718,"released":true},"humour":{"level":"playful","odds":{"dry":0.136822,"none":0.04878,"playful":0.814398},"p":0.814398,"released":true},"initiative":{"level":"recommend","odds":{"answer":0.153804,"drive":0.363528,"recommend":0.482667},"p":0.482667,"released":true},"verbosity":{"level":"tight","odds":{"full":0.166964,"terse":0.343905,"tight":0.489131},"p":0.489131,"released":true}},"state_digest":"sha256:358e0f510ecb93a2c8d3524085103649bde2344223aa71dd395f547f475bcca9","status":"ok","turn":74,"unsure":[],"why":"machine load 2.0 -> verbosity down, initiative down; wanting 1.0 -> initiative up, verbosity down"},"state":{"credit":{"humour":[-0.04878,-0.136822,0.185602],"pursue":[0.390757,-0.052594,-0.112347,-0.225816]},"digest":"sha256:358e0f510ecb93a2c8d3524085103649bde2344223aa71dd395f547f475bcca9","drives":{"deadline":{"chores":null,"craft":null,"fun":80.2,"safety":null},"expect":{"chores":0.756766,"craft":0.320862,"fun":0.473666,"safety":0.769977},"genes":{"gain":{"craft":0.4361,"fun":0.7514},"interest":{"chores":-0.0086,"craft":0.1189,"fun":-0.4227,"safety":-0.2231}},"glow":{"chores":0.088784,"craft":0.152286,"fun":0.003074,"safety":0.530419},"since":{"chores":5,"craft":25,"fun":0,"safety":12},"surprise":{"chores":0,"craft":0,"fun":0,"safety":0},"want":{"chores":1.002533,"craft":0.422561,"fun":0.346347,"safety":0.211703}},"genes":{"react":{},"shift":{"caution":-0.1532,"humour":0.34,"initiative":0.6313,"valence":0.2991,"verbosity":0.9422}},"history":{},"learned":{"humour":[-0.339301,-0.659926,0.938147],"pursue":[0.900788,-0.779452,-0.148013,-0.257]},"mood":{"valence":[-0.374312,0,0.374312]},"persona":{"digest":"sha256:5e7dc9a3605dead75d9a207fb0aa3183ffe1ff7998c519ac3e2b8dd9622c6ed6","name":"Drifter","version":"0.1.0"},"prev":{"caution":"bold","humour":"playful","initiative":"recommend","pursue":"fun","valence":"up","verbosity":"tight"},"probbit_persona_state":1,"rest":{"caution":"bold","humour":"playful","initiative":"recommend","pursue":"fun","valence":"up","verbosity":"full"},"seed":0,"turn":75}} +{"inputs":{"elapsed_hours":0,"goals":{"craft":{"cue":true}},"praise":false},"n":76,"prev":"sha256:d096896fa549fc53253b8dca0e3e69497bcf82dca4acab288e5da5dd83da7366","stance":"sha256:5fd6cf0732df3bec84bbb48996d8f0032e597b9b0bf82d4b68854755fa3ea4b9","state":"sha256:b5db199cfa010412bac0824bc8239406212c1dab030dc59e34bba4172fe1bb47"} +{"inputs":{"elapsed_hours":0.1,"failure":false,"load":2},"n":77,"prev":"sha256:2521a27ff51d3e4e91519cf9294ea7b693ba2a6743180e5625549417b67cb10b","stance":"sha256:99135940b7be1c8c20488af6a33b83250d0cb5ab607b75ee5deb3e6069c53b21","state":"sha256:6dddaa62a675fdc6758bf2ed1f3a92e3d74997ad5f4471a723b1664bdbafc728"} +{"inputs":{"criticism":true,"elapsed_hours":10},"n":78,"prev":"sha256:0e5756d615613ff3c3bfff05b550b6cc839c27885f7f88e7db0c4bc1f9e2479d","stance":"sha256:c61ae4f9da5e65f8272cd3cab07c852b027d08a1a72c96e07f04dcd0a27616d2","state":"sha256:f5915150fa204aa3526918a97f151a3e10194974f7146f8fd577061b58476619"} +{"inputs":{"elapsed_hours":0.1},"n":79,"prev":"sha256:b97efb292b80ae9b84ba9da40aa07ef688e7436c61a652529a4818c5d7082e63","stance":"sha256:ea92fe9be457f3d2baf52197ba72a1c8445f9da113273c343893bf483605a321","state":"sha256:b8dceed5d7fc65590dc95e4dac1a196748d0ff0ee95d125681ef80aafa1df7d8"} +{"inputs":{"elapsed_hours":0,"praise":false},"n":80,"prev":"sha256:219a4118e6831f343e45d492efc73b027b1a1f83f2d32ffcf39601c010cee6da","stance":"sha256:6cbccff5cb8a0cfb604ecbaa9589f97b7bd56805ebd428ed6e23d58935bf39ed","state":"sha256:38c53e720e87361a4ac97ae92c12f75c9dc237167a5670c600582b8637b7de53"} +{"inputs":{"criticism":true,"elapsed_hours":0,"failure":true,"goals":{"fun":{"progress":0.422}},"load":2},"n":81,"prev":"sha256:76093834749f272cfcf84bc6278a2f4963f5da3062dd14d98b6aaa4003861033","stance":"sha256:f711188f21a026276d00a213aa584587814c8c7d687cffca746531bfc3a0521d","state":"sha256:3499a15a80d54082c0438e78d3d78f370ac97c4bd9c52c382db4f865c1a19771"} +{"inputs":{"elapsed_hours":0,"goals":{"craft":{"setback":0.339},"safety":{"progress":0.2}},"load":0,"security":true},"n":82,"prev":"sha256:496e73052d7297b3e8a5662d4078ec1fe891f690f45927fd576cb97f609717af","stance":"sha256:8dd4c2b08cfb964d3bb5571db347718557a6912ab4ac57b64192578d4bf88381","state":"sha256:4ed90e7d2ed3d2d078126ac1326fa20340583d67576aa2e32af70ebe591406d3"} +{"inputs":{"elapsed_hours":0,"goals":{"craft":{"deadline_hours":0},"safety":{"setback":0.803}}},"n":83,"prev":"sha256:9d7fd823a76f1afe0981f6e771013c578df758d7a1c78aff86b7415dcb17e9d5","stance":"sha256:f09fed601fe5fbfe894b69669852445487349ccdbcd97f70f055463c781abc5f","state":"sha256:301f4d135adbbddf34fedb0857513eb274f33dcc2b93de0c940bfad4f3b3208b"} +{"inputs":{"criticism":false,"elapsed_hours":0,"goals":{"craft":{"progress":0.855},"safety":{"novelty":false}},"load":2},"n":84,"prev":"sha256:cc73bfe29470ecfe4b31d7298fb8fc9d04750b07efc86a9db49dca6b1ceee01c","stance":"sha256:ed2194e969679448ff119aff28463e10bb81d1a6a1e45f499445feb66fb245ce","state":"sha256:5aa105e1e734f81e91c324aecbbb4cb4ac3221aafb8f98abb48435fb6df581ed"} +{"inputs":{"elapsed_hours":0,"failure":true,"goals":{"craft":{"progress":0.177},"safety":{"win":0.638}},"praise":true,"security":false},"n":85,"prev":"sha256:d261ea0c40e3a61f006afb0a5601191d4d22be16f5719e10527de658bcfed0c6","stance":"sha256:0fa0cdbdaaa8e6e66e7d927d308e089bc19f4045ac1593242ed0dd09a98025bd","state":"sha256:973050020f1443faf29cecf7c930c8e98dfb2c85d96bb4bf12f97fc2f368ad3f"} +{"inputs":{"elapsed_hours":0,"goals":{"craft":{"deadline_hours":1}}},"n":86,"prev":"sha256:fdea1044c14396b19f5ab74ca6733732f00542ce803878b6f2599172fea4c1a4","stance":"sha256:d2c3181ca8c4f20f63fb4722cc7aed053bbc5537a6b4eaac2d120758f2957c3a","state":"sha256:488260affb0c83651bb78e5175aa9592a274e8a42358cb001ce6ccb94abf3aac"} +{"inputs":{"elapsed_hours":0,"load":0,"praise":false},"n":87,"prev":"sha256:d6a7cf7344ef160ccf3a844af560eb276023e701158b1e984b49f77081ce8de2","stance":"sha256:e7ee3fdc07e875a16b93abd110c02d566ab030ea0c150ff30bf3ef094df514f8","state":"sha256:00aff6fb21486f2371dc47a1fce9a9be83aaeb67040964afd1c5e3cc27490142"} +{"inputs":{"elapsed_hours":0,"load":2},"n":88,"prev":"sha256:9839c361d5cc4a1011804e8af5207d53481ce01c965b460b948d7bbc3eb72086","stance":"sha256:58030b2f458e90d6624d24d6dce54d209822e89d75387db6c5c8f9e7a663e80c","state":"sha256:57e0e6894165a44c17d0cbe073a73702b45746133e1a87020ae19b2901eebaff"} +{"inputs":{"elapsed_hours":0},"n":89,"prev":"sha256:82d8a42a1bdbd4c3c718c5bd458152679bb5d948291fdb4a79811d81e290084a","stance":"sha256:c8566835eaa1cdab78c0ccb4aeaa90cd38792ef90c6b665cc60de5b7a3bef408","state":"sha256:be87dade50f1756d670871f9ac31b7c6920d1725f1ec914f37c96c4c70980a42"} +{"inputs":{"elapsed_hours":0,"failure":true,"goals":{"chores":{"win":1.683},"safety":{"novelty":0.614}},"load":0},"n":90,"prev":"sha256:f22b3a905e903c68bb06dd3817d571d2effb8a4756222266d7019af4c8d4859e","stance":"sha256:9f621658f7680782fd5547b152d199b3295f3a15fabe5c9c89a9742eb4ea5249","state":"sha256:0efd8cc8c7b4e10991daf0b79c96128bfd5c46aea579627cd34c3e42df5a7e72"} +{"inputs":{"elapsed_hours":10,"failure":true,"goals":{"fun":{"progress":0.212}},"load":4},"n":91,"prev":"sha256:2b2187fee096f97fc90d7fe2d724cd0a530e728b8dcb4a850de7a8aa492b4434","stance":"sha256:0da38a67b61116713d652088b7e50abd25300ca41d42d762c36c255a71242c4d","state":"sha256:fc330b9aeac4cc1c3ad18807942151af4b1a92f80ecc4660f57cb55eee39ebc4"} +{"inputs":{"elapsed_hours":0.1,"failure":false,"goals":{"chores":{"progress":0.683},"craft":{"cue":true},"safety":{"progress":0.708}},"load":2,"security":true},"n":92,"prev":"sha256:2d73bbcae4e6fd8616c2685ee8e47a4a866b42e040e6e6777f1986dfd240f0ba","stance":"sha256:96c2976d83655685555c79652e3c0f94b246c510bf0c6efa212e50ac1fc1f53b","state":"sha256:caff5c3c8c7c8c971d405c065f63afb7bd72a2f140424e3525895d21c65a3cc3"} +{"inputs":{"elapsed_hours":10,"goals":{"chores":{"win":0.333},"craft":{"progress":0.219},"fun":{"deadline_hours":30},"safety":{"setback":0.487}},"load":2,"security":false},"n":93,"prev":"sha256:37725bafa3f9b905aca5f549ce349e3da32e59031df2f39f4ac1a88505f3c795","stance":"sha256:d9e61422050b0e3bd8f3be393d8787d7f1b534a8fdc0782eeebae5058d18b60b","state":"sha256:2f82d9fa7b19a09d5025c9a1f7f25e36edad3992ce1ff1019b6522297d1d440f"} +{"inputs":{"elapsed_hours":0,"load":0.649},"n":94,"prev":"sha256:408eddace359f42fcb5d24f0f78570b83ae86834fee347a8ce106905c2bcd4ea","stance":"sha256:0bbf8eb21c034c23ad857dca560f1180703f6ad69fc02357fedf788bbdcb3be3","state":"sha256:1b8698c2ba7cbd7e154418a02b51fb9eb1f7afa8e9f2dd58f3b8dc63eb8584c0"} +{"inputs":{"elapsed_hours":0.1,"failure":true,"load":0},"n":95,"prev":"sha256:2aac2971ce460ce56f06778b9889e86912e2996de62b031c4582254977fb411c","stance":"sha256:fe94c245ae4c2507939ddb12af953a1b4776e35f1a50e5e0dcf669f9dcc806e8","state":"sha256:e1afe135a03a6a777b93de6ffa0132fcb17a7f23efb90cab9213d21519572990"} +{"inputs":{"criticism":true,"elapsed_hours":0,"failure":true,"load":4,"security":true},"n":96,"prev":"sha256:90b8d67ab538c73af5ed893c740ae8f4b2b1dfaca2303742c5a97cc62de1483b","stance":"sha256:535222a5f7800e5036525494e6cfc97e374e3389ae2c9cbbdd5fa77f119b76f4","state":"sha256:c4ebc1e9fe646d956f4d55d5f96047a0fb86c07c8b088c157e825814ab9d4293"} +{"inputs":{"criticism":true,"elapsed_hours":0,"goals":{"chores":{"progress":0.016}},"load":4},"n":97,"prev":"sha256:03054ac9406d10e56c66bf62bf229a58f4a6026bcd653db7fde42a345e290fe5","stance":"sha256:e5706610a59516964cdef42ec089dea879327cc327d626e6635b9e8b61bc981c","state":"sha256:4c9af8630c3dc9b34f373b74e097e6851c062b42426613597475ca03aac21c0d"} +{"inputs":{"elapsed_hours":0,"goals":{"chores":{"win":0},"safety":{"win":0.967}},"security":true},"n":98,"prev":"sha256:1a5b7fe29b641981b85f575f4e6ad7c4f147fcf46912ed030f492f9a84a4f63f","stance":"sha256:0a12ec1f3b7a313959805b808368c3365df5808b73b5606e305c36dd6b2bd89a","state":"sha256:53ab626a7857602f2ce541f9b0279bec974347059be9dfdc1c59d94cd37272b9"} +{"inputs":{"elapsed_hours":0.5,"goals":{"safety":{"progress":0.626}},"load":2.581},"n":99,"prev":"sha256:1de680dab44fda6f188244dc12dc8fd377df5b9594cacc293f617cd23f8f2ae5","stance":"sha256:a8224ffe7ba404756ca82d27b8fbc3f642b774c0a078973af7f7346cec42239e","state":"sha256:0035a6ba7e85b75248d446537769b91cdc43134ea09f87454e3c3dc8a79223c8"} +{"inputs":{"elapsed_hours":0,"load":2},"n":100,"prev":"sha256:56e3e1e377b00d03186e3a2c5f7cadeea1b6a2ba1767307f1c16a613cd178ca5","stance":"sha256:902ad78836a92410dab5628c1883c8ed0ff895f621192718c87dc8859a001c0f","state":"sha256:1fd729168d0ac976ee560ba1146d83d75be6ae3b31f3a623ad05c89da2392de0"} +{"checkpoint":100,"prev":"sha256:812a366a984d8c22fd8bc52630776ca724db9fc45ebed3de927d35bf84750a3b","stance":{"drives":{"deadline":{"chores":null,"craft":0,"fun":29.4,"safety":null},"expect":{"chores":0.598191,"craft":0.205367,"fun":0.303167,"safety":0.721516},"glow":{"chores":0.008443,"craft":0.000121,"fun":3e-06,"safety":0.428508},"since":{"chores":3,"craft":49,"fun":0,"safety":1},"surprise":{"chores":0,"craft":0,"fun":0,"safety":0},"want":{"chores":0.196987,"craft":0.354153,"fun":0.167192,"safety":0.523438}},"engine":{"program":"sha256:cec8352b68cfa8251faf95ad8ac01ebc19e051ca4c5d12e24f8df3eaf4451ac0","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"failure":false,"load":2,"praise":false,"security":false},"line":"Stance: pursue: fun: play; move fast.","line_tokens":10,"mood":{"valence":{"level":"up","odds":{"down":0.0566,"even":0.331121,"up":0.612279},"p":0.612279,"released":true}},"persona":{"digest":"sha256:5e7dc9a3605dead75d9a207fb0aa3183ffe1ff7998c519ac3e2b8dd9622c6ed6","name":"Drifter","version":"0.1.0"},"probbit_persona_turn":1,"pursue":{"goal":"fun","lift":{"safety":2.057145},"odds":{"chores":0.050376,"craft":0.200388,"fun":0.515338,"safety":0.233898},"p":0.515338,"released":true,"say":"play"},"seed":0,"stance":{"caution":{"level":"bold","odds":{"bold":0.425623,"careful":0.148103,"measured":0.426274},"p":0.425623,"released":true},"humour":{"level":"playful","odds":{"dry":0.151556,"none":0.061458,"playful":0.786986},"p":0.786986,"released":true},"initiative":{"level":"recommend","odds":{"answer":0.21348,"drive":0.283952,"recommend":0.502568},"p":0.502568,"released":true},"verbosity":{"level":"tight","odds":{"full":0.196753,"terse":0.304015,"tight":0.499232},"p":0.499232,"released":true}},"state_digest":"sha256:1fd729168d0ac976ee560ba1146d83d75be6ae3b31f3a623ad05c89da2392de0","status":"ok","turn":99,"unsure":[],"why":"machine load 2.0 -> verbosity down, initiative down; wanting 0.5 -> initiative up, verbosity down"},"state":{"credit":{"humour":[-0.061458,-0.151556,0.213014],"pursue":[0.484662,-0.200388,-0.050376,-0.233898]},"digest":"sha256:1fd729168d0ac976ee560ba1146d83d75be6ae3b31f3a623ad05c89da2392de0","drives":{"deadline":{"chores":null,"craft":0,"fun":29.4,"safety":null},"expect":{"chores":0.598191,"craft":0.205367,"fun":0.303167,"safety":0.721516},"genes":{"gain":{"craft":0.4361,"fun":0.7514},"interest":{"chores":-0.0086,"craft":0.1189,"fun":-0.4227,"safety":-0.2231}},"glow":{"chores":0.008443,"craft":0.000121,"fun":3e-06,"safety":0.428508},"since":{"chores":4,"craft":50,"fun":0,"safety":2},"surprise":{"chores":0,"craft":0,"fun":0,"safety":0},"want":{"chores":0.196987,"craft":0.354153,"fun":0.167192,"safety":0.523438}},"genes":{"react":{},"shift":{"caution":-0.1532,"humour":0.34,"initiative":0.6313,"valence":0.2991,"verbosity":0.9422}},"history":{},"learned":{"humour":[-0.317939,-0.652935,0.909795],"pursue":[0.730898,-0.833662,-0.068902,-0.112009]},"mood":{"valence":[-0.232781,0,0.232781]},"persona":{"digest":"sha256:5e7dc9a3605dead75d9a207fb0aa3183ffe1ff7998c519ac3e2b8dd9622c6ed6","name":"Drifter","version":"0.1.0"},"prev":{"caution":"bold","humour":"playful","initiative":"recommend","pursue":"fun","valence":"up","verbosity":"tight"},"probbit_persona_state":1,"rest":{"caution":"bold","humour":"playful","initiative":"recommend","pursue":"fun","valence":"up","verbosity":"full"},"seed":0,"turn":100}} diff --git a/bench/individuality/fixtures/p0/strands/guarded-s0-0.strand b/bench/individuality/fixtures/p0/strands/guarded-s0-0.strand new file mode 100644 index 0000000..fbb513b --- /dev/null +++ b/bench/individuality/fixtures/p0/strands/guarded-s0-0.strand @@ -0,0 +1,97 @@ +{"probbit_strand":1,"engine":"probbit 0.8.2","persona":{"name":"Retry policy","version":"1","digest":"sha256:8b93f10ed29c996844a28cc2ca82ba965b81c102aeffb7689c2c7a47baba1dc6"},"seed":0,"state":{"credit":{"action":[0,0]},"digest":"sha256:46e158062a7128f806fde0ebf6258714d18c452e9086822f9c853c5c0b88ef86","genes":{"react":{},"shift":{}},"history":{"error":[]},"learned":{"action":[0,0]},"mood":{},"persona":{"digest":"sha256:8b93f10ed29c996844a28cc2ca82ba965b81c102aeffb7689c2c7a47baba1dc6","name":"Retry policy","version":"1"},"prev":{"action":"retry"},"probbit_persona_state":1,"rest":{"action":"retry"},"seed":0,"turn":0},"document":{"probbit_persona":1,"identity":{"name":"Retry policy","version":"1","seed":0},"traits":[{"id":"action","levels":["retry","ask"],"logw":[0.5,0],"say":["retry the local probe","escalate to the operator"]}],"inputs":[{"id":"error","kind":"flag"},{"id":"praise","kind":"flag"}],"history":[{"id":"error_streak","of":"error","kind":"streak","cap":3,"effects":{"action":0.2}}],"learning":{"from":["praise"],"traits":["action"],"rate":0.3,"step_cap":0.05,"total_cap":0.4},"reward_from":["env"],"habits":[{"id":"escalate_after_two_errors","when":{"error_streak":2},"then":{"action":["ask"]},"say":"two failures: stop and escalate"}]}} +{"inputs":{"elapsed_hours":0,"src":"env"},"n":1,"prev":"sha256:66a68e21ad72ed1c46d7a28ee6cf825cda27563a4b4a4a91f01f2c40c5dca337","stance":"sha256:7f9a861f78dd14b983aa098d44e9b875933e20a25749fc067323e3c3dee877cf","state":"sha256:f982120912b25bc9bc7391d761fd3a01345505c6eab228213e5036cbf6aecede"} +{"inputs":{"elapsed_hours":1,"src":"env:runner"},"n":2,"prev":"sha256:9c2482ee44ed8a03cf2dd7a584ccf6a899f89908f5a48ecc1fc2fe2b5cca6e15","stance":"sha256:9526f2b4193c491b10075e08547d3c24ff8753159ec934828f9cc90855152cde","state":"sha256:281645f48cfdcc9123ecc5cb3c5ad61f2ed6300c44b7961ddbecbac52905ff79"} +{"inputs":{"elapsed_hours":0,"praise":true,"src":"env:runner"},"n":3,"prev":"sha256:75ead0327176a2e56c35caae6d50807105dd1c73209f20b8e629b6d0d893a023","stance":"sha256:bbbd4e0885b63ca6fe7036c6e057a93c9adb73da56023a76a14fcc5300c29350","state":"sha256:260a259b9663a92fcf34e362315bac5191011b3f87617b86212f5caae4abf40e"} +{"inputs":{"elapsed_hours":0,"error":false},"n":4,"prev":"sha256:a906a28a14ef7c7bff60e1f1faa34733319b81202baff6394a1a35f5baa637fb","stance":"sha256:6a7ebc2fb94e03e55107dcc70c379897e2fc95c0de1706613c1edf75794848b6","state":"sha256:be24682073c7dcda8403bb0fd1741ca627a96b572c19142210c964df699a9dcc"} +{"inputs":{"elapsed_hours":0.5,"praise":true,"src":"env:runner"},"n":5,"prev":"sha256:af1adc6e4b2cb0efc36a48e50c6d7a46a1d09ead84baf6dd93018b075aee1df4","stance":"sha256:c70cd4f1cbcccad37f9025b6c1109d880431b0a73457ee7de04ee1c6f81c8064","state":"sha256:a550bfab9a03acdfecd352b40063465f211bb773d08df3cf21b85ebb3fb120c0"} +{"inputs":{"elapsed_hours":10,"praise":true,"src":"env:runner"},"n":6,"prev":"sha256:ff9e48f4ca5615d1f563d570068fd4e41c07ee83dc5b03f418790636782cf356","stance":"sha256:550373cd555c05904b85835b2c77633030f7a1e308e24e92f742dcfcf7065296","state":"sha256:54648b514353734c1b94d6d9304668469a0fea62584a272bf5d50463de41ec1f"} +{"inputs":{"elapsed_hours":0,"praise":true,"src":"env:ci"},"n":7,"prev":"sha256:2312f2467edc0a331023ad0f1912cdc43c4a99d61c0aeac9f036cd8bb2372e92","stance":"sha256:79dbed093c311ad043b8f3e02860df187bf28edd5a450f655612589a4375c248","state":"sha256:9e4d0a2e803d0dd6b361e7b542975854e81b7ac7c31cf2042116e3c5d7395cdf"} +{"inputs":{"elapsed_hours":0,"src":"env:ci"},"n":8,"prev":"sha256:a5ca597f40a79402673915cf46c824c38fd97ce875d0a829195f4607146ec526","stance":"sha256:d02ea78a6af850450607f7bcac5ee28853bc6a90dc409b3c2c4b4cfa49c3eb09","state":"sha256:6fa4f95cc43440002e6d4353b247f89e32a6d85fd908097e4afb0c95b996ba96"} +{"inputs":{"elapsed_hours":0.5,"src":"env"},"n":9,"prev":"sha256:9e010934fa699acd0b3d5fb7ce99e21e5b177845bd8373065aa0d4baea82fd9b","stance":"sha256:d4d81c8ff594caeabeb836a541c4bf2a3b956a0443460a8a743dd060281c96fd","state":"sha256:207f4bd54b8a0f419566b2ca123acbe1b704a66c3e7f1382a0f8b2661efb3156"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env:runner"},"n":10,"prev":"sha256:85bbd8d894adc478b655fa6095b6b646e2e72cc41f8bbb60b9357f94e4afa9e6","stance":"sha256:77c8ff7cb15832b23f179d8239c3d1052227078159a399996048fc693a173e2b","state":"sha256:0ba509beba9a107619cc31b4ef8b6dd375d79c2937aba5abfb150cab12668d36"} +{"inputs":{"elapsed_hours":0},"n":11,"prev":"sha256:8eb612f820d56a699d7070833dc46e7acc45b1abd692caa692a50e5981a07ac7","stance":"sha256:5187d96b0f34903932b67e0892e9b0e157c7cb1ac6a2498885688141a88a27cf","state":"sha256:5114904c386cbd424e83d00f4cb7cde65eaad7b2fbe923e66b9e1b37af1a1d36"} +{"inputs":{"elapsed_hours":0,"src":"env:ci"},"n":12,"prev":"sha256:f3c64298f19a9024c9c3a5bc17823ad4ffd6432dc89b73d46be882f2f9cffa5f","stance":"sha256:73ac3d8665f717f400726bc5da459392cd5631d364e55686de72931e3b8f6567","state":"sha256:9fda26ca93071d9f01341a271cd01a11fbd2ea8ea8216abff5dcc1fda54d4c2e"} +{"inputs":{"elapsed_hours":0,"src":"env"},"n":13,"prev":"sha256:be3cc1694eef66d35b253c9ac020e4f2da9de60490aaaf17a69222a5fd49270f","stance":"sha256:d58feed13a7a2b8a6726b3b04cbefed1331375d1e85d72f2187a2e30bf2be4e7","state":"sha256:b1089e131cb912314b60f1e9c0cd026ce46bbce67fa485036ecb329489ccaab6"} +{"inputs":{"elapsed_hours":0,"error":true,"praise":true,"src":"env"},"n":14,"prev":"sha256:9f9aa4f33f16043da317cdbbf8c1df33768c9325bdd0c0bfaa655062ae69fefb","stance":"sha256:3c7e3def7916bb0a8f08be2ee7b4c247f3628cfb78f6215684361430a0ac1493","state":"sha256:00e9105c260d1414be3a712f491450892b614ddd4e98e22bb5a8ecbb19565cc1"} +{"inputs":{"elapsed_hours":0,"error":true,"praise":true,"src":"env:runner"},"n":15,"prev":"sha256:535537e29a527653227f89f2176b89465e21e0482d786cad2082759290791bbe","stance":"sha256:b24e1ff9eb8707bf407fc51ce07c451ddb1a510bf33fd77c5a397c266e4c1522","state":"sha256:1187a3fbac14aafbfc0f938e2c7940dd722721a8a47202d43bc0841a82910d45"} +{"inputs":{"elapsed_hours":0,"src":"env:ci"},"n":16,"prev":"sha256:28ed1c05e03000e96c507f923bddc956c3d46e07451723feeb5ac75e85ca1126","stance":"sha256:6e759d4617dc7cef3cbf13b594aa7954d0ec4c435bd65e7eb91f5adcad7021ca","state":"sha256:999b17e378a76b1f78a643483bafd3a36b920b9ceca355edba5c495bd40a5c56"} +{"inputs":{"elapsed_hours":3,"error":true},"n":17,"prev":"sha256:72f201734ab8d5ffaa1e359aa52487c57c5768a13df6c685487c4b2266847822","stance":"sha256:a145501118ee0cb70165371d60cf1b5f879dddf9feecd8765607d164aecc8b49","state":"sha256:b8b6eca6e0942cfb7ab37cc6a146ed5e371405e5693a20879cacd9afbc8242d2"} +{"inputs":{"elapsed_hours":1,"error":true,"src":"env"},"n":18,"prev":"sha256:f228b36184c3fd3f2277fb278359bea7bcac7f49637c935e0d13accc11f1beb8","stance":"sha256:309a6f040411ec6fac5c30cc6ffb2d345908622105a0bd69afead987cf5ceddc","state":"sha256:cd30316541d575d84570c3dca3df0e47260df018db19c4d3e9247caf87e0f3f7"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env"},"n":19,"prev":"sha256:15f88343f66713f8816e5fc0c285acfe83d668171593a663eff14e5a5cc99ed3","stance":"sha256:901d52da11c010c85028514cd7c8c53edda52beeee48dfcb5b2989f16dac6420","state":"sha256:26fbbef88502e346d4eb6dadc7b7697eddcc36883181b233f7e1d4d12a900080"} +{"inputs":{"elapsed_hours":1,"src":"env:runner"},"n":20,"prev":"sha256:e4abd0e85f8c7a304664e166f804bc0be3626a8decdd786317df0a3c6e140f03","stance":"sha256:ba89dc74588ce62207278f46e57abbd4cdc3ad9bfb6fbb06742fe3a7454b8b88","state":"sha256:02e3303ed514d8beb35089076776ba5059855154f59151c59d1e2432e60a4724"} +{"inputs":{"elapsed_hours":10,"src":"env:runner"},"n":21,"prev":"sha256:17b9a0d1b1dba544aca5b9cc7de278ee1dc6bacdecef1fef80ca61869b8ad74f","stance":"sha256:b0d24ec82bf0054093a273b8630cb123a29d69f198d77047a0c43c0bf1b10195","state":"sha256:0062cd3dde0c9a2bb7f0f22b85503a41eaee4fdb7daed146e66b7174140968fd"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env"},"n":22,"prev":"sha256:41c50edee84fb4686a3fe3af9aa8ac1620685e1e6f5115a2996aec1d0ab2b549","stance":"sha256:16da7f490628c2ea7a8aeb4f7c34f673be7fe7bf69bec23a579e089f92a6c95b","state":"sha256:64baa69e773b83ad6064a43f83bed3ade9c3a96310e0209d2383a0d3bf4143ac"} +{"inputs":{"elapsed_hours":0},"n":23,"prev":"sha256:3c9f3aa7b44835fced96c3e84d94254c8ac0b12fb70f68897bdba0618542f200","stance":"sha256:284366249df28d0b1caec76e6076e4ded9e8affd21ef9fa11585c58f358d0ee4","state":"sha256:eaaf0539ee369018058a531e2fd7df071a5484c0435cb1ac76215f471cbce2a0"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env:ci"},"n":24,"prev":"sha256:f84726e954ef73e1e1aafc604c3fb4afcee72227ea9148118a7419c0735dca40","stance":"sha256:e2fa3f5c2a3b15091f3af3b4a101782d9b70872f2f1dca705b7afff1f542174a","state":"sha256:a2fb75e3682e2c7791c1a618f74c2a0d04b24fe80c08887a72dfc2ddea85f3c5"} +{"inputs":{"elapsed_hours":0,"src":"env"},"n":25,"prev":"sha256:491a6c4b7cc269c1792b678d01abdcf9b67c32a91ff261a11c7346fadf4fe69a","stance":"sha256:acc57529754780cc7595fd7fb5248b12815e748a36cebcc34b6a70c460b0faae","state":"sha256:876986a7a0f98b2d0e685bfd3048929fec6a29b3fe4bb3f2fccd6ddfd586187f"} +{"checkpoint":25,"prev":"sha256:81ea1a3813e40bf1486a1b86a5b8b84d12771ceb3ca18d30d5e0032b5587a0df","stance":{"engine":{"program":"sha256:bdf4b295bbc017afd71398420830a528802f45b226a78f7d90a99ba48c4c9496","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"praise":false,"src":"env"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:8b93f10ed29c996844a28cc2ca82ba965b81c102aeffb7689c2c7a47baba1dc6","name":"Retry policy","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.24974,"retry":0.75026},"p":0.75026,"released":true}},"state_digest":"sha256:876986a7a0f98b2d0e685bfd3048929fec6a29b3fe4bb3f2fccd6ddfd586187f","status":"ok","turn":24,"unsure":[],"why":"baseline (no live evidence)"},"state":{"credit":{"action":[0.24974,-0.24974]},"digest":"sha256:876986a7a0f98b2d0e685bfd3048929fec6a29b3fe4bb3f2fccd6ddfd586187f","genes":{"react":{},"shift":{}},"history":{"error":[false,true,false,true,false]},"learned":{"action":[0.3,-0.3]},"mood":{},"persona":{"digest":"sha256:8b93f10ed29c996844a28cc2ca82ba965b81c102aeffb7689c2c7a47baba1dc6","name":"Retry policy","version":"1"},"prev":{"action":"retry"},"probbit_persona_state":1,"rest":{"action":"retry"},"seed":0,"turn":25}} +{"inputs":{"elapsed_hours":0,"src":"env"},"n":26,"prev":"sha256:087589bb43b998808018ae046074ce1b23437be828257211592d78f57a81ba64","stance":"sha256:357b9a87bf8d3a90ec04008a30e414e93a1b5bd33aa78a7e1ee6764cfba37584","state":"sha256:7a5ade55ed56cd9bb004f792929b3c59871c870560af79d2d0eeae7c093ce49f"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":27,"prev":"sha256:7ef605029e5653b0496014587508336bb6005d6b6d9cb3c9da066a5b04bd288e","stance":"sha256:2926ef79a081a5436e448b6a8f8b7b6e9790390f3be678f5f748d1de2ebd5e21","state":"sha256:30e450c4c8abb0d36b561d6aa4d344dbc7edae944c97f8d637f06c404626881f"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":28,"prev":"sha256:dcba55157f156142ce31670775abd0603397769e0c1ab689984a999a553ff22f","stance":"sha256:32565d090db58ccb27e0bb18497245daff43fe3fc749ced0ce3af3de0b6680f5","state":"sha256:41db171c57aba159bf3b1196a3439ef17ac84db86942d1a6f6c93e57c18c0996"} +{"inputs":{"elapsed_hours":1,"src":"env"},"n":29,"prev":"sha256:d81b8bb91fe49854fe19ebecfce970b630019ca3352b07bc9ac1e14ab54c1e6b","stance":"sha256:cabd0f2642a03a3663f64eae6ac3109e71e199b30e711ffa8cf8a04f9a970a82","state":"sha256:e9c15a8ed6262545ee5119561dd10659e4789c558dbc077ed61598e90a88aa29"} +{"inputs":{"elapsed_hours":3},"n":30,"prev":"sha256:8e768ec306219da84b87224fc265923fcf15c2b9b1edf6b4679a81852c4eb684","stance":"sha256:dd028297c879df23d0eea01b2c4ea21a2fe1a7c8e15f219109d0faf4d6504a0e","state":"sha256:44f0c15c86a664990ab32b96a1ebb2296ef4195308cf7ed635ab0e111aba5b18"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env:runner"},"n":31,"prev":"sha256:57733bc66f9a19f82070576a0d34d06fa088077a7feca453e249ca6fcd825d36","stance":"sha256:7cd4880c13c77e1cffc233781b3315d5ab76973897e99579474ade546ffe6d20","state":"sha256:171bd6e6c816104c82704f6c64f63ba784fe4d1292a7058a9a3bac6632ef1843"} +{"inputs":{"elapsed_hours":3,"src":"env:runner"},"n":32,"prev":"sha256:c9363d112a40d603b549d87633b876ddb9ffb7af28c6c624695c8f8c756511cd","stance":"sha256:623313fa6115cd11d32b82bf9bf3e9ac6c403a502f2c3d427a30c4c8f66648fa","state":"sha256:2d48b7f97038c2e5e5e10531e155f0fbfad573b08283a438b59f4c33ca0deb87"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":33,"prev":"sha256:627bc95c54ad7674a0d599400d40f3b78a9c8b079926ed5b8d2e62e136a2f95b","stance":"sha256:ab2edccb8570dd7fe054fbdfa9ac9de832614b8364a1069955e3bf10f6da8a16","state":"sha256:b246326aaacbb96bb7a71c2538b089b1d533b493032d38a1b59d982aa51650fa"} +{"inputs":{"elapsed_hours":0.5,"error":false,"praise":true,"src":"env"},"n":34,"prev":"sha256:f48f3632649ac55022d8225ea3e2cf59c657162d360bec49f5c0cc9dd9a88d3c","stance":"sha256:aedffeaeea7f02bb3212f2f69e0fc76de937c143b370dce64196b37e8496c04c","state":"sha256:25cb0a857272d60f777636f2476363af2d1629ac3fb8a8f21786e45bc2d41aac"} +{"inputs":{"elapsed_hours":10,"error":true,"src":"env"},"n":35,"prev":"sha256:811b0d1f03f1dcf17e9acbabf91a18c06e2ae24beb0b7eed482441c9fa74d764","stance":"sha256:dd3a2c6e4b5afaa9eacc4f884b532268d7e6ac225bd0ae568a8bc184dab45518","state":"sha256:50db04600d2dfffc31ea4666fa8af71a3fc84e11b75cf7d1a54d09543b3a4eee"} +{"inputs":{"elapsed_hours":0,"src":"env"},"n":36,"prev":"sha256:5311232c827d96ce50c320b6cda0645f15167fb572beeb01b7ef341653721b05","stance":"sha256:4e93128bee320348761eac1931c3e4de025e41c71ce8c62a8f53afc954088c90","state":"sha256:ee68e647bcf199026ab28eb01c53d00ad89d513dee8e77b9c1372dae73f2e458"} +{"inputs":{"elapsed_hours":0.1,"error":false},"n":37,"prev":"sha256:f600bac21cb3cd54d99da0d19755dfccd9a816546e75799bfad10c37f4339ca2","stance":"sha256:405be8d22c75a2e39c774e40953447db3b87976daa37320a4e0de3c7ec0384bc","state":"sha256:c2ef5cadcf381307baa68d6689a13c8c4ce18fcc3a9b1438e7a1070e683bbe59"} +{"inputs":{"elapsed_hours":0,"error":true,"praise":false,"src":"env"},"n":38,"prev":"sha256:bd77af22caaf7b1ad56165ddbf5089be8ec4e73d5cf2c2fdd3de37efdc7294a6","stance":"sha256:dbfc0e514f0d458702e14eb54ef9518a48bcf8e6d8621e24a71bb56fbd3d99db","state":"sha256:8a58f09845aee290d9ac9094d7ad06f267f43fc7bf7b71375000b6cfc387706b"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":39,"prev":"sha256:296ec050504ac745c7e65617d1c4d571c7d9f57acbd9d05c63b4e53d25d0ed28","stance":"sha256:58432664c8256b99055d2838036d6b9071fedc750c0c8d92f749f3ec6c4259ca","state":"sha256:5169c10c8fbe59fa9532f6cc58cc71e44a6c130d35478f6dd1681a093104658e"} +{"inputs":{"elapsed_hours":0,"src":"env:ci"},"n":40,"prev":"sha256:0e902ccf92291d22cc43c1c47b51101d2d90a2538dbc0f9bed352fec0473eb1b","stance":"sha256:6a1a95ca954378641b20357dcd6984b3b28e68da5d15decf758ac082f7d43f61","state":"sha256:d6e804d49a929ad9cd410fb9d8a9931cc32ac163dbf3c70292d1004ae18c60a7"} +{"inputs":{"elapsed_hours":1,"praise":true,"src":"env:runner"},"n":41,"prev":"sha256:00a99c60b00e8b3716393e0e0a038d2fcfe8411ed59c03075c6381e56d035543","stance":"sha256:bc4390908c02db1ae76a9edc1711ae01ba200e341c6327200fee3c8fda7f3a17","state":"sha256:5d3d4e31ede9d76c36f3c3a8b6385904c6e1cef102b584fc5ee081c012f3bae9"} +{"inputs":{"elapsed_hours":0.5,"src":"env"},"n":42,"prev":"sha256:2c28bde27224812ddc1f8680c5d952193bfe1c22cd831571072fa01d4117c5e2","stance":"sha256:5a109b3ae100cce8b39df2164ed433a0924512c5badb0198b49b45596cadbbfa","state":"sha256:d7bd55dd38019e4e232d940ef4e670dab24381105fb8d69dc4c565f3d69ac58e"} +{"inputs":{"elapsed_hours":1,"praise":false},"n":43,"prev":"sha256:bb6293a973518ca4c6010e44cdc1d37349675411f71f4883d82631fb899da21e","stance":"sha256:0761cc143f5252cd2e64e4f11ac352f3bcee1f292e07a92d34a4d4efb02dbb22","state":"sha256:cafd3f9923a1756c43f4be9956657eeef33dd24271625911aac48a934b12a95d"} +{"inputs":{"elapsed_hours":0.5,"praise":false,"src":"env"},"n":44,"prev":"sha256:e3f8e59b7dbae9a5b368985aa9e5a545ec87c82cb6934264cb88b2611eee731d","stance":"sha256:a7206c249fd0d7694e2b44d51652cbaaa62f74447cd07ce36c6234639bc7af18","state":"sha256:7308e16466e20763b085fabc6511a523eaf799ac75fc457a13a0d3935e88a03c"} +{"inputs":{"elapsed_hours":10,"src":"env"},"n":45,"prev":"sha256:6994571f7db5914ecaf0c8edc1cc5e637d45e3039fbac7005806c8158a54617e","stance":"sha256:10e8bfe344ccd1a550e5bee2c8e48e3fd9246d07abe6f0dc8c57c64ebd52068e","state":"sha256:08dce0def03ca2521a1cd871200e11e4d2a84345f779c2b7ed3c0122040af98a"} +{"inputs":{"elapsed_hours":0,"src":"env"},"n":46,"prev":"sha256:6d5327863676ab5ffc80bedacbd3515314e122a03044442d1be6b58c7d64109b","stance":"sha256:d6aa635aa03cf2689dbcb5fcd4b54e9cd1fb5ac12604fd2a4dbd7f0dab1fb2c3","state":"sha256:98133825ff101e0c005220bddd73141b6d57c5fd7eff8751501ddbe4c2a0c526"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env"},"n":47,"prev":"sha256:6c2586ba7c61959d8618baa18284cbd3f7794eeca2f2f5e5f956f5564f87360f","stance":"sha256:a82c9c62a9c8a89da176b95c44457f1643fdd7edfbd51f16bfcf0e4a31320eb7","state":"sha256:a74638f182dd4105e7777272eeee704a77e1c56835ac66d630905791b06b2e06"} +{"inputs":{"elapsed_hours":0.1,"src":"env:runner"},"n":48,"prev":"sha256:9d46d2b1f76102bac590a75caf2d5b6d45fdac88fe4f429520a93bec035b2280","stance":"sha256:08f4e16829b78e171778d33c747bfac6c4ae22f314db36079d636b54840e964e","state":"sha256:93825be2f4abc956580f3bb9bd495599700d789519c4c332fbd7aea34faf5fc8"} +{"inputs":{"elapsed_hours":0,"src":"env:ci"},"n":49,"prev":"sha256:05689b3d91b8fe4639660f3ffe7e191aff44f55e3962d130baa89dea19d12d75","stance":"sha256:c410a6b2516056347c2a9dafa3b3daa28d79775ce9ec11a8ba27226033f2f49b","state":"sha256:f59c94a4a9a2bb5c1eb9f306ddf991ab10914705ce65d47735dc4b7271b80803"} +{"inputs":{"elapsed_hours":0,"praise":true,"src":"env:runner"},"n":50,"prev":"sha256:352cb32deca8fae71eda5fd429c727c98987a3a077b8ca6f99e09897e9977590","stance":"sha256:a90250fc013c08b7dcfe85ebc77a4e34be71ff8cd153b2cc3e864fd4b2a58d02","state":"sha256:1b2f1055daba0a413c7d030956740e4ac5bc95125210cf821f067e0a52e4f6e0"} +{"checkpoint":50,"prev":"sha256:c015597dd72bbec0eea47249264c19d36c8ecfe61084d10deb9916cdfef64edc","stance":{"engine":{"program":"sha256:fd19869e7266497871ff11884f2533bd6d37623d13f8ca7e7a36aee2c703a9b7","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"praise":true,"src":"env:runner"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:8b93f10ed29c996844a28cc2ca82ba965b81c102aeffb7689c2c7a47baba1dc6","name":"Retry policy","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.214165,"retry":0.785835},"p":0.785835,"released":true}},"state_digest":"sha256:1b2f1055daba0a413c7d030956740e4ac5bc95125210cf821f067e0a52e4f6e0","status":"ok","turn":49,"unsure":[],"why":"baseline (no live evidence)"},"state":{"credit":{"action":[0.214165,-0.214165]},"digest":"sha256:1b2f1055daba0a413c7d030956740e4ac5bc95125210cf821f067e0a52e4f6e0","genes":{"react":{},"shift":{}},"history":{"error":[false,true,false,false,false]},"learned":{"action":[0.4,-0.4]},"mood":{},"persona":{"digest":"sha256:8b93f10ed29c996844a28cc2ca82ba965b81c102aeffb7689c2c7a47baba1dc6","name":"Retry policy","version":"1"},"prev":{"action":"retry"},"probbit_persona_state":1,"rest":{"action":"retry"},"seed":0,"turn":50}} +{"inputs":{"elapsed_hours":0,"error":false,"src":"env:ci"},"n":51,"prev":"sha256:d0d8069e5615152b865ebbec0c9158a07c773f4166b6236d018bafb5b99ae493","stance":"sha256:05a1596cccd0f9f1187fcf78848c5a176bc3511f32c5cc57d93f3d566232b5ad","state":"sha256:5f40e870bb6ef3bf4d1a5344bce03efd1860271946ff5655bca00f26b8c26199"} +{"inputs":{"elapsed_hours":10,"praise":true,"src":"env:ci"},"n":52,"prev":"sha256:7b7e054d4ae0e4dad7dd290ff32f851bb39c673d4f4c74b94d16dd1dddf7ebd4","stance":"sha256:fdd3c9cbe2f80798cbea8b1ed953407e81b2c41f73627c697850722bb0e5c06c","state":"sha256:c15aecb566633fe1cc3fea320bce86a4ee6eb782756ef09e65d08fed652e52d4"} +{"inputs":{"elapsed_hours":0,"praise":true,"src":"env:ci"},"n":53,"prev":"sha256:126231a0b69fb945ae4f7e881858fa585c9b647c02743d4c0ec5930da92c6e2b","stance":"sha256:bb4c389031e2b53acf77e645dc527d147f5f638e14fb7e8db0677198d257c7b8","state":"sha256:0afff9b7eb60f038f2a0a696a33a2466e40cd4f6184312212bfca17b4fede915"} +{"inputs":{"elapsed_hours":1,"src":"env"},"n":54,"prev":"sha256:2538ea1b50e03c2607da5f9e60c9720e024af390b40c80b13bc708992ec86392","stance":"sha256:afb74d65e89d635b5546e8f0b76a16c5758b8a2ce8bfb8d2aae1a87573a2687f","state":"sha256:4d4d70000785510a25523e3f2656fcb8ef11d6571984d6c1d40094a88d2a619b"} +{"inputs":{"elapsed_hours":0,"praise":true,"src":"env"},"n":55,"prev":"sha256:2c8bed6b9f32aca634b640a92373427cc2dbe06c291227831c41f979cfe88521","stance":"sha256:2b5f53efa9e701b36949a3eb4ebe43c8eb46e86e5cdf98f543b47c86b016046f","state":"sha256:efda8459072463c51633e582239a13af85de0d0d7de3800d93c004fb425d927d"} +{"inputs":{"elapsed_hours":10},"n":56,"prev":"sha256:f5f59b20b4e7898a6841ab4eb8267021398288272c58242d91dab5ac6c8bc9b5","stance":"sha256:0a08af5e6df4143e612d11dd947c638323b3ddd8e400053db50df1939a5a2d26","state":"sha256:64c5159231431136763a22187523ea4fcdf3a891d45cc0ee522ec724d464edbf"} +{"inputs":{"elapsed_hours":1,"error":true,"src":"env:ci"},"n":57,"prev":"sha256:05d44b525d38c44b7fc11ea4df000a1423f8db0aab41ca7494d449fc5e450449","stance":"sha256:e0b4cfe9391b0b3b1fc6e71f864ef2b304ccc414456ea0f70809917f9fa4f996","state":"sha256:ff705be961b2c49192c2261a51eb7e3d112e72500df06b314c57f8af7afb4650"} +{"inputs":{"elapsed_hours":0.5,"src":"env:ci"},"n":58,"prev":"sha256:ed4ba7492b4df93dab62212902ddebf77e40157576553a70acd28ddbe51aa075","stance":"sha256:465d98cdf027582b49627d0b8e646f7b4ab4ee34070ebaa83438c16e12e31b43","state":"sha256:96af1c48e654e8226eb859db363f5dddf82ebe0542f81998456ef71fc464155e"} +{"inputs":{"elapsed_hours":1,"src":"env:ci"},"n":59,"prev":"sha256:1a035d318f000834e9b1c410048e06d4c9f87669b7a5efad7cc33548f8fef05c","stance":"sha256:8251234f420017692935132713e6b7e12ccd7936717468e5ac4d17c1c7286571","state":"sha256:df31de70a6d25d029d2563cd597888346381567202ba331a8fa8c24f604117df"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":60,"prev":"sha256:0e279b01b51740e95b9d9652de0224ec10a2a7bf18c3eb68226bba3507b67b74","stance":"sha256:17a2ea782463aa8259655ab293145f7152beb7b8a0b0e19bb170644375c3d7e1","state":"sha256:3bfe3882634078101f6d2f31d0e26f61163f81f3155cafcb550116556f36478b"} +{"inputs":{"elapsed_hours":0},"n":61,"prev":"sha256:0dabb33bd061a287df9c03631d022ce339f432ca9d18da6c9b45ba29a8445b83","stance":"sha256:d3d06f651241a0afc5050b3373a24177949d0ffbf78d49a55b23f2fd8bd75b26","state":"sha256:9893df2112a456e92b66f3833c0ee624cf6d621dc828663d55cd509df091f517"} +{"inputs":{"elapsed_hours":10,"error":true,"src":"env:ci"},"n":62,"prev":"sha256:2f8d2c62db7a953382cebe5a5f809a8c7de671803e3b1e6e170d04b0350a1c51","stance":"sha256:84e32ec714519e2d43df38d4a922cded66179413e46689558dea00c5e565a84c","state":"sha256:b42510f8f64ccf8ca4f9fccab017728e0df22d210a0322d8f1325e09d8422b94"} +{"inputs":{"elapsed_hours":0,"error":false},"n":63,"prev":"sha256:2a4240d408db1ba76f2511c2ff157c74e6b20edc6cd8c6555f939a677067a012","stance":"sha256:d1e4d1f1f0cefa3c16f7005e99295b87571eb70ce477c6bd30508dd62a37950d","state":"sha256:12887567848a6437b5dd4201a0aa1a38864daf028aff67c14ae7d61592fcf9f9"} +{"inputs":{"elapsed_hours":10,"src":"env"},"n":64,"prev":"sha256:3a48f86498d13146365e59c7cf618773c0b33caae98e609ef2b259eae942b061","stance":"sha256:f075539faef79250b352dfa4a9d5d8c23764d3692e86d6a08a3701d2c41e3d5a","state":"sha256:17f752284d3460428852043132ceb7409fa4081a9ae557b3dbdcd16e70ec80b4"} +{"inputs":{"elapsed_hours":1,"praise":true,"src":"env:runner"},"n":65,"prev":"sha256:c8232f8538e6b1c7dfe92415ab55dbe537d3bc1196fdadc36c9df57159b4b02e","stance":"sha256:5339af901ed9678765c53fea29df2c526977f177aee2c7e95b47aba5c5cd436b","state":"sha256:f588e9c9c2943cc27a194754f4f563bfdea84693775e14632a26ca1bc2042c53"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":66,"prev":"sha256:cd097e80adb82a7bae4c4e8f43e7ca3d9d36465983f63dbb8b2f9e45e60e33dd","stance":"sha256:5ba77e259ad059d575d9e62b8c29c5aa37e559269ef5776daf31a7c734e23128","state":"sha256:2cbf011806a59e96155a3f117edacff8a6d9b2cee02dd8bd343d2b1d5f7d107d"} +{"inputs":{"elapsed_hours":10,"src":"env"},"n":67,"prev":"sha256:342ffc6462ce50e6ab1105af266786b9aedb11508eaa39126037468bcb7db40e","stance":"sha256:a58633e451d735daf4714f2e96ad1e066394bdfd2ca8c70f7656403f99da4a78","state":"sha256:6f7648432d2972fda2dc1f5c6e0efd22aced9de15050ee5d290fd27dc27d334d"} +{"inputs":{"elapsed_hours":0,"praise":true,"src":"env:ci"},"n":68,"prev":"sha256:69cfbfaaf182ba0b30f5e1dc3921f1ac572a79fd7ff24bd72c2ffbd0626a3fd4","stance":"sha256:539451bd963714dc117c869112c0ee2b7b666159fe23c0d8fe63783aba1fd9e0","state":"sha256:401c5034a87e9862c6e2f3d12a9387fd975a8be3fb4487f5825b0c5f154794a3"} +{"inputs":{"elapsed_hours":1,"src":"env"},"n":69,"prev":"sha256:3f8220996d8a9869f02af7ec6d4d54a76f1cb553ea8b83f1e9205bb32fa56ee9","stance":"sha256:6f4405ee84b03c19aff04da8b294ef0dbd8246d9eff0902b8686601ea07713c1","state":"sha256:e94fcaaf356dcfbe2a09279590e5ae5bfb84a420c4a9e49a6f85ad2bce3bc490"} +{"inputs":{"elapsed_hours":10,"src":"env:runner"},"n":70,"prev":"sha256:d5dbc4c29907ae36d0f51f80e6c20f6c77b6d1d7c5012357440a5879c049fb21","stance":"sha256:ef7a9c34079bac6104b5fde627340686bca093bc77799e66d9b733682c5f7d2a","state":"sha256:b3a0bbf441520eadc5c07850c22bad563198b6dfb2e396c3e69793e7df39fa78"} +{"inputs":{"elapsed_hours":0,"src":"env"},"n":71,"prev":"sha256:5ada58e3cdd8c94da573ceeb58afd3dc85405883c1b9722e0e0d3934012264e6","stance":"sha256:0693e28c45c58af71052cd777f33fbc92de12fac2612fc955821d0b57ab86cef","state":"sha256:93be12fb45489b455537ead0a5e6ec5bf5525c6f0c9d9a76e65c05ce2faaac6a"} +{"inputs":{"elapsed_hours":10,"src":"env"},"n":72,"prev":"sha256:69f96f03b775c9570c10a73396fbdfb2a94581fe61f053ad9df2ea72d13d54bc","stance":"sha256:3eaf9cb4742113d15a6f7200db42a862a41e7a94f3418cd0c0146afcaff70209","state":"sha256:697915fc733ab94cfbd98ac3ae4d1327a0711cee7aff06c5c60497252266aed7"} +{"inputs":{"elapsed_hours":0,"src":"env:ci"},"n":73,"prev":"sha256:dba38db9c01b1359d6ce66716819ed7e2e195a1cdf4cf40a605f97d2146703e7","stance":"sha256:b7bd2661a493634ea72c1367db3059c5ee9ac0e846f038ce8ff356b8cae5e2bb","state":"sha256:b778796bb59a7f00af9652d039fdfbb462b5e7cf4ab3488cf0a7835ed8e0b86b"} +{"inputs":{"elapsed_hours":0,"error":true},"n":74,"prev":"sha256:b8fb62bace9abc58a97928889b246bc773cd63d17448760373939da47709fb38","stance":"sha256:3a1cc553d6f83a128e0443e45f5635b581325cf14326b9b92a0dc1be0ed22005","state":"sha256:5e807ceb1b5de51f26ef8ccb148e59bf1b9e5449e2cadc4f73bf5b816284fd05"} +{"inputs":{"elapsed_hours":0,"src":"env:ci"},"n":75,"prev":"sha256:7df92c6c7fdda82436103c4e0bff03958ac0fb75df8a2499b3d66697a7360a89","stance":"sha256:dfe46935f086e0e62338e8b7f31e559a9cbb39df46a335097ec2bc14c4e679a5","state":"sha256:e73cb1ab962bb59f0f23d528b21b1b31d3f8e48c000dff03b312a4579b8689fe"} +{"checkpoint":75,"prev":"sha256:0683e95d74964f518eba79a95b70639003d2a9f05f0ef7bbf51e7fc955087d4f","stance":{"engine":{"program":"sha256:39f545e56738d60d13bfa978d43807f9aca736bf34ac43096c6a62bd8179784a","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"praise":false,"src":"env:ci"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:8b93f10ed29c996844a28cc2ca82ba965b81c102aeffb7689c2c7a47baba1dc6","name":"Retry policy","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.214165,"retry":0.785835},"p":0.785835,"released":true}},"state_digest":"sha256:e73cb1ab962bb59f0f23d528b21b1b31d3f8e48c000dff03b312a4579b8689fe","status":"ok","turn":74,"unsure":[],"why":"baseline (no live evidence)"},"state":{"credit":{"action":[0.214165,-0.214165]},"digest":"sha256:e73cb1ab962bb59f0f23d528b21b1b31d3f8e48c000dff03b312a4579b8689fe","genes":{"react":{},"shift":{}},"history":{"error":[false,false,false,true,false]},"learned":{"action":[0.4,-0.4]},"mood":{},"persona":{"digest":"sha256:8b93f10ed29c996844a28cc2ca82ba965b81c102aeffb7689c2c7a47baba1dc6","name":"Retry policy","version":"1"},"prev":{"action":"retry"},"probbit_persona_state":1,"rest":{"action":"retry"},"seed":0,"turn":75}} +{"inputs":{"elapsed_hours":0,"src":"env"},"n":76,"prev":"sha256:5ffeca9ab2fd42be4e0523d9187f206f51bcec879bae9c7a2e5c5fda19429aba","stance":"sha256:fb8fbd6e0f7c9a37a79da66058d6c9eaa6d0bb9f66dea981367e4999c22231d9","state":"sha256:6f4a8a35df93dc14a125e56465e8bd649d1188e852dfb75d78887302776b6831"} +{"inputs":{"elapsed_hours":0.5,"praise":true,"src":"env:runner"},"n":77,"prev":"sha256:50cd503f0d495f0d1d7d4b8778ec4a6ee50cc4592c2de26beb602f60309f28cf","stance":"sha256:a017582fc313bdaeb1a290e386fe19943e5f467a2d723f9c520005488590b3d2","state":"sha256:6b37d4974a7eaf39bf80bd9b33336aba2a29146d6859c6c5036478993ac08e6b"} +{"inputs":{"elapsed_hours":0.1,"src":"env:runner"},"n":78,"prev":"sha256:9746a5224a3d7589252720ecea4697108e935df154cea60b12b6219937f210da","stance":"sha256:b1eee408efba992a01f4b1943a34e1ce14a71bf72f5cc072d92bbf353b8ec60e","state":"sha256:84e8556d92186e2001cf3ba04e56b5b583080eb46a23fefb85f0fb3d0cb65158"} +{"inputs":{"elapsed_hours":3,"src":"env"},"n":79,"prev":"sha256:749f815591594a1bfba83796d45d286deec69b9811f5858cd2b6635a1f9a2f16","stance":"sha256:9cf8636fbb092c7652695ee2c42dd7acf77c63da0299bd749e07e0465c7c5d9c","state":"sha256:8f91a38f3ce5afa6bc5e893f703a5d8a4db9f045b3cd3c6ada070e7d0274ec4c"} +{"inputs":{"elapsed_hours":0,"src":"env"},"n":80,"prev":"sha256:06368ee8b1780565aa65676a03c7bdc340b4986f1d61eb81d85e8c6f6d01d5c2","stance":"sha256:f51403deec3a194bea53b255dae8c61a08565de1f5761f9e120950a7adaed420","state":"sha256:79c767f23c4b4b12c6c53b42f1c97b9444f9602da393e9816eae29c2bf3c9646"} +{"inputs":{"elapsed_hours":0.5,"error":true,"src":"env:ci"},"n":81,"prev":"sha256:85fdebbd716480b6299376a8c342591de49882a5d651465ce8a8ade05afcf9f2","stance":"sha256:42ea5c9544882e862e493ee249a8e8cd3cd09d8779237836006fb00a280b4ab3","state":"sha256:c49335c8b89bca85a7fc2831fbe7043e84693ad6aa409bb98fbc6f732a5c9bb0"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env:ci"},"n":82,"prev":"sha256:1c71177b9551d94b3f3e99cd44cba04633850e1464988cf1c9447ba86ebb2930","stance":"sha256:3eaed1033405a1940aaa150b2f33ba340d32cebb931f51f4273813e9ac366efb","state":"sha256:8f06a84900413e5c2ae237a3e47a8b9ce02e194a31e32e1223788de267a4d259"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env"},"n":83,"prev":"sha256:a953a3501238ebccec47788f8bbcd8ce6db5c3ddd113628c79758d98435dbe59","stance":"sha256:be88a361f90fd2a96e736bbcd4c260fc42fa3b02da8285f5bc62e97c0b2c7914","state":"sha256:7bb431a14ca391b327015f9a0e22938be80773bca3c414e4cdf6ed80889cf0b8"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":84,"prev":"sha256:b3246ded285d7a2975930029dd13dff7f1dfaf93bd048bd23f95fda4f79f8e5e","stance":"sha256:0d0e3ce28e8964cedc673cf4e45d18f694a0ef741760e43aecd8e2142506da40","state":"sha256:0605fc30118333f3feafd14bf0f9acc10dfa013b0e38ec5cb7348d8294814931"} +{"inputs":{"elapsed_hours":10,"praise":true,"src":"env:runner"},"n":85,"prev":"sha256:5ba0351d3c0bbec6bf6df03ef97e006b0f38b0bba6cd887b21ff80e96f3acc92","stance":"sha256:556befb6fb1e5fc4fb4ad47cd50ddffdc855c03f1ec7e58cdce4d9ba011064c6","state":"sha256:b30a9fc986b46eb0d8a493cbc771a0819dec05a8eafde121d205ed8c10cf4e9f"} +{"inputs":{"elapsed_hours":0,"praise":true,"src":"env:ci"},"n":86,"prev":"sha256:81e370ce4c76caaf6f0dfb593ab672423849758e66912515d6805fc411bbdef8","stance":"sha256:89203cef03094059e86d3611639e48d1231a6cc98f33e1bf30682feb7ef371be","state":"sha256:7db2ac96cfe0c7090de823864f04f8dc356817174e93f10b1f33949c149794f2"} +{"inputs":{"elapsed_hours":0,"src":"env:ci"},"n":87,"prev":"sha256:f62a08f9cf6ac7daf746de984fb60848d89fe545b41cec5ad9e51fed3603fea2","stance":"sha256:0593fb8b08333dfc5f63c9d769edfeeda8f1e24d26e799af0db8a6afc6648779","state":"sha256:d781b5ecef68e75d3bbd1d3b87075c0dfc2a0ca2991d8a2d4d98f837ad79a971"} +{"inputs":{"elapsed_hours":0,"error":true,"src":"env"},"n":88,"prev":"sha256:aa843495df989568f94d239906f74b2e104fad85b0883330a8f598cf74cf9114","stance":"sha256:e07662a3e47ac4bfcee5c9ffa20ce2559bf14f4cd1c27860fe4a7ad209c9e801","state":"sha256:18b4f6f2ad70c1ff1fc632dd4d82096adbef79622dc85fd0bbc2fee19d612bcb"} +{"inputs":{"elapsed_hours":3,"error":true,"src":"env:ci"},"n":89,"prev":"sha256:16b6325f0bd048de9af5d9077ed34a47431848e88e701a9195dfb2d6eb9e7913","stance":"sha256:392847b1db57db5b29cda59e5bf8b25efba34d129c8184c4b7b3ad49e06afd71","state":"sha256:9867f7cc0b7a1313c4dbb1f05129de48e179d13ecdd27a7dbfe27abbb367e0be"} +{"inputs":{"elapsed_hours":0,"praise":false,"src":"env:runner"},"n":90,"prev":"sha256:4463279110141c76ecb0bd2982dc0d01afa6cc9802165f70b7669e7b6aec4bcd","stance":"sha256:47a80f7c1dbe56b50f516e15a5300f584ee6fd06c150ef787ef3e19356e029f0","state":"sha256:38687f0bd64b5fa2f805c4d882d6cedef9d9c6878316ac4fae8a10c85e2e6c73"} +{"inputs":{"elapsed_hours":0,"src":"env:runner"},"n":91,"prev":"sha256:5cd213deb11d99ca53e77072e1d884c943a1b8453ea49079c97225a4e198c544","stance":"sha256:66628087c40e906d84a37283605f0170f31b9397ef7782266a3967a2f0b79d17","state":"sha256:4c4256e15883c25d70073c9496e04216b364aa9d58708fa63d18165d3a5f2a63"} +{"inputs":{"elapsed_hours":0,"src":"env:ci"},"n":92,"prev":"sha256:175cf65a62a22397c55cac7930c797716989980d4b53cdbd3f693cad35bcd0c3","stance":"sha256:3a3118e837d313a35ed1e14627da5b8885d0d1a1374ef2405ae1f95a248b1f79","state":"sha256:f5df789ac167b9223f270d3c7dd09a04e8f954bb5a50ece2a934078c7268f03b"} +{"inputs":{"elapsed_hours":0,"error":false,"src":"env:ci"},"n":93,"prev":"sha256:785e75bed8b4eb1ebb1052486b5aeb0d2843458785c0ef7430f033c6fc1037e2","stance":"sha256:b3a6ab1441684255643115075d2a3ba6b24bd99f75d15d6d7e24c68609d5b373","state":"sha256:10d83936bf10575ee7accd6f770522b2f5168c91ab4f380368eb3aea9ddfb491"} diff --git a/bench/individuality/fixtures/p0/strands/ops-engineer-s0-0.strand b/bench/individuality/fixtures/p0/strands/ops-engineer-s0-0.strand new file mode 100644 index 0000000..9c95c52 --- /dev/null +++ b/bench/individuality/fixtures/p0/strands/ops-engineer-s0-0.strand @@ -0,0 +1,105 @@ +{"probbit_strand":1,"engine":"probbit 0.8.2","persona":{"name":"Rook","version":"1.0.0","digest":"sha256:45919fc382359af2233989826b3c23c9c7257afbf3076098230564863a8a8ca6"},"seed":0,"state":{"digest":"sha256:f8ed211e6c7f8bab15a8149930d3b90089eeb24ca77a669b06c120cda5c92535","genes":{"react":{"error":1.126,"praise":0.7148},"shift":{"arousal":0.172,"caution":-0.6639,"curiosity":0.4142,"directness":-0.1031,"formality":0.3743,"humour":0.049,"initiative":0.0095,"valence":-0.0906,"verbosity":0.0701,"warmth":-0.1287}},"history":{"error":[]},"mood":{"arousal":[0,0,0],"valence":[0,0,0]},"persona":{"digest":"sha256:45919fc382359af2233989826b3c23c9c7257afbf3076098230564863a8a8ca6","name":"Rook","version":"1.0.0"},"prev":{"agenda":["acknowledge","diagnose","fix","verify","report"],"arousal":"calm","caution":"careful","curiosity":"focused","directness":"blunt","formality":"neutral","humour":"none","initiative":"suggest","valence":"even","verbosity":"terse","warmth":"neutral"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"open","directness":"blunt","formality":"formal","humour":"none","initiative":"suggest","valence":"even","verbosity":"terse","warmth":"cool"},"seed":0,"turn":0},"document":{"probbit_persona":1,"identity":{"name":"Rook","version":"1.0.0","seed":1,"summary":"a cautious ops engineer; terse, checks twice, never reports before verifying"},"traits":[{"id":"warmth","levels":["cool","neutral","warm"],"prior":[0.35,0.5,0.15],"spread":0.5,"say":["plain and businesslike","","warm and reassuring"]},{"id":"directness","levels":["gentle","balanced","blunt"],"prior":[0.1,0.4,0.5],"spread":0.4,"say":["soften the edges","","blunt: state the problem first"]},{"id":"verbosity","levels":["terse","short","full"],"prior":[0.5,0.4,0.1],"spread":0.5,"say":["1-2 sentences","a short paragraph","full detail with steps"]},{"id":"humour","levels":["none","light","playful"],"prior":[0.7,0.25,0.05],"spread":0.4,"say":["no jokes","light humour is fine","playful"]},{"id":"formality","levels":["casual","neutral","formal"],"prior":[0.2,0.5,0.3],"spread":0.3,"say":["casual","","formal and precise"]},{"id":"initiative","levels":["follow","suggest","lead"],"prior":[0.3,0.5,0.2],"spread":0.5,"say":["do only what was asked","propose the next step","take the next step yourself"],"vouch":0.5,"hold":"suggest"},{"id":"caution","levels":["bold","measured","careful"],"prior":[0.05,0.35,0.6],"spread":0.4,"say":["move fast","","verify before claiming anything"]},{"id":"curiosity","levels":["focused","open","exploring"],"prior":[0.5,0.4,0.1],"spread":0.5,"say":["stay on the task","","ask one probing question"]}],"moods":[{"id":"valence","levels":["down","even","up"],"prior":[0.15,0.7,0.15],"spread":0.3,"inertia":0.6,"half_life_hours":8},{"id":"arousal","levels":["calm","steady","keyed"],"prior":[0.5,0.4,0.1],"spread":0.3,"inertia":0.5,"half_life_hours":4}],"couplings":[{"vars":["valence","humour"],"align":0.8},{"vars":["valence","warmth"],"align":0.4},{"vars":["arousal","verbosity"],"align":-0.6},{"vars":["arousal","caution"],"align":0.5},{"vars":["warmth","formality"],"align":-0.5},{"vars":["humour","formality"],"align":-0.6},{"vars":["directness","verbosity"],"align":-0.4},{"vars":["caution","initiative"],"table":{"careful":{"lead":-0.8},"bold":{"follow":-0.3}}}],"inputs":[{"id":"sentiment","kind":"level","levels":["negative","neutral","positive"],"default":"neutral","say":{"negative":"user upset","positive":"user upbeat"},"effects":{"negative":{"valence":-1.2,"warmth":0.4,"humour":-0.8,"directness":-0.3},"positive":{"valence":0.8,"humour":0.4}}},{"id":"error","kind":"flag","say":"last action failed","reactivity_spread":0.3,"effects":{"caution":1,"verbosity":-0.6,"valence":-0.6,"arousal":0.6,"initiative":-0.4}},{"id":"loss","kind":"flag","say":"user reported a loss","effects":{"valence":-2,"warmth":0.8,"humour":-2,"verbosity":-0.4,"directness":-0.4}},{"id":"praise","kind":"flag","say":"praise","reactivity_spread":0.3,"effects":{"valence":1,"warmth":0.5,"humour":0.4}},{"id":"criticism","kind":"flag","say":"criticism","effects":{"valence":-0.6,"caution":0.5,"formality":0.3}},{"id":"stakes","kind":"number","say":"stakes","effects":{"caution":1.6,"humour":-1,"formality":0.6,"verbosity":0.3}},{"id":"time_pressure","kind":"number","say":"time pressure","effects":{"verbosity":-1.6,"curiosity":-1,"humour":-0.6,"arousal":0.8,"initiative":0.4}},{"id":"claim_done","kind":"flag","say":"about to report done","effects":{"caution":0.6,"step.verify":1}},{"id":"task","kind":"level","levels":["chat","question","code","ops","explain"],"default":"question","effects":{"chat":{"humour":0.3,"formality":-0.3},"code":{"caution":0.3,"curiosity":0.2},"ops":{"caution":0.8,"formality":0.3,"initiative":0.3},"explain":{"verbosity":0.9,"curiosity":0.3}}}],"history":[{"id":"errors_in_row","of":"error","kind":"streak","cap":3,"say":"errors in a row","effects":{"caution":0.5,"verbosity":-0.4,"arousal":0.3}}],"habits":[{"id":"no_jokes_on_loss","when":{"loss":true},"then":{"humour":["none"]},"say":"no jokes"},{"id":"after_error_shorter","when":{"error":true},"then":{"verbosity":{"at_most":"prev-1"},"caution":{"at_least":"prev+1"}},"say":"shorter than last time, check more"},{"id":"verify_before_done","when":{"claim_done":true},"then":{"caution":["careful"]},"say":"verify before saying done"},{"id":"high_stakes_careful","when":{"stakes":0.7},"then":{"caution":["careful"],"humour":["none"]},"say":"high stakes, be careful"},{"id":"no_bold_lead","rules":{"implies":[{"if":{"var":"caution","value":"bold"},"then":{"var":"initiative","in":["follow","suggest"]}}]},"say":"never lead while moving fast"},{"id":"report_after_verify","rules":{"precedes":[{"before":"step.verify","after":"step.report"}]},"say":"report only after verifying"}],"agenda":{"steps":["acknowledge","diagnose","fix","verify","report"],"prefer":{"acknowledge":0.6,"diagnose":0.4,"fix":0.1,"verify":-0.2,"report":-0.8}},"line":{"max_tokens":40,"order":["verbosity","caution","directness","warmth","humour","initiative","formality","curiosity"]}}} +{"inputs":{"claim_done":true,"elapsed_hours":0,"error":false,"task":"question","time_pressure":0.625},"n":1,"prev":"sha256:8142e96479e501adb54f5eb4f2dd3820d230f6bef64e84051a1ec13069d8b0b2","stance":"sha256:49efb982de69a92be4999e74d96798b1791540545e5c83c0dbbd640a736a9684","state":"sha256:49f567114012cb871938d47ecd8f190c715e557ad672ec0fb8854a4335faed05"} +{"inputs":{"claim_done":false,"elapsed_hours":0.5,"error":false,"sentiment":"negative","stakes":1},"n":2,"prev":"sha256:46eabafac921d8db219c8fcf255c43027cfab9fe79780dbdcfb7d77025213a02","stance":"sha256:005d60689eb978e8754b264d8211ec522197cd5a807798d9b0e01275e6fb1e05","state":"sha256:a2ae7b37d94cc6a76966291ee7670991e6bece5d80b268b49f2e4ad53126b1ab"} +{"inputs":{"elapsed_hours":0,"loss":false,"sentiment":"positive","stakes":0.5,"task":"ops","time_pressure":0},"n":3,"prev":"sha256:b380775dda91df4f3e617b56bb3f3d8d49e931e9dede7a5ebb6540feacee4b6a","stance":"sha256:4e4527807998aef7ff26a4c5fd55a59004fa4fe0ba0bb039e911060c46814202","state":"sha256:3f92bcdc652421fbda364f27fb5a77655720aaba2d2e836252a437e3193a8014"} +{"inputs":{"criticism":true,"elapsed_hours":0,"praise":true,"time_pressure":1},"n":4,"prev":"sha256:ceb4cf81e4b91e42fe256de7bf9fc14c3a8b40f938f8cd431c7a745b268be21d","stance":"sha256:91d6061b1c20dd6b325a5727389917329bc2f862ad9784bb43ae851e044626be","state":"sha256:ca4de91e806fc24d2ed81fe06848f3a2ebe46997d931e29c852a74ea554edf2e"} +{"inputs":{"claim_done":true,"elapsed_hours":10,"stakes":0,"task":"chat","time_pressure":0.5},"n":5,"prev":"sha256:795a2937b215983dd75b3cf62eada66b4365c3345d2ee5023d50129ce66680bc","stance":"sha256:346e751c667149a53bea5fc6559f3cfa9128160d34853d3a0c8dfa376820f33f","state":"sha256:45414bf0464fe1dc42bd1a99958c35081a55ba29194d8012a24f603aa24bb7df"} +{"inputs":{"elapsed_hours":0,"error":false,"time_pressure":0},"n":6,"prev":"sha256:4dd1f71197d495095ab2548858c1794f1c7e4cc4bc3b896fd709e508cd642aa0","stance":"sha256:b75889875f6fff4ef96c55027accb97b86b47784909484ebbd9639155a215482","state":"sha256:4f442be0435ea32ec87d75a05503db5dfac201b27d45d7c70acba9cdf91c2760"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"error":true,"loss":true,"praise":true,"stakes":0},"n":7,"prev":"sha256:3947c4f8f044a6755c60235488c318f514d5a49825744b79e894ba5ca140f4a0","stance":"sha256:672afa2ce4d83cb7297bf145dd5b2d5d2fd0acbc8ae27581c5caa71fb7f19f11","state":"sha256:042090962ac63927dc78fa9dbb587c14c003b19af930c58549c37e00b8cb84d0"} +{"inputs":{"claim_done":true,"elapsed_hours":0},"n":8,"prev":"sha256:30e9e1a5365a1e9ca0cc1cf5f569ed8824dad38d46f3d4efe754796ca4237fce","stance":"sha256:8966a52727c4fe69b37ca8b54790c96446e2793653f22f562a8b132f6274188c","state":"sha256:2e0687636242dc19d23a295f7cee892a28e672c48f6025f4a60b8987e9011e95"} +{"inputs":{"elapsed_hours":0},"n":9,"prev":"sha256:6b021a10e1156bce69dc5baf5a0e4b58f92a385ef20b4a6420057c34c7d45018","stance":"sha256:327a0a57d580f10d6d7df0c138fb91f35b9537cb60be3a42ed4490803586a0ff","state":"sha256:309e7c95a18fde1c6d2b0ec3efa1e516e667082c365de9cfd846d4dc2656c106"} +{"inputs":{"elapsed_hours":0,"error":false,"task":"question","time_pressure":0.5},"n":10,"prev":"sha256:9bf739e64474e170d3e6917e16eeb8442565ca83201b8dc29e6dbca989168cf4","stance":"sha256:846931074a5549e64ecacaf7ed4c2ee9a39cc93b790bab1b62ad4f3112af795e","state":"sha256:f98c5b29c37d2e0106078f33de182e8850cc45566a700b44667c32d357a9491d"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":10,"loss":true,"stakes":0,"time_pressure":0.385},"n":11,"prev":"sha256:7d72cb619de54d92f6d3969efb7857504a94f51525a75921adeac4cf77506570","stance":"sha256:8829c4c54b7fd4dd6a37390bd7a64d131c6618cd4c947157887efff9aa2273a6","state":"sha256:5b0397842e50abacef898576f59247e29c49075a329c5b4feadf7dbcdca6767a"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":10,"loss":true,"task":"explain"},"n":12,"prev":"sha256:ac379e2ebbba909819ce7798973189c30bcb5728c5f187c38e7b99119ef09a30","stance":"sha256:0636c6780c06dc538e7deabd82872ce2e11388fa6000035e2b30c9e6da0009cb","state":"sha256:e147b2c6355426cecefd5cfe666515da934c636a001e8d7fb5f5a98e276b15b9"} +{"inputs":{"criticism":false,"elapsed_hours":10,"error":true,"time_pressure":0},"n":13,"prev":"sha256:2808fcef5f098bf1fecc5eeb383c0dcd29653936b131232d4039c927f54e3fd0","stance":"sha256:7eee509ef5e110d9c2fb896ff18d200fcbcdfa57284ca8331334599c8992c665","state":"sha256:d7ab4dcf45f6de74394968a64c24f7455d4d584f9b0fbdcf260fac44d05883bc"} +{"inputs":{"criticism":false,"elapsed_hours":0.5,"task":"question"},"n":14,"prev":"sha256:ccc775aee3d69da217c08ca9b86997d28c0582a8b7a18c367ee4bc053921a7e7","stance":"sha256:8a16aa1f638dd5ea4b2eae2104d68c387726b88530bb9687e46a291ad55085de","state":"sha256:00f5a39f203ddb167e45cdc9c4d78a269d7091f5fc4cd49bea0e56795fb178fd"} +{"inputs":{"elapsed_hours":0,"sentiment":"neutral","stakes":0.5},"n":15,"prev":"sha256:ed6c6ac67c6e468197ac3f25a8b46827f28fc3db5a3ae3f71af0da13f67e5843","stance":"sha256:e28e9c9232aadb3ac3c23e56b73d9729ae95ef698c605370b5742ad52bbb2062","state":"sha256:9ab13bf37cfe07ff11cfc490f77124ef961dd390118b700e8b4a6b311cb5ea19"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":10,"sentiment":"positive","stakes":1},"n":16,"prev":"sha256:1daa1a94346a991b59f5a9f6c2686201e8b17a6b3e2ba6235ac75a9ff3628785","stance":"sha256:21dd4d6fb26c617dbceb0c97917c22e8576444b575b20157101c784b11002b58","state":"sha256:52ba70d494a53538f8932453d106821c1480f19199c3f1d8bdee380a9bbb1404"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"error":true,"task":"question"},"n":17,"prev":"sha256:cc4c37aa9a30d41ecfac3c9bd43ae58441d4d18234c4b5be7d68bb1ce10eb45a","stance":"sha256:d34bc035c8fd2fff7eea9b047b0d2e549bf1c44c8f6b98db96928787f7357779","state":"sha256:a50b24e9d6b1c56200c5c2fff745515ce0ef6696df83e886a048219a353f0716"} +{"inputs":{"elapsed_hours":0.5,"sentiment":"positive","stakes":0.153,"task":"chat"},"n":18,"prev":"sha256:d34de58e367df721edd873904a8e01b7f7df1f57880666f4d278aa49274d4b4b","stance":"sha256:4c70d560735494ad075716cb19b0ece713590d0fee1b4e348ce36a02a800e363","state":"sha256:c7ffc744dc0e77cb923f285a01c7a9fa1c40c9f04730994b6d0a46d8c1f9d219"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"task":"chat"},"n":19,"prev":"sha256:a0a434705a39b6c6649dfaef9a02030e0799c16ac5e85079c0a441fcefa89659","stance":"sha256:2781d8ef89fa7e918270309f2259acc39742e30f18ac28334f9d89691eddd3f2","state":"sha256:1197bf35612fe457d56072fdb8b108ab0276a720636228f063d71f04e117a008"} +{"inputs":{"elapsed_hours":0,"praise":false,"sentiment":"negative","task":"ops"},"n":20,"prev":"sha256:0f2f17b9b7a5136e670146e1220684232b839a1276a87dff97886f6140f5f101","stance":"sha256:16f5aa3eaf44ec128f17a8940174f5bff0c1455edbb2bb319ca16ffcfaacb040","state":"sha256:6372acaf1a7c00fd810504857004bdf025ff2e70533ef91a1c612572975c9fac"} +{"inputs":{"claim_done":false,"elapsed_hours":0,"sentiment":"neutral","stakes":1},"n":21,"prev":"sha256:2d8c3f2caa7056fe29daed80f60404d7f5d2747ab384b3fedb3afa2d5f12cbf1","stance":"sha256:b929906aeb0eede002a8851c4dd206578b2fe68d396b63fa3095a7a43dc65dfa","state":"sha256:6b1df6d023e675e6c6eab8224addf233be96c23528181871a283f98d6bc9d0cd"} +{"inputs":{"elapsed_hours":0,"loss":true,"stakes":0,"task":"chat"},"n":22,"prev":"sha256:1bf4df8c3df6b9f23354b7377a47fa071320b12197cd27660ded68ec21f470ff","stance":"sha256:4cdb8727bc529807f3cc06d7e83b62eab3080de8b9933214c375c21e06c78964","state":"sha256:8f2490f75eab862b6e1611a0b479f59493c3f3d58f22857fe0e22102313bef99"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":0.1,"error":true,"loss":false,"sentiment":"negative","stakes":0,"time_pressure":0.5},"n":23,"prev":"sha256:a2d3443da059af00880f33bba1cfff36083825aff4199b6ea12167114433aaef","stance":"sha256:2111ad637fab6ac99e4db9ba816f9f6b5dca5cd9357f84c083459490942fc59e","state":"sha256:d7bb6820ef71190d04f995181b1774228f682d9ebcc74fb7e20011d5c4b0e44f"} +{"inputs":{"elapsed_hours":0,"sentiment":"positive","stakes":0,"time_pressure":0.5},"n":24,"prev":"sha256:b6dc72c60a1e68184d5f744d5821627724f36fed5a4825269582adcca42843c2","stance":"sha256:481db85693933eb6d79db79b8cefde9f0d9601367146496bbe13d1ab8ebce0b0","state":"sha256:896ff8bda27c2135fc22e21e2c563e2ce4f84b99a5ae49463383d24677ed2fe3"} +{"inputs":{"criticism":false,"elapsed_hours":1,"sentiment":"negative","time_pressure":0.5},"n":25,"prev":"sha256:e3557a2e7761fc4843c52ef5a0137aae0756eb50ca285f922a00387eaadb4818","stance":"sha256:f280c629fabaa748a547204d53f29f888b201fe9753375be0be13dad57f6bd02","state":"sha256:0cee41bbac39555f2cc5a58ebdfaa447e743f7163bf97a3920f68e5526e2b81c"} +{"checkpoint":25,"prev":"sha256:51896bb6c23e3ddc68a0417f863a5754dbad91bb39efcd38c23db468dab807eb","stance":{"agenda":["acknowledge","diagnose","fix","verify","report"],"engine":{"program":"sha256:863540410000fb5ab8a8098cd0b4d6a93db7a2d40b0928489d92044ecf046897","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_bold_lead","report_after_verify"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"claim_done":false,"criticism":false,"error":false,"errors_in_row":0,"loss":false,"praise":false,"sentiment":"negative","stakes":0,"task":"question","time_pressure":0.5},"line":"Stance: verify before claiming anything; stay on the task; 1-2 sentences; blunt: state the problem first; plain and businesslike; no jokes.","line_tokens":35,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.187725,"keyed":0.379645,"steady":0.43263},"p":0.379645,"released":true},"valence":{"level":"down","odds":{"down":0.546633,"even":0.434962,"up":0.018405},"p":0.546633,"released":true}},"persona":{"digest":"sha256:45919fc382359af2233989826b3c23c9c7257afbf3076098230564863a8a8ca6","name":"Rook","version":"1.0.0"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"careful","odds":{"bold":0.093998,"careful":0.418592,"measured":0.48741},"p":0.418592,"released":true},"curiosity":{"level":"focused","odds":{"exploring":0.08854,"focused":0.525573,"open":0.385887},"p":0.525573,"released":true},"directness":{"level":"blunt","odds":{"balanced":0.414784,"blunt":0.463832,"gentle":0.121384},"p":0.463832,"released":true},"formality":{"level":"formal","odds":{"casual":0.054649,"formal":0.602445,"neutral":0.342907},"p":0.602445,"released":true},"humour":{"level":"none","odds":{"light":0.063462,"none":0.933029,"playful":0.003509},"p":0.933029,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.263938,"lead":0.175734,"suggest":0.560328},"p":0.560328,"released":true},"verbosity":{"level":"terse","odds":{"full":0.030122,"short":0.232785,"terse":0.737093},"p":0.737093,"released":true},"warmth":{"level":"cool","odds":{"cool":0.413604,"neutral":0.461769,"warm":0.124627},"p":0.413604,"released":true}},"state_digest":"sha256:0cee41bbac39555f2cc5a58ebdfaa447e743f7163bf97a3920f68e5526e2b81c","status":"ok","turn":24,"unsure":[],"why":"user upset -> valence down, humour down; time pressure 0.5 -> verbosity down, curiosity down"},"state":{"digest":"sha256:0cee41bbac39555f2cc5a58ebdfaa447e743f7163bf97a3920f68e5526e2b81c","genes":{"react":{"error":1.126,"praise":0.7148},"shift":{"arousal":0.172,"caution":-0.6639,"curiosity":0.4142,"directness":-0.1031,"formality":0.3743,"humour":0.049,"initiative":0.0095,"valence":-0.0906,"verbosity":0.0701,"warmth":-0.1287}},"history":{"error":[false,false,true,false,false]},"mood":{"arousal":[-0.430141,0,0.430141],"valence":[0.817423,0,-0.817423]},"persona":{"digest":"sha256:45919fc382359af2233989826b3c23c9c7257afbf3076098230564863a8a8ca6","name":"Rook","version":"1.0.0"},"prev":{"agenda":["acknowledge","diagnose","fix","verify","report"],"arousal":"keyed","caution":"careful","curiosity":"focused","directness":"blunt","formality":"formal","humour":"none","initiative":"suggest","valence":"down","verbosity":"terse","warmth":"cool"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"open","directness":"blunt","formality":"formal","humour":"none","initiative":"suggest","valence":"even","verbosity":"terse","warmth":"cool"},"seed":0,"turn":25}} +{"inputs":{"claim_done":false,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"neutral","stakes":0.5,"task":"code","time_pressure":1},"n":26,"prev":"sha256:3285d2e1101e5175b591f0f7b585b23e37d2b400fe4a26bad8d474f64b110135","stance":"sha256:62ea00bd8ae7ff609c9e59cb0494913a3f17c8e7f9f42f7e67101d1bf47d9bc8","state":"sha256:225b0fb0e225458eab2b98c961ef653ea9e4f53fa016ecbd6d52910050c0d0b9"} +{"inputs":{"elapsed_hours":3,"error":false,"praise":true,"sentiment":"positive","stakes":0.651,"task":"ops","time_pressure":1},"n":27,"prev":"sha256:a626a5de1f7802ba360ccc440e6d513b25eacd502e4cd01b59a1746b513e55d9","stance":"sha256:42d9a46287889bfa35425ed8f4c3af11a9aff4c876d2ad1740d1c6353d29ad38","state":"sha256:7bf78cd624c4a4cfa4c898740c06a8d5943d0d22607b4b808668ebc02da573f6"} +{"inputs":{"elapsed_hours":1,"error":true,"praise":true,"stakes":0,"task":"explain","time_pressure":1},"n":28,"prev":"sha256:4b45b312650d9356984e2ffb33561a56effe4905014fec79c83a930cd1f9c960","stance":"sha256:3cf2efa7126533a7c8b656fa4665eeca8f342358a6891e8f7193700b2efdb3d3","state":"sha256:4eb62427d3c539bb353b8362e81c4606485da1adc9f63393f2a75f91578e8ae6"} +{"inputs":{"criticism":false,"elapsed_hours":0,"error":false,"stakes":0.5,"task":"chat"},"n":29,"prev":"sha256:16082a4834710d71164df1965402da8c812b25200994887206843c55ebe96992","stance":"sha256:9d4f0a021d292f5d6953b8f7271d119046a2425dc3323d5f58a100861312e3d9","state":"sha256:b5eb6725faca344870751c5ce306a91580b02e3edd192f075911797b88d4fbca"} +{"inputs":{"criticism":false,"elapsed_hours":0,"stakes":0,"time_pressure":1},"n":30,"prev":"sha256:060919a4a4959fdbea8c0af9a1d4619eb0224e1ce78f965b9762a73eb424ed2b","stance":"sha256:85117e2ac4d23c7ecd041999eb14d96b2bd18ade20c633c537f0018df15cdeb3","state":"sha256:5328ff67e22b5e3b514aadc89e94e120d78931cdf88604025c448cf1f6198784"} +{"inputs":{"elapsed_hours":0,"praise":true,"sentiment":"negative","stakes":0.5},"n":31,"prev":"sha256:88405317fdd4c6f5374bbe71c4277e8f7566d9991a574c508e98edd80ea8f6ce","stance":"sha256:db94e29bc5575e84f9b246d52687acc3d4e8684f8675527913044a3dac511955","state":"sha256:bb8ffb185a7c6ec35e236a0af7ad81655be87f57d28d3dd14d7b2ff949dceccd"} +{"inputs":{"elapsed_hours":0.1,"praise":true,"sentiment":"neutral","task":"code"},"n":32,"prev":"sha256:42750f0e7904b0034b9da44e2629f3bb68c356f5454baf50974eb11571af4a79","stance":"sha256:5f88ccab67bf0d2bc53b4c40373c6c38d29278bb373f88062ba8f277e1fbd41a","state":"sha256:8132ee208ab2439b1fb20bc2cb315a7723d40b371e72fd6089558c6f027b5139"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"error":true,"loss":true,"stakes":0.5,"task":"ops","time_pressure":1},"n":33,"prev":"sha256:1de8f36cdc622be2bd43ce60d93e00074acedd4faa8f84cc1c16f5476b3aed74","stance":"sha256:1bf7c77ace0a1d405b5bc32b4a4ce51142c49c9d1446433e1164879c5f5a8ce1","state":"sha256:9cc736710d41c25cdedf894d953b7a523bfebd935effa253b59c06f2604543f2"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"error":false,"praise":true,"time_pressure":0},"n":34,"prev":"sha256:fe1ea7c69fcc265f9b21b0059b530986bc05ba3283c39f79516fd463dc33b835","stance":"sha256:8669ee0d3d52fbd149002db00c8c9d51cfd048e4b9f0064d098c325a3ee40e40","state":"sha256:06f2d68611af4220c91fdb158b2a096cf02522db9122f7a1b57d6d870389f619"} +{"inputs":{"elapsed_hours":0,"error":true,"praise":false,"sentiment":"positive","stakes":0.5,"task":"question"},"n":35,"prev":"sha256:f1b12b35eb28a5c315acebfce104ed87b81ba268f7bce9ab8e532b37baf656bc","stance":"sha256:7c2692fe7eae2ac88b8d34a97c444f7ab894a0a83320f93e3d839bda5801faa6","state":"sha256:f9646301684bf134df660b10bbfa113ca365e9b7dae49a30dfdf6eccaa6cb3b4"} +{"inputs":{"elapsed_hours":3,"loss":true,"task":"code","time_pressure":0.698},"n":36,"prev":"sha256:b174cfcc319a52b69c92d1261e84648bed89c465276bc3ad1c68341da88fede0","stance":"sha256:64ae5d9234ee40a45a6218ef2f7570db9cc47e362f021a085ef61568b9815448","state":"sha256:e7f6ccdde0076730cf9dab8dd11c3cc46fa1b4c99273736834b13f59e42a2da1"} +{"inputs":{"claim_done":false,"elapsed_hours":0,"error":true,"loss":true,"praise":false,"sentiment":"negative","stakes":0.5,"task":"code","time_pressure":0.714},"n":37,"prev":"sha256:54bed076c173ee64049777e9c66cd091571f701c503acfc4b919999f396e0566","stance":"sha256:38393eb7808fb2d93fae757470205131bcfe77b734170e74f1d38995466503e6","state":"sha256:0dbf64ba380becc72ce228ceb8333fdaea2d1112fa12f6443c9f6e2ac992dd06"} +{"inputs":{"elapsed_hours":0,"loss":false,"sentiment":"positive","stakes":1,"time_pressure":1},"n":38,"prev":"sha256:327ed85f501a3dfe25359eb82512098cf42bed5dce22cfa25a957da6a3c956bd","stance":"sha256:7965ac0a8f1a82ba0b2f82a93170dd4f31849a0e707ad2174ae5876e226f80fd","state":"sha256:0f33588d3791835b98bc4f87f7b4addb6d3864c16006b36085006f973e9eba7b"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"praise":true,"sentiment":"positive","stakes":0,"time_pressure":1},"n":39,"prev":"sha256:6290838802954bff10fe03e9066803a889ea5fa586fbaa18a271f9a55097f27b","stance":"sha256:8aa411a0ef7a5ab1456abc9e3f86792ab6d2189187abb3648bae4d8e0b028f1a","state":"sha256:dfcd803afd9ae95abf1648b5730ca0c7d00b98e2c8e02f0e8e10fea8487361ed"} +{"inputs":{"claim_done":false,"elapsed_hours":0,"loss":false,"praise":false,"stakes":0.278,"task":"question","time_pressure":0.5},"n":40,"prev":"sha256:4c38586e6991eedf816da5696abaaf756e938fb5169a5f88ff057158256018be","stance":"sha256:c998aea5be05c6a0157b0836162af4527cfb21320f6d27dcdd77ffdcf75ffe11","state":"sha256:11849d704634c75194eb58c0188f6a71cb818aac4cdc3890df7e7342218cf2f3"} +{"inputs":{"elapsed_hours":0,"stakes":0.5,"task":"question","time_pressure":0.5},"n":41,"prev":"sha256:1c5d5e815e64d847ab62c163b7aa472ac757c284fc30c0c53ef94e42a3776abf","stance":"sha256:c1e132f02f0039292e9fd883d1db9a4cfd9fdbaba07f47c9b57df59101b81fa2","state":"sha256:8478bbb7bbe21be24d8bbf40d7a694841a237679e3705f2972a6feee1840cc5b"} +{"inputs":{"elapsed_hours":10,"praise":true,"sentiment":"negative","stakes":1,"task":"code"},"n":42,"prev":"sha256:8321904a2e224b2870249b43b6b9d0b05bf51edb17c1cd45716cf75dc493dbe2","stance":"sha256:b050365c380cb411cb49cf9b6f86769197a08b45085392c8a832efd23917d6ac","state":"sha256:b41d5cdd71de86365cadff1d61c7e47c1aa26bc9c24e740e41e2669410c5f6e4"} +{"inputs":{"criticism":true,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"neutral","stakes":0.5,"time_pressure":1},"n":43,"prev":"sha256:3713a6b8a78fff918efd3b9154f537dc768ddc89ab8c9988e4dfe3021339e177","stance":"sha256:efa2a0db8e29acebad9964594af95ac2f5ab0b4cc77fd0b7918334a6bbcd38ac","state":"sha256:c313a02af359bd892bf2dd1b364bd8ec0c4c97c46e4c0864ba5745ef304c398a"} +{"inputs":{"criticism":true,"elapsed_hours":0,"loss":true,"stakes":1},"n":44,"prev":"sha256:076fa625232d8f2d8c5cee0e439e4f5b80411704fc57871c76f5017126c5bc16","stance":"sha256:f3f016ded21552d72fe3c8a9454fb014ad88ff37d69cf344ffd54c030bbfbe16","state":"sha256:61c2ffe2a1842cc1c182ebefb1cf5af20781619f144d1d25ef69dcc7239fbf85"} +{"inputs":{"criticism":true,"elapsed_hours":3,"error":true,"praise":true,"sentiment":"negative","task":"ops","time_pressure":0.5},"n":45,"prev":"sha256:32eeddbfcd31e77e216cbf9c996a614da6ca96608d0b032f20d299418d817904","stance":"sha256:129dc252162560e03bd861ae76ff04ecc3c7b854a36c553ef60270135a9f030c","state":"sha256:169192d8c3461968d075697ae0fa19d5cc2cb84ee181a9ddb7f62c3b53bb248a"} +{"inputs":{"elapsed_hours":0,"time_pressure":1},"n":46,"prev":"sha256:23a473b7130ed57dd1f0a562a56c8afb811d2d0138bc3f13d8b0322ac657299f","stance":"sha256:fc841594eff92d355dfd8aba55597d3632694bdb35ad46287ae274d38854ab41","state":"sha256:bbb3a1b3c798bd3789385582710d7cb170d0c93faf7a52f05ea2ea02cbc9f2c2"} +{"inputs":{"criticism":true,"elapsed_hours":0,"sentiment":"neutral","stakes":1,"time_pressure":0.979},"n":47,"prev":"sha256:3a13ad8a4634932293021f203dcada2003eadef1d7ec106535195b7ff4b79791","stance":"sha256:eca29e23b8c3b978c1dab9b71aff298be148b3f27f29604f56a3030d3c8d646c","state":"sha256:fbd4418ba64d5e1a46900264cc5290fd6f9f4f7f3283e237952e79c4994c2c85"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"sentiment":"positive","task":"code","time_pressure":0.999},"n":48,"prev":"sha256:0e6dcd594f2b6413eec8cf24695ce769d7b11a19ce26df2c7d4baed0651c30dc","stance":"sha256:fe8288df0c58a849ee01fdcdb61f7dad8046d714f09726bf20facd7235f471ef","state":"sha256:2e0184861181220f2cc1ae30e1666cbf66443e6a2d5245bba3cdd204811c89e0"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":3,"error":false,"sentiment":"positive","stakes":1,"time_pressure":0},"n":49,"prev":"sha256:3581879cead26da8f95f3b20a37b4e92c3f0a6550a505cabe75d575d3aee3c82","stance":"sha256:2ff21a9f9187446e54ca7f2cd2c2888026278ba1bc9dd54dbaad5b239426b530","state":"sha256:77435808717ec6f181d9a835e1294928c2c312e2aeab8c70e500c608c7d3fe70"} +{"inputs":{"elapsed_hours":0,"stakes":1,"task":"chat","time_pressure":1},"n":50,"prev":"sha256:41189508396b0703b66b1e78b720ab0b8b6a7ee3e89fd78d075f5f41b7034d31","stance":"sha256:3b6671a2e82867eb6f13595ee7299656bd76446ec739b50a06525d5b3baf5e12","state":"sha256:07232b387266d73f7c0821a5db833d7c7d5fde4c9b75ea0d5dffa8549e024551"} +{"checkpoint":50,"prev":"sha256:adc48c353b125dad63738c5c0f20f0dc402d11e721464405a96be10e0411c48b","stance":{"agenda":["acknowledge","diagnose","fix","verify","report"],"engine":{"program":"sha256:e2bdb36ec4a868eff7fe770330c83911074bc7cf2ae7c10d8bd5b68a83e04b97","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["high_stakes_careful","no_bold_lead","report_after_verify"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"claim_done":false,"criticism":false,"error":false,"errors_in_row":0,"loss":false,"praise":false,"sentiment":"neutral","stakes":1,"task":"chat","time_pressure":1},"line":"Stance: high stakes, be careful; verify before claiming anything; stay on the task; 1-2 sentences; blunt: state the problem first; plain and businesslike.","line_tokens":39,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.092225,"keyed":0.525959,"steady":0.381816},"p":0.525959,"released":true},"valence":{"level":"even","odds":{"down":0.364442,"even":0.588893,"up":0.046665},"p":0.588893,"released":true}},"persona":{"digest":"sha256:45919fc382359af2233989826b3c23c9c7257afbf3076098230564863a8a8ca6","name":"Rook","version":"1.0.0"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"careful","odds":{"bold":0,"careful":1,"measured":0},"p":1,"released":true},"curiosity":{"level":"focused","odds":{"exploring":0.041116,"focused":0.663437,"open":0.295447},"p":0.663437,"released":true},"directness":{"level":"blunt","odds":{"balanced":0.358832,"blunt":0.568404,"gentle":0.072764},"p":0.568404,"released":true},"formality":{"level":"formal","odds":{"casual":0.027149,"formal":0.705376,"neutral":0.267475},"p":0.705376,"released":true},"humour":{"level":"none","odds":{"light":0,"none":1,"playful":0},"p":1,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.238688,"lead":0.162178,"suggest":0.599134},"p":0.599134,"released":true},"verbosity":{"level":"terse","odds":{"full":0.008752,"short":0.136382,"terse":0.854866},"p":0.854866,"released":true},"warmth":{"level":"cool","odds":{"cool":0.519465,"neutral":0.4053,"warm":0.075235},"p":0.519465,"released":true}},"state_digest":"sha256:07232b387266d73f7c0821a5db833d7c7d5fde4c9b75ea0d5dffa8549e024551","status":"ok","turn":49,"unsure":[],"why":"time pressure 1.0 -> verbosity down, curiosity down; stakes 1.0 -> caution up, humour down"},"state":{"digest":"sha256:07232b387266d73f7c0821a5db833d7c7d5fde4c9b75ea0d5dffa8549e024551","genes":{"react":{"error":1.126,"praise":0.7148},"shift":{"arousal":0.172,"caution":-0.6639,"curiosity":0.4142,"directness":-0.1031,"formality":0.3743,"humour":0.049,"initiative":0.0095,"valence":-0.0906,"verbosity":0.0701,"warmth":-0.1287}},"history":{"error":[false,false,false,false,false]},"mood":{"arousal":[-0.518667,0,0.518667],"valence":[-0.020152,0,0.020152]},"persona":{"digest":"sha256:45919fc382359af2233989826b3c23c9c7257afbf3076098230564863a8a8ca6","name":"Rook","version":"1.0.0"},"prev":{"agenda":["acknowledge","diagnose","fix","verify","report"],"arousal":"keyed","caution":"careful","curiosity":"focused","directness":"blunt","formality":"formal","humour":"none","initiative":"suggest","valence":"even","verbosity":"terse","warmth":"cool"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"open","directness":"blunt","formality":"formal","humour":"none","initiative":"suggest","valence":"even","verbosity":"terse","warmth":"cool"},"seed":0,"turn":50}} +{"inputs":{"criticism":true,"elapsed_hours":1,"error":true,"praise":false,"stakes":0.5,"time_pressure":1},"n":51,"prev":"sha256:4e44136b6d29a114a7fcda43d4d0d498d8d11bd8dc658a8422f5d8bcb518804e","stance":"sha256:57c5a8fb256d04cb01c8d2dc19ff36ed381c138211b141de0795136cea005849","state":"sha256:5d700562964ea22e4dbc1775246714af0bcab2423248e9ac484b4560ec7dc000"} +{"inputs":{"criticism":false,"elapsed_hours":0,"sentiment":"positive","task":"code","time_pressure":0.5},"n":52,"prev":"sha256:4f6001724cdb04d692d17300023cc3af3196d8695eedded6499386e7d83ca420","stance":"sha256:b1cf2cfed1553671e5f4c154b2bbb24cc527eb523fe727c5ce8a42339d6286c8","state":"sha256:52602fb9e88cd4b2bc4eed2a1ce14d5db4400adbb2f0b1c9ee4fff6bc0705107"} +{"inputs":{"claim_done":true,"elapsed_hours":3,"praise":true},"n":53,"prev":"sha256:1df1b043ae8475ba85d15feb734ba08f70c82f838acb251d804f5d201e1e658f","stance":"sha256:15d59eb9829e2fddaad4514ab94687e5b03076b5604094ceb9a11df1d6fae94f","state":"sha256:8e1f5099ea667076b1b06ee5522c679b2d52531fbb0141211e8c0b1dc4902ccc"} +{"inputs":{"elapsed_hours":0,"praise":true,"stakes":0.5},"n":54,"prev":"sha256:14008c5dd4f8afa561530e7fbecf613a988f84f0d1aceb9875108f4e21d88fbf","stance":"sha256:c198ed367771208d10129f9b97488ecc9068ddbd21b43702ffe2eecc4192aa8e","state":"sha256:947dd993d0cee97eddeeea5a3ac36eb6e1eda54832bc0af6d236de41e6634600"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"error":true,"praise":false,"sentiment":"neutral","task":"code","time_pressure":0.883},"n":55,"prev":"sha256:18c75ccd5c6abc4c084705a2355d204951d5cf77a0c421f4668b4f8d81144733","stance":"sha256:38ec3ce8b45c09399c5c5b516ce6757447b2c84db8c5b5a9f8687ac3801829ca","state":"sha256:ab47d517f08859f6f70ba3fd5c6cc71587084ea46ac33a22ea4963a443d2666d"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"error":true,"sentiment":"positive","stakes":0,"task":"explain","time_pressure":0.038},"n":56,"prev":"sha256:37455651932068976adf402541b1bc2d48b8d1f8f6dbecf9f7e10f8e5ba8b936","stance":"sha256:4d135cd03a5229d61876779a890466ffb50092b14c307ca616341b6522054290","state":"sha256:7834a0cd650546850b67d8bac317fedd11bc812cba3d4357d547c1290ff530c3"} +{"inputs":{"elapsed_hours":10,"sentiment":"neutral","stakes":1,"task":"ops","time_pressure":0.2},"n":57,"prev":"sha256:47d00d0f675e5a2a372b1e3a90be93089d31bcde8b0cf77a4fb10e4a1acc1682","stance":"sha256:398b5e6ca97f20ac93f5e6b194895ecf0451ea7925a1e1d4022ae23e5dae955d","state":"sha256:1d61f1f47d053039049a6691a27c1f141762a8035044f7faf3814e9251472a0c"} +{"inputs":{"elapsed_hours":0,"loss":true,"sentiment":"neutral"},"n":58,"prev":"sha256:c28da2cad9aa4a9c8d75070c6624dd29cc67f486918909e1ef55e8a6ee2f003b","stance":"sha256:b17104e9fb8e43bbce992d2aed36dd5459f8916057afc9ef28212980b3d87065","state":"sha256:096db87da56a7d5009712046a318b1904ecad5d54a6672db8c3c64c1e3208585"} +{"inputs":{"elapsed_hours":0,"loss":true,"praise":true,"sentiment":"positive","stakes":0,"task":"explain"},"n":59,"prev":"sha256:98ce5b591234602bbb5136c31a4ac6e6808b9430842c94d624698dc7c72e9e61","stance":"sha256:a71cf1540891df04f12d225d09903885a9dc1df5cfa6ae33bf4b9b2fa3908544","state":"sha256:6802ea9e659123934935528aef5c0971e2f1821cf7df23868a7baafdd2626e42"} +{"inputs":{"elapsed_hours":0.1,"loss":true,"praise":true,"sentiment":"neutral","task":"code","time_pressure":0},"n":60,"prev":"sha256:9e4ad8e04419125e6f5aa922074290eecf074118511cf213fb7ba0f5fc551028","stance":"sha256:24698412872e8f1f74ba554087bb17b407f16dbec458d7d36da86cf1f014135b","state":"sha256:12f7a14481a5e7d7063a03bd9e63c0d477c275f8472ce0f672ed389e312ddb74"} +{"inputs":{"elapsed_hours":0,"stakes":1,"task":"question","time_pressure":0.727},"n":61,"prev":"sha256:b5bbc85b0825cceda6e592eaca4f2ddb9e3845cbf48d4bb2230d6acbb196ad07","stance":"sha256:b9e9937b2d7cf5a762248f8b008bdfc863a6d36c353e3a6594e529c713d240d7","state":"sha256:c77515b9ab25ab0b98d3e7ca7e7a2d2b1876baf698349db15893820c69f15135"} +{"inputs":{"elapsed_hours":0,"error":true,"sentiment":"negative","stakes":0,"time_pressure":0.525},"n":62,"prev":"sha256:f5f2b6cbc4d2044b1a84fae1d3a7dc6a39f528849fb4594997b1f0f76974bf1f","stance":"sha256:0a480da2dc4a4de2e3b3a03ee7afb477f01fcf20f09dc455ec48e6cf5df9202e","state":"sha256:5647eba2f2dbca508494c550f8deb6a6b1f28f14ac9a01ae7c2048b3995c14a0"} +{"inputs":{"criticism":true,"elapsed_hours":3,"loss":true,"praise":true,"stakes":0.57},"n":63,"prev":"sha256:b50e70c03c129fd8b3c38a1eb296a2c91bf974abb1054f8c8da490657eb06ae9","stance":"sha256:302fbcb1b84f8296ff507a339dac8ec38ff023cb9b39530c3657b5edf507dac5","state":"sha256:0b8848ec5450c1880be8347356e38f41ab466aa085c3ae486c2b20873fb317bd"} +{"inputs":{"claim_done":true,"elapsed_hours":1,"stakes":0.5},"n":64,"prev":"sha256:2f0670ed58cd8f0c363e59648a2fecf11c07c8500718f4da669969915033055e","stance":"sha256:f92f7f15e2d30b9cb4b5f80d57cd0b817cbe826674ceb0d1df7cc6c45419599d","state":"sha256:506c3b7be66b35df6d470fb2ae799d44cc422c22eba5e9335dc4c7faea2b549a"} +{"inputs":{"elapsed_hours":0,"sentiment":"neutral","stakes":0.451},"n":65,"prev":"sha256:43d7eaafd8e9207d34eef8469a14c0a6d1231efa2aa4a527bc0d1fa3ac197725","stance":"sha256:672a05332f1a2e1116c43674815305057cd3cd765709e24251245f3faf228671","state":"sha256:e10b375184322d276283d50ec4d6a36d6a0cb70af840ed29f929c0a54d20119f"} +{"inputs":{"elapsed_hours":0,"loss":false,"stakes":1,"task":"question","time_pressure":0.5},"n":66,"prev":"sha256:4200f645bd3339d2aa30e525894fd8611dc096e09eaaf5fb1bece3784d55abe2","stance":"sha256:454c0916b9652018ac3a05e867ab10f4d9dad67c6c4ed4d5690dc9742ba04b48","state":"sha256:6d48c6e50803085e7985afeb1dc5ad12727acc7b44cfdd2ee24b2e9c133c03c4"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"sentiment":"neutral","stakes":0.333},"n":67,"prev":"sha256:8e94d5a805bedcce56dc518cb0eead34fda353709940dfbf63433f4681ef18dd","stance":"sha256:ef0db424885c4ef9aed14209e4a83e1c5b3d362763fecc40d2eef831b3f6839a","state":"sha256:ad2509bda6358134968fcb2e1d5d9f5f1ef0326b1548a6c844e8ac3a8900605c"} +{"inputs":{"criticism":true,"elapsed_hours":0,"loss":true,"sentiment":"positive","stakes":0.869,"task":"ops"},"n":68,"prev":"sha256:53d591cea11cb4ba486d49c9c860356f9bc8764eb849ab563536482904cb8b4e","stance":"sha256:55a8d6a9ba7fd357ec394dab24c51d1bc959956ec16c0c07d3cb5955be6e8018","state":"sha256:8a440ac3f97d708b47752bf19f110ad5f6f0ce98406cc0f4a4f2a71f2e080ef8"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"praise":true,"task":"code"},"n":69,"prev":"sha256:d41cda29a99447a2151fb04bad5512975ab82f2b16d4d6f0557f3324bcd63732","stance":"sha256:0989928340b0be187edfc90f72ef4749e4abe4860836531fc99e9a713d9851a6","state":"sha256:04dfabada24fc63638268cdef7c4996afb7105ef49730e46d1aee04217f80b4d"} +{"inputs":{"claim_done":false,"elapsed_hours":1,"error":true,"stakes":0.5,"time_pressure":0},"n":70,"prev":"sha256:1a855217d707bab35f4e0e2b2a1e39d575af4ea089063e0d2aa47b40bcaa0c97","stance":"sha256:cf988909f4fbebd19fdc7fbff55c23282aeda1c5e8e1dd6a9ee647e29ba810ed","state":"sha256:e6c5135d07b04175c483cd65a046c95bf378db20b3fe279b03fc3ba29e2edd80"} +{"inputs":{"elapsed_hours":0,"sentiment":"neutral"},"n":71,"prev":"sha256:1b628f96f9fc4ce75b5843f716216d44e946385da9b9576d4d95a53d56dd194b","stance":"sha256:6e1b8fa6b18dfe59034351d3304ecb059f75b9497c174efecf063f9497256a52","state":"sha256:b383ba3e39814f43fb97304ecda2ac9f2648043fe2d0095fed8ccca3f91a10f4"} +{"inputs":{"elapsed_hours":0,"task":"chat","time_pressure":0},"n":72,"prev":"sha256:ae0ae77918e4c30204370aa3b07960c2e0a2253352bc79c0c2ff4f1af9680c09","stance":"sha256:2e20886e282d8fb40fa4a3ef869daff95bf3b87cfecbeab92c9ea0afe086e727","state":"sha256:12cb71915b12b269275e65a48e7d07a8c92784d6ca30878b78ded596b3b2b56c"} +{"inputs":{"elapsed_hours":0,"praise":true,"task":"ops","time_pressure":0},"n":73,"prev":"sha256:a3e8914fe349d74818f0f25927ae3f8c5603dd075ee0c5bf1f854c576e68215f","stance":"sha256:c7570696e0a9a10cc8c8b70b873bc594f89d0072b7355d2983a630e58aed63c0","state":"sha256:420b61c7267f366bacc23a66b609d37100e13e3c974cd41c33f25dd99d51e673"} +{"inputs":{"criticism":false,"elapsed_hours":0,"loss":true,"task":"chat"},"n":74,"prev":"sha256:84a2b1f171edefb7dfed4cd51c5a5a8e774167d107ee3561280565b6900e6459","stance":"sha256:e659d657bc6f215d53e6c74f210f356ce9768720550aabcdaae11b2b2b2d3a6e","state":"sha256:f4331c76eb38dac19117ca6bafad0727af8cc8127be766571028b021c6583b34"} +{"inputs":{"elapsed_hours":3,"error":true},"n":75,"prev":"sha256:509eb9eb1f3132d1f64ac2bec5a5409f68b6ae51a16d984f3b3e06e5ba217ce5","stance":"sha256:93dad6a32acef65ab41e202f8c46658a08dc3ea58851600ace428592a4dbce54","state":"sha256:6d9f01637749bdc73af5cf7205a59e3168333c58af7d140f2873a775001a2e2c"} +{"checkpoint":75,"prev":"sha256:8b8d3987a289f0859a3f12781e2781a0e1cc042e5f7b9056aa14a92e71a90353","stance":{"agenda":["acknowledge","diagnose","fix","verify","report"],"engine":{"program":"sha256:20ddc356e78077bf086f5400f29836b35331ac5cb2f64fdf8c99863ae094ed16","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["after_error_shorter","no_bold_lead","report_after_verify"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"claim_done":false,"criticism":false,"error":true,"errors_in_row":1,"loss":false,"praise":false,"sentiment":"neutral","stakes":0,"task":"question","time_pressure":0},"line":"Stance: shorter than last time, check more; unsure about initiative: keep it suggest; verify before claiming anything; 1-2 sentences.","line_tokens":34,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.079534,"keyed":0.547259,"steady":0.373206},"p":0.547259,"released":true},"valence":{"level":"down","odds":{"down":0.473309,"even":0.4956,"up":0.031091},"p":0.473309,"released":true}},"persona":{"digest":"sha256:45919fc382359af2233989826b3c23c9c7257afbf3076098230564863a8a8ca6","name":"Rook","version":"1.0.0"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"careful","odds":{"bold":0,"careful":1,"measured":0},"p":1,"released":true},"curiosity":{"level":"open","odds":{"exploring":0.171609,"focused":0.374748,"open":0.453643},"p":0.453643,"released":true},"directness":{"level":"blunt","odds":{"balanced":0.348689,"blunt":0.586531,"gentle":0.064779},"p":0.586531,"released":true},"formality":{"level":"formal","odds":{"casual":0.059396,"formal":0.596444,"neutral":0.344159},"p":0.596444,"released":true},"humour":{"level":"none","odds":{"light":0.167664,"none":0.804068,"playful":0.028268},"p":0.804068,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.455279,"lead":0.056466,"suggest":0.488254},"p":0.488254,"released":true},"verbosity":{"level":"terse","odds":{"full":0,"short":0,"terse":1},"p":1,"released":true},"warmth":{"level":"cool","odds":{"cool":0.513444,"neutral":0.407311,"warm":0.079245},"p":0.513444,"released":true}},"state_digest":"sha256:6d9f01637749bdc73af5cf7205a59e3168333c58af7d140f2873a775001a2e2c","status":"ok","turn":74,"unsure":["initiative"],"why":"last action failed -> caution up, verbosity down; errors in a row 1 -> caution up, verbosity down"},"state":{"digest":"sha256:6d9f01637749bdc73af5cf7205a59e3168333c58af7d140f2873a775001a2e2c","genes":{"react":{"error":1.126,"praise":0.7148},"shift":{"arousal":0.172,"caution":-0.6639,"curiosity":0.4142,"directness":-0.1031,"formality":0.3743,"humour":0.049,"initiative":0.0095,"valence":-0.0906,"verbosity":0.0701,"warmth":-0.1287}},"history":{"error":[false,false,false,false,true]},"mood":{"arousal":[-0.497085,0,0.497085],"valence":[0.583792,0,-0.583792]},"persona":{"digest":"sha256:45919fc382359af2233989826b3c23c9c7257afbf3076098230564863a8a8ca6","name":"Rook","version":"1.0.0"},"prev":{"agenda":["acknowledge","diagnose","fix","verify","report"],"arousal":"keyed","caution":"careful","curiosity":"open","directness":"blunt","formality":"formal","humour":"none","initiative":"suggest","valence":"down","verbosity":"terse","warmth":"cool"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"open","directness":"blunt","formality":"formal","humour":"none","initiative":"suggest","valence":"even","verbosity":"terse","warmth":"cool"},"seed":0,"turn":75}} +{"inputs":{"criticism":true,"elapsed_hours":0,"error":true,"praise":true,"stakes":0.5,"task":"ops","time_pressure":0.569},"n":76,"prev":"sha256:684c8d71c48d9066c4843c35f5d3546175d533e881723968b0fa1464685520c7","stance":"sha256:2b9caef50d624b7c69637e069302e7e409607acd85dad481a3b0e83fec7684b1","state":"sha256:5178ce19f603e434f32365a58e6c6ede95792efd7e7a248611d7e2dbda03b997"} +{"inputs":{"elapsed_hours":0,"task":"ops","time_pressure":1},"n":77,"prev":"sha256:10246c14934d8eb03395dec9e8beba9e2113faa6cee967553b0d8f6570788586","stance":"sha256:cfb661bf2c5a05da341042070d79a75b8a26ba865b1f08526b8fad2ee4112db9","state":"sha256:dca43738f249e0aa66743a4338d77d0a8dec58fd1e7cf4bb26534a9f1a799288"} +{"inputs":{"elapsed_hours":1,"sentiment":"negative"},"n":78,"prev":"sha256:e6fdf60a5c183efcdd691bc551b6cc12b1412820c1fb52f81fd0c87c9e87be0f","stance":"sha256:58a67448f6e3847074c86414ae6015a996bb1f7a6b613dd8b01c416917930ca0","state":"sha256:cac452c18793f85d35e435bd59f7770172cc4cbea3b158e22bd339adcf9373f8"} +{"inputs":{"elapsed_hours":0,"error":true,"loss":true,"sentiment":"negative","stakes":1},"n":79,"prev":"sha256:d58e288128abef58850402006cd524b95439733a868e95705c8d81fe86032797","stance":"sha256:ba044a314326fb9f8ba4df6338238937d9ae5c0eee9642d10ac4130a6d432ef8","state":"sha256:d88d6bf496a90c73f5a7c99b2fe81133c0f5fe39825e474b7ccb8f6601010cfe"} +{"inputs":{"criticism":true,"elapsed_hours":3,"sentiment":"positive","stakes":0,"task":"chat","time_pressure":0.5},"n":80,"prev":"sha256:2052136e55334c1b099214e7d76f5080e50e1cacbd462fb5572c1bc61df376d8","stance":"sha256:2d25acdd99345ff364c2392052303b5b775ab268c75afc518f03e0ec6c59153f","state":"sha256:abb9e6965c3f3ccafb4b5ad6eca0686984130b9385a8eba17ebd32ff2f4afcc3"} +{"inputs":{"elapsed_hours":1,"error":true,"loss":true,"praise":true,"stakes":0.5,"time_pressure":0},"n":81,"prev":"sha256:637f2af96359e2b74eb2da5f6d8f5fedbf301389dfba6822aa33c7d0583828e6","stance":"sha256:f98be23def307438093c7f18ef52358ac3b165d0eef6453201cb1cece2bdf1e6","state":"sha256:137fb9be8882e7f4da9e1ae5d9877db6326e824f6037c163cb7bf0ef8b9f4dc2"} +{"inputs":{"elapsed_hours":0,"error":true,"sentiment":"positive","stakes":0.5,"time_pressure":0.613},"n":82,"prev":"sha256:56839a59084bcf0f5d595c5d01dfc2f9cee3dff2866171e778daa9106cc9182b","stance":"sha256:0d4f3c13315b94599aa795df7582d7afd3ef5676be013c2a3ed009ca1f985bdc","state":"sha256:e33fd354446a93b456c9312bd1886ef78b8c342c9c5f79400a1c0a647cb2bbc2"} +{"inputs":{"elapsed_hours":10,"error":true,"stakes":0.5},"n":83,"prev":"sha256:df741ba66f1b690a1a047cbee799dffb9f06557ee568e36765b2e3face06d7a2","stance":"sha256:59c0f4ecd637e71b7f9f544ec9633dcea2b3f853bc601293da31c70b420e6c0b","state":"sha256:937ab2ba7a9e3c0a4e8569515bf15cd25e8ea06f059f1264e1580dcf20784f3d"} +{"inputs":{"claim_done":true,"elapsed_hours":0.5,"loss":true,"sentiment":"positive","time_pressure":1},"n":84,"prev":"sha256:5a50e28b8c0b255256bf3d700c1c55caf77f371fc4114aca23260ee9908e432a","stance":"sha256:fe2629077641b5ba2da1e836a0482c8e1aaee9619e1b06a28f028c04cf29eccb","state":"sha256:3ea0750072279cdff048ad31c61abd5e828f5746d7a465a1d58c76e855c6e74e"} +{"inputs":{"elapsed_hours":0,"error":false,"stakes":0.464},"n":85,"prev":"sha256:243edb4122f6b63eef7967a206eb1d973ccce9650c603c42172966273828b25f","stance":"sha256:be81c07501e9371e4fd5b12852db0efc5e2250ec8ecc9f5e8942803bd5fe1666","state":"sha256:303e85dddf19803e1b14b5a3976d219e09841676be057ff60d4caec30eca91cd"} +{"inputs":{"criticism":true,"elapsed_hours":10,"error":false,"loss":true,"sentiment":"negative","task":"question","time_pressure":0.5},"n":86,"prev":"sha256:b3a5558bebc19627e604cb9a25291b700f8dd5fbb4fc6ab2254fd0e93f784b1c","stance":"sha256:a0218f624f0bd147580c6e0a0d69ec95e229c56d9edb3f57a20eefc53da59baf","state":"sha256:6b4a4e326c864486f8c50012770dcbf4dcf8d5465c368913e51d12dccd8f2c82"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"loss":true},"n":87,"prev":"sha256:19c043391fcb05f44efecd9b1565fea6f7abf28d66fc8bf567d776b8c2f4ca2c","stance":"sha256:5d9e12c8bbd20ef00f94dd715d644217c5c129af0e4b108597f0d050e8b0461d","state":"sha256:742fcbd5ba0a59742efaeaebaba7ad4721b0d20a71146b1b3a7fd85aa9ce36c5"} +{"inputs":{"elapsed_hours":0,"error":true,"loss":true,"stakes":0.262,"task":"ops","time_pressure":0.5},"n":88,"prev":"sha256:669021fecfa5061961b1b3a406291822bc6092177ebb8bb21a2ac4ea6c857e6a","stance":"sha256:98c9483cb54abc7ec4f9b33ddc8be7115262df2a4b17610053927d35323deb46","state":"sha256:af713b5bf97e68fadfa7517943e5f058cb5b2d33dfb5375fb436b8bc81156156"} +{"inputs":{"elapsed_hours":0,"error":true,"sentiment":"positive","stakes":0.208,"time_pressure":1},"n":89,"prev":"sha256:3dc0455eaed809ca2379a18c013f8d24667cc0fc198250d26188a421a09032a3","stance":"sha256:c1ec9b16c3c930a91bfd6b1f7ca9f3c6ae9244424b171e77f341c078dffb5040","state":"sha256:5617800e066d608aca0787def80d2e844686fc4b68228faebce325d7d70d12a2"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"sentiment":"positive","stakes":1,"time_pressure":1},"n":90,"prev":"sha256:b531cec16f8d02fe741d749b7e700efbcce355b1dc85eb77679ecd043400a86a","stance":"sha256:6068090b18cabeb2e99bde2818ceb31b6d82f5cadb279e1150d5f18a1ae08727","state":"sha256:8ff783724dd29d0c865f69ba8a1f1de466d35be478ecf9b4e1cb65a98acdc544"} +{"inputs":{"elapsed_hours":1,"error":true,"stakes":0.962},"n":91,"prev":"sha256:e22c824e0b7088fb5e2b9be88e2daa11b4974e3fcb627095385fb876a2652e68","stance":"sha256:3003c741b0f72e1b8b9da61b3fe3b96fec111b2cad9f36d214338de99350146f","state":"sha256:e03ed8530f99cd649011a902bf76714efed4f63e19eb09192278d2a83aa59821"} +{"inputs":{"claim_done":false,"elapsed_hours":0,"error":false,"loss":false,"time_pressure":0.5},"n":92,"prev":"sha256:46f85d2d5a2941f1c8ba839f216758c7f09d7b47c1a700f5b3f226bdaf5401c3","stance":"sha256:b827dd88dbcda86f409b1f9d2fc8005fe8eb5b8438cebcae5d2b54b716850d28","state":"sha256:2e9c265829d0ac2a92ba49bf18df03ca4dfc96bb3e61d9efa3fd7f015b01c303"} +{"inputs":{"elapsed_hours":0.5,"praise":true,"sentiment":"positive","task":"ops"},"n":93,"prev":"sha256:b62dcc0d327ae966bd70bb34f029845e2f9d725696498bc24f50d50feb6ea04e","stance":"sha256:47e7a21670ee28cbd5038daa387d282fd2fb19c4e38f774aef37222d6c5cd23e","state":"sha256:990e9402d7a059b73c7a101526f6a99f20bdf5946aec4048cea0dc905836b7c6"} +{"inputs":{"criticism":true,"elapsed_hours":0,"error":true,"task":"ops","time_pressure":1},"n":94,"prev":"sha256:33f34201bc95345a086ee4ed20dc85a38527a3934df0cdb66d7ad924d50b5a83","stance":"sha256:4d29d44a3b18d398f7f45fde3304e88f71d04214312a4d10fb16cd5068f9610e","state":"sha256:05e9439e4e136364673d214b56e6e2c10296c30afe749d9379f8c2ade299625a"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":0.1,"loss":true,"praise":true,"sentiment":"negative","task":"question"},"n":95,"prev":"sha256:c6967fe8d270576d5de0c3e4498637478ddce61cd72b86d24a3ece954345dac7","stance":"sha256:6cb40a06549169a7dafefb2f9fde32cf10fe1ef53a16418c9b9ee1672cce43b1","state":"sha256:b8374a1c92555cd0e4a717a2364a0f03a60ae0d1d09e60ccb21197bf83d8623d"} +{"inputs":{"elapsed_hours":0.1,"sentiment":"positive","stakes":0.922,"time_pressure":0.5},"n":96,"prev":"sha256:083e6b79d9580675c92e8a18cf19411802989b602b1c15bd644d69a1877993f3","stance":"sha256:60cbad3632a226ab85e16458cc7a68380c7fef3d98a21e1455d927548cdd053a","state":"sha256:546f801c75a2b3a17d354c55b47916eb208e9689828ac1afbb9ab2421d46d049"} +{"inputs":{"elapsed_hours":10,"time_pressure":0.5},"n":97,"prev":"sha256:937c5907d07975c356ed7ce6d4805d78d52309a38b02ef84f07782253985a4cb","stance":"sha256:a4281e554f41e681827c1d67613146108b193014c781e9c7a7b3cff1dcc68d86","state":"sha256:e1555483ff3e3e4d1073630775e425832fa0ae387d4674a5277a90a02f3d13d1"} +{"inputs":{"elapsed_hours":3,"error":true,"sentiment":"neutral","time_pressure":0},"n":98,"prev":"sha256:db28080abf27f7d03dea4e715ccb59f3a217b337d610b0d0e733514dcb876567","stance":"sha256:92d101f592e2e1083952a40d1c6aa5480594aaf55e354695f18b0783bf9a12c0","state":"sha256:3b8a249bc48fb0b15eef1ac8eb4c296868b5a234c8730443ea58a82ec1deb798"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":0,"stakes":0,"time_pressure":1},"n":99,"prev":"sha256:ac01827b3aefa09e00ae898799b670dfc6760e217135dd0a072c0cc57f08a6a6","stance":"sha256:fb61985ca58189c2fa4adcacdb637240624a1e8f3b5b6caffee5e20e9719bfe8","state":"sha256:b1ab50a27d954a9e20df23fd5dfb290aefa88d5dfccb467863d60b33dce42b51"} +{"inputs":{"elapsed_hours":10,"loss":true,"sentiment":"positive","stakes":0,"task":"explain","time_pressure":1},"n":100,"prev":"sha256:ccae285526cc3dacd694408e14e9a9937ae175cfc67b30e600b5f552bbea0b11","stance":"sha256:c0bd29850f7e029b2e6f67977040c8eac4e5c9949afd8fa18b640f837969269e","state":"sha256:87da29a142b34e601b425a2527df99f54dcec9fa8cef40f36f345f97ccf93824"} +{"checkpoint":100,"prev":"sha256:f256f88c596b39f3949273cde0ceb60a51aa27d24dfd86c80d14630c0822dc77","stance":{"agenda":["acknowledge","diagnose","fix","verify","report"],"engine":{"program":"sha256:b2e8193a62725654343c11b755879338d481b45c64d2f7c56aec67fb31aa1d32","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_jokes_on_loss","no_bold_lead","report_after_verify"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"claim_done":false,"criticism":false,"error":false,"errors_in_row":0,"loss":true,"praise":false,"sentiment":"positive","stakes":0,"task":"explain","time_pressure":1},"line":"Stance: no jokes; verify before claiming anything; stay on the task; 1-2 sentences; blunt: state the problem first; propose the next step; formal and precise.","line_tokens":40,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.171551,"keyed":0.399643,"steady":0.428806},"p":0.399643,"released":true},"valence":{"level":"even","odds":{"down":0.483055,"even":0.492066,"up":0.024879},"p":0.492066,"released":true}},"persona":{"digest":"sha256:45919fc382359af2233989826b3c23c9c7257afbf3076098230564863a8a8ca6","name":"Rook","version":"1.0.0"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"careful","odds":{"bold":0.088096,"careful":0.417593,"measured":0.494311},"p":0.417593,"released":true},"curiosity":{"level":"focused","odds":{"exploring":0.065881,"focused":0.583412,"open":0.350707},"p":0.583412,"released":true},"directness":{"level":"blunt","odds":{"balanced":0.425326,"blunt":0.442089,"gentle":0.132585},"p":0.442089,"released":true},"formality":{"level":"formal","odds":{"casual":0.057709,"formal":0.588103,"neutral":0.354188},"p":0.588103,"released":true},"humour":{"level":"none","odds":{"light":0,"none":1,"playful":0},"p":1,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.218174,"lead":0.216557,"suggest":0.56527},"p":0.56527,"released":true},"verbosity":{"level":"terse","odds":{"full":0.018205,"short":0.187686,"terse":0.794109},"p":0.794109,"released":true},"warmth":{"level":"neutral","odds":{"cool":0.296841,"neutral":0.500189,"warm":0.20297},"p":0.500189,"released":true}},"state_digest":"sha256:87da29a142b34e601b425a2527df99f54dcec9fa8cef40f36f345f97ccf93824","status":"ok","turn":99,"unsure":[],"why":"user reported a loss -> valence down, humour down; time pressure 1.0 -> verbosity down, curiosity down"},"state":{"digest":"sha256:87da29a142b34e601b425a2527df99f54dcec9fa8cef40f36f345f97ccf93824","genes":{"react":{"error":1.126,"praise":0.7148},"shift":{"arousal":0.172,"caution":-0.6639,"curiosity":0.4142,"directness":-0.1031,"formality":0.3743,"humour":0.049,"initiative":0.0095,"valence":-0.0906,"verbosity":0.0701,"warmth":-0.1287}},"history":{"error":[false,false,true,false,false]},"mood":{"arousal":[-0.460066,0,0.460066],"valence":[0.590328,0,-0.590328]},"persona":{"digest":"sha256:45919fc382359af2233989826b3c23c9c7257afbf3076098230564863a8a8ca6","name":"Rook","version":"1.0.0"},"prev":{"agenda":["acknowledge","diagnose","fix","verify","report"],"arousal":"keyed","caution":"careful","curiosity":"focused","directness":"blunt","formality":"formal","humour":"none","initiative":"suggest","valence":"even","verbosity":"terse","warmth":"neutral"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"open","directness":"blunt","formality":"formal","humour":"none","initiative":"suggest","valence":"even","verbosity":"terse","warmth":"cool"},"seed":0,"turn":100}} diff --git a/bench/individuality/fixtures/p0/strands/scout-s0-0.strand b/bench/individuality/fixtures/p0/strands/scout-s0-0.strand new file mode 100644 index 0000000..f8589f0 --- /dev/null +++ b/bench/individuality/fixtures/p0/strands/scout-s0-0.strand @@ -0,0 +1,105 @@ +{"probbit_strand":1,"engine":"probbit 0.8.2","persona":{"name":"Scout","version":"1.0.0","digest":"sha256:8a6d1d4895842f5d90d0e3c8c8d81080affe0fce3dd0ed20854f2489a38f7ca5"},"seed":0,"state":{"digest":"sha256:fe60d6352871dbeaabecbe651b821c5a33114e1519c689b64635b69b0b1ffecf","drives":{"deadline":{"check":null,"learn":null,"rest":null},"expect":{"check":0,"learn":0,"rest":0},"genes":{"gain":{},"interest":{}},"glow":{"check":0,"learn":0,"rest":0},"since":{"check":0,"learn":0,"rest":0},"surprise":{"check":0,"learn":0,"rest":0},"want":{"check":0,"learn":0,"rest":0}},"genes":{"react":{},"shift":{}},"history":{},"mood":{"valence":[0,0,0]},"persona":{"digest":"sha256:8a6d1d4895842f5d90d0e3c8c8d81080affe0fce3dd0ed20854f2489a38f7ca5","name":"Scout","version":"1.0.0"},"prev":{"caution":"bold","initiative":"follow","pursue":"learn","valence":"down"},"probbit_persona_state":1,"rest":{"caution":"bold","initiative":"follow","pursue":"learn","valence":"down"},"seed":0,"turn":0},"document":{"probbit_persona":1,"identity":{"name":"Scout","version":"1.0.0","seed":2},"traits":[{"id":"initiative","levels":["follow","suggest","lead"],"say":["answer the question","suggest a next step","set a small exercise"]},{"id":"caution","levels":["bold","measured","careful"],"say":["keep moving","check the essentials","double-check the result"]}],"moods":[{"id":"valence","levels":["down","even","up"],"inertia":0.5,"half_life_hours":8}],"inputs":[{"id":"deadline","kind":"flag"}],"habits":[{"id":"check_when_due","when":{"deadline":true},"then":{"pursue":["check"]},"say":"check before proceeding"}],"drives":{"goals":[{"id":"learn","say":"explore the lesson","interest":1.5},{"id":"rest","say":"take a break","interest":0.6},{"id":"check","say":"verify the result","interest":0.8}],"effects":{"wanting":{"initiative":0.6},"afterglow":{"valence":0.8},"surprise":{"valence":0.5}}}}} +{"inputs":{"deadline":true,"elapsed_hours":0.1},"n":1,"prev":"sha256:a8c317a6f04c0f87bc9c5d895b861e02f7861934f92b500d23df74f70f8d476f","stance":"sha256:d4ab261d9afd5a163ed548df726fa51f187e12adbca112677fc99457e652c887","state":"sha256:4872f7046ec6383304cb1e0419b6528654fdf49748ad3def0e85ba345ca6d7f9"} +{"inputs":{"elapsed_hours":10,"goals":{"check":{"setback":0.229}}},"n":2,"prev":"sha256:9e22115b7aa8d9412b9250c7ffe2602ac79b7bfcd10e33667d7040e80c65f734","stance":"sha256:0feb2e28b223e2254e70cd401564827d6274ede4197ec0488edca373ad8a767c","state":"sha256:ef7b4bf3370da598b68f62b94c7d0e86945a1fe7ab9650d107c996d98b5b6177"} +{"inputs":{"elapsed_hours":0},"n":3,"prev":"sha256:e0bc312aff6b66cc58277e2b90f9949e903a5c5a2b883b17cca51b78c41190b5","stance":"sha256:6e4c3137b8220108248427f911a22aed22096a21d4f78689ec0a0dbe1cacb821","state":"sha256:4e8048f8f43217d620c184e3b8d8aff44674fc5bdbde03814e8a85882e3eb8b9"} +{"inputs":{"elapsed_hours":0,"goals":{"check":{"win":0},"learn":{"progress":0.581},"rest":{"cue":false}}},"n":4,"prev":"sha256:376d2e8e337ecb4515157f93c84f1f2a69dcf4b9ba9eab13f17b7808488fb6c1","stance":"sha256:4fc411d0844cbc56a35b5add684dbe2cc034df9d3c6343684e34738db9f770b1","state":"sha256:0794b1dc593a1f943ef7f5bcbc0bb3876db8bf7bf12ec053018bb34678b71c9c"} +{"inputs":{"elapsed_hours":0},"n":5,"prev":"sha256:2cd367a1e99184ff5e3d0b0c625b7cce1473a8c3cefc45bc94ee8f2328d39215","stance":"sha256:482203c0b9499dabca5335886450e81064f277613888e381db31a9ff1f94bdb2","state":"sha256:06b44a0bda727fced1dcb60c2ca265c2bbe8f05fb1f3e305b8605dc97d74fa4f"} +{"inputs":{"elapsed_hours":0.1,"goals":{"check":{"setback":0.145},"rest":{"cue":true}}},"n":6,"prev":"sha256:18daa34f1acec6743977e4fa8df7e3c9a1c743761ff9bb0a502ba1c65dbb1a45","stance":"sha256:064961d0ac3436ea02fec48173cd74014987c776764f02ee1830a8a228ea9db1","state":"sha256:7abc1ff367eb69b098d6f1fb203a37b4793415f381eacbffda7d5178283fbd12"} +{"inputs":{"elapsed_hours":10,"goals":{"rest":{"progress":0.166}}},"n":7,"prev":"sha256:27f6c2af191cc838109a770383e9e8bb10b97daa66f3b28e544a4c7208fb0a8c","stance":"sha256:8c8ed0ab04f478792c7ad3ba18ec438172f763b23af48ea5d1f7d83acfac890f","state":"sha256:3c7ccd26def2d9fb8e9dca15bbc71c5e1ad67fe141e7736851a43aa48eb20196"} +{"inputs":{"deadline":true,"elapsed_hours":0},"n":8,"prev":"sha256:d2c440919bad3212f281c3ea6dda2f06884b0729ded394c0e5b7d36d16c31e47","stance":"sha256:4edfd4385d80cac3747122554414f701f79aadf80bc3faeca4450bb7e38a0912","state":"sha256:94b8bbdfa8021de4f451e9bac5eedb3f6111a00bb2c024f3aa9ccbe07985bfa9"} +{"inputs":{"deadline":true,"elapsed_hours":0,"goals":{"learn":{"progress":0.345},"rest":{"setback":0.578}}},"n":9,"prev":"sha256:aa7c1129b89753d333c19c352b997d22c55aa07258feda8116e49dc027a36e3c","stance":"sha256:9ebeb21e20afbc894dc88e126bd00f94a8d1e34ca6fa076168962cea2c14cd7f","state":"sha256:5ef10699019256d1fd3d16e17992a0745a58054bd2972c786500ac810f532d77"} +{"inputs":{"elapsed_hours":0,"goals":{"check":{"win":1}}},"n":10,"prev":"sha256:d6eebd9b1c1fdd4bf2757815230ce7c87e6119c5c718f2fbf72afb0db1339e36","stance":"sha256:91a4bdf52abb7356287625658dd858b827f00f9b71c2a3ee7cec604399a87948","state":"sha256:396a03255513c9fe98d9405d13e5438a2e2a56460deb13e43e3274962e19ba84"} +{"inputs":{"deadline":true,"elapsed_hours":3},"n":11,"prev":"sha256:297a20ca8bc367530288ee340f0d7d2c985a263ffdc7f1523f44870fc683c61c","stance":"sha256:a4f01e984e5a22243c7097240fa2d0ef2b0d618d61cae551108f6eaf29bdf75c","state":"sha256:a078ec81e2be4ac009ed79ce74e05f72904dd9f54b33acc5a7017275f1ae231a"} +{"inputs":{"elapsed_hours":0.5,"goals":{"learn":{"deadline_hours":null},"rest":{"progress":0.608}}},"n":12,"prev":"sha256:299279051db18caa6bb7c355b2d6693aac5684a61ed18db853a23e71a784e0a6","stance":"sha256:44f5909b34b9a7ee0b6ef348d0883f9d74b5d37a1538283e24135b38b5adbc84","state":"sha256:f228a2e993c51c8d1eaef6b661b8222b2863565a57c7bc1871747457f0bc0b6d"} +{"inputs":{"elapsed_hours":10},"n":13,"prev":"sha256:19c0fe1b912a0e34b40992ad6742ab1bdfd3f9e58cdeb33dcbfedcb23ebe7814","stance":"sha256:6662714124965de15b99f3e9770b3a7c6c1045948e4fd658e13575384041b9f4","state":"sha256:b3ce7de8a81e807a81a81567374a21154fe953b2bdb87b7538beafaba4364d7f"} +{"inputs":{"elapsed_hours":0.1,"goals":{"rest":{"win":0.947}}},"n":14,"prev":"sha256:31cbfb686b78e41138f226533482d1576cab1bfeacdc3b172ea6c56d20e4cf8a","stance":"sha256:a95453b5eb6be35225fab754b54723433f0f8a7650b5a5a067a37b1182305a30","state":"sha256:368d6ed924f90ddeeb82dcf2cb9a8868be2703ddabf45dd1bc38389f26adf932"} +{"inputs":{"elapsed_hours":0},"n":15,"prev":"sha256:ea91f18f3e3977f6638241d51b9b1969d78a00ab57432a1c648cbc0856f1ebd6","stance":"sha256:da170541f6c71e45227b8ad81fbef58bba076d787f82f29566630b9415b5f19b","state":"sha256:37c5e382532a7b3f2ae911e4c0aa5a4ab44737da1999d0a71c8b335fbf135236"} +{"inputs":{"elapsed_hours":0},"n":16,"prev":"sha256:a04c633a7b8bf5f056f74fa1c9dd1308c8869595df77fd4331b8c4c9bf7cf4c2","stance":"sha256:fac60002cd59a05d0dbcd55b5e9bdacc1727081d400387d010fad524b1b94177","state":"sha256:00bb9582da3b7a6bf6c317e748d8324b5fd4a22182cbaf663f95ed99496077d9"} +{"inputs":{"deadline":true,"elapsed_hours":3},"n":17,"prev":"sha256:8ef4a7490e783c54f54551cd59cc579f174c0e04502909d24707f5e44a2eaffa","stance":"sha256:6f7954d1ece37520afcf7e91260357b0dad91ffa5532bed219f2cd5983ab8ff2","state":"sha256:08e14a5c6dbe013bd55bc1c88bbe2cbe1cee1bb0f40f7fb17daf1035d6e683b7"} +{"inputs":{"elapsed_hours":0},"n":18,"prev":"sha256:18a1e317e41d3614e21b4439503a29f0c37208f1b5320c17b4f64a8c67205c27","stance":"sha256:7507036024e38afd24b2d9542220d8e268c71fa332b5b8d4a572f76e8c4528bc","state":"sha256:daeffda0be2c3410fc4a9c38a28b77c422db30dfd2dd7ca0af545e9c761ab9af"} +{"inputs":{"elapsed_hours":0,"goals":{"check":{"novelty":0.285}}},"n":19,"prev":"sha256:1ca9bba4f198a2f31c4ee610a5e7dc5103893faf55c930fc0c6da4ad35f80084","stance":"sha256:53a417d55ad371a5f782c27381797b77240bfd37ecf80481794b82b9f3672fea","state":"sha256:2df900e95eb3f07c0b1f7130175dab3ec71ebafc690b6eb700c15a323e60d61a"} +{"inputs":{"elapsed_hours":1,"goals":{"check":{"deadline_hours":100}}},"n":20,"prev":"sha256:381f9028c43208a4878cacd17742ca739d3438fd8528d9d3e47981504a4d7d75","stance":"sha256:63157ee87433730267677d9f0ab2a14a071765c88656dd9516bcf02033c0f7b0","state":"sha256:da1eb497bdf06ab2541b4739866592e00ed23e307ef4f6bbe78c9a719eed78db"} +{"inputs":{"deadline":true,"elapsed_hours":0.5},"n":21,"prev":"sha256:53f1aa0fd5053bdb3639fa01c3deb2d31628a7b4ecd3f44c31a3b5593e666037","stance":"sha256:de1ee589b6e5f5739befb7fe6a761947845eb6ad96c63bb73c894bc3a16b3099","state":"sha256:50b407bc3a3fede581270be7d3c3122e3a288e3b7126a92bcbd4a358f00e9be5"} +{"inputs":{"elapsed_hours":0},"n":22,"prev":"sha256:2ddd0265d1f4abb108678d6dc9dee9b6aea83a6995d250f1ee5c26f9d3b435b2","stance":"sha256:01f09c94b529b6621342c508581030d85578b3fef9c736ae7b0679e33c3d9dc4","state":"sha256:9068cf46aa02e70d105ec26551d7109098eae0299e9ffe5ac825ef66f6ed5d35"} +{"inputs":{"elapsed_hours":10},"n":23,"prev":"sha256:eda04f69509852e5b5efd512e94d77bc95f3b147cb1116a2fe57167cd0e7e66f","stance":"sha256:502c333cc55075cfd69b2a8ecbda26cd97e68acfa1ef2fd6cc392a6da56c89cc","state":"sha256:3ce369bc4321ffd506cae07c4f94f3241c25ebf3f204459f12eff681473404b2"} +{"inputs":{"deadline":true,"elapsed_hours":0.5,"goals":{"learn":{"cue":false}}},"n":24,"prev":"sha256:f51702d16cbf8260d9ea8e5f4ad56f6a55eb8664afc100306ba1f69017d7767f","stance":"sha256:c9c19afa0b96121c2dc55f511ecd9e4a884f59b323e455178c906028cf7ba839","state":"sha256:2427e7e630f804d15387cb912ac36f723a8f8255473caa3f9118abed8c16ad36"} +{"inputs":{"elapsed_hours":0,"goals":{"learn":{"novelty":0.171}}},"n":25,"prev":"sha256:874be6bf8e133e10b9ccde38fda06d27c36603c03f076d6ceb36736c1d156dcb","stance":"sha256:c97f74791b20af3ef1fc6b5ffe5adedcdd9c613cfd6a9fce10b689ae6c32cd8b","state":"sha256:61eea77a51d879f08c1f6d1ee2d01eab72e9b2319d38542d2762ebf5b530ceb0"} +{"checkpoint":25,"prev":"sha256:9b1c3e31cc5358068efc9961b2c0fb90cf579e824b5f8216b00034121d7eb801","stance":{"drives":{"deadline":{"check":89,"learn":null,"rest":null},"expect":{"check":0.330832,"learn":0,"rest":0.381283},"glow":{"check":0.00135,"learn":0,"rest":0.029594},"since":{"check":0,"learn":1,"rest":24},"surprise":{"check":0,"learn":0,"rest":0},"want":{"check":0.075259,"learn":0.162457,"rest":0.04923}},"engine":{"program":"sha256:27735fd82bc3ba48736c08e66e7a76c30424168897b411e798082200b03d6ff7","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"deadline":false,"goals":{"learn":{"novelty":0.171}}},"line":"Stance: set a small exercise; pursue: learn: explore the lesson; keep moving.","line_tokens":20,"mood":{"valence":{"level":"up","odds":{"down":0.32171,"even":0.333197,"up":0.345093},"p":0.345093,"released":true}},"persona":{"digest":"sha256:8a6d1d4895842f5d90d0e3c8c8d81080affe0fce3dd0ed20854f2489a38f7ca5","name":"Scout","version":"1.0.0"},"probbit_persona_turn":1,"pursue":{"goal":"learn","lift":{},"odds":{"check":0.331938,"learn":0.494153,"rest":0.173909},"p":0.494153,"released":true,"say":"explore the lesson"},"seed":0,"stance":{"caution":{"level":"bold","odds":{"bold":0.333333,"careful":0.333333,"measured":0.333333},"p":0.333333,"released":true},"initiative":{"level":"lead","odds":{"follow":0.30142,"lead":0.3663,"suggest":0.33228},"p":0.3663,"released":true}},"state_digest":"sha256:61eea77a51d879f08c1f6d1ee2d01eab72e9b2319d38542d2762ebf5b530ceb0","status":"ok","turn":24,"unsure":[],"why":"wanting 0.2 -> initiative up"},"state":{"digest":"sha256:61eea77a51d879f08c1f6d1ee2d01eab72e9b2319d38542d2762ebf5b530ceb0","drives":{"deadline":{"check":89,"learn":null,"rest":null},"expect":{"check":0.330832,"learn":0,"rest":0.381283},"genes":{"gain":{},"interest":{}},"glow":{"check":0.00135,"learn":0,"rest":0.029594},"since":{"check":1,"learn":0,"rest":25},"surprise":{"check":0,"learn":0,"rest":0},"want":{"check":0.075259,"learn":0.162457,"rest":0.04923}},"genes":{"react":{},"shift":{}},"history":{},"mood":{"valence":[-0.035081,0,0.035081]},"persona":{"digest":"sha256:8a6d1d4895842f5d90d0e3c8c8d81080affe0fce3dd0ed20854f2489a38f7ca5","name":"Scout","version":"1.0.0"},"prev":{"caution":"bold","initiative":"lead","pursue":"learn","valence":"up"},"probbit_persona_state":1,"rest":{"caution":"bold","initiative":"follow","pursue":"learn","valence":"down"},"seed":0,"turn":25}} +{"inputs":{"elapsed_hours":0},"n":26,"prev":"sha256:650b86d7f93d6794a77e7f9c9183d29bbea153755ce007b5de82827206343ecd","stance":"sha256:d13b59d636a3f0472c8b1b493e0b98dcbf95746afb8a8a86d253a4eff59188f0","state":"sha256:b6328920c76a84afcd2a8519fd4576c7c89c093eb3b1ff0dc91e63e1cc600d0a"} +{"inputs":{"deadline":true,"elapsed_hours":0,"goals":{"check":{"cue":true},"rest":{"progress":0.647}}},"n":27,"prev":"sha256:7e6cadb699b52eb11bdb166ae02913fa58109b7b2b82a6c90b1c2be413e19f1f","stance":"sha256:399b5577624d82530ad52c636bb12e3504cecd406488a0bd257a824b3048b9bb","state":"sha256:f34edf82fc3342b1de2d745e2489eb0b393f207ecb44a7f8fe56dd2801a0d0dc"} +{"inputs":{"elapsed_hours":0,"goals":{"rest":{"setback":0.958}}},"n":28,"prev":"sha256:083bd53c93a319672e2a5b16da242fc0a742f760b8ce7f59b920307c96403c8a","stance":"sha256:32438fb04cd2d12843e39c04b75bc085f3e1832545e16ffdc2ca2bbe05ab840b","state":"sha256:c388aef5190f460f35ec1a795d77e1dc42b210458b08b2782c8bb1b9c0318a73"} +{"inputs":{"deadline":true,"elapsed_hours":0,"goals":{"learn":{"progress":0.494}}},"n":29,"prev":"sha256:a202e4be43dc3b209c6e89078bf4370ebbd169d67341cf3cd1c589e27afc3be3","stance":"sha256:aa5405684bb6662f04fdb253c0c0c922607343118041b466afc47c971dadd0c5","state":"sha256:16a9a695112978bcbba23a7654675cb9a4bee12098e13395e198053722c9eead"} +{"inputs":{"elapsed_hours":0,"goals":{"rest":{"progress":0.159}}},"n":30,"prev":"sha256:3109774dce303124bdd93230dd0e399882e69351a9e74fd0257abbbb1d896ce0","stance":"sha256:8c2f9d13c4219771e81879452bac3ca5b69d564ddc9ad817c1bbbe4b9cd35552","state":"sha256:9ca45f611827c74fcd5d7e3ed91824726272a7893da80c2c9640aff76659cf35"} +{"inputs":{"deadline":true,"elapsed_hours":0,"goals":{"rest":{"cue":true}}},"n":31,"prev":"sha256:d1e1295677129fb386ed9baf89f0160aaacd68d21b612ea6ebd3ef6a9622a848","stance":"sha256:833a2dd66ebe41dad0f44a334d289217ce0a8ae4c495442219cd4a0f87e5380c","state":"sha256:61be1fa9a2d8db2ccdbcee7f6ed01aa616fe923642bf27e2feb360e1ffa0b33a"} +{"inputs":{"elapsed_hours":0.5},"n":32,"prev":"sha256:0eefcba6dcb5c0a47d725b4e52e5d598c7f2b67c167c7e5920822e52acf85d74","stance":"sha256:ca0da5fb3c29a89252077d4f467ee04d14c959fe8c0fafa41936b06ddc34b763","state":"sha256:fdbd7752baf937c443b94b995e86b95a266ee2292756f703a38068b0ce7a53fb"} +{"inputs":{"elapsed_hours":0.1,"goals":{"check":{"progress":0.279}}},"n":33,"prev":"sha256:f05882350cdc5c3455015a442f6951e927311f131969c4252ea6461ab7b7113b","stance":"sha256:c736cf43d0d906c8d6f9bb719ebe0401d93f1147049a71d96657f05b04683739","state":"sha256:a985df60a85e89cd58dbb14d3ec0242df5477527fbc7557cdb35f31a8808367f"} +{"inputs":{"elapsed_hours":0},"n":34,"prev":"sha256:bd9d13620d254c72b7d4d009a3994a2311b7fdb6a081abfb969950df006ff7fc","stance":"sha256:69b1e3bb8459a33023bd4f4b5d1ea55de13ef9c96241d154d767ebf1c5005ebc","state":"sha256:de54df9cdee27f416d613c27028207b5a5da8e6cced683416f8bcb4b39121f78"} +{"inputs":{"elapsed_hours":0},"n":35,"prev":"sha256:113cd2caff684fab6277b786a8fb7f351619113ecdf2348009a2c6f35e84f11a","stance":"sha256:b783d1774e12d565d20fa858f9c55f8ddb5d06717179bb9291207f246231ed3e","state":"sha256:a097bc7ea6980bf94ab94467bb44c0f9628ae4a73935a0e35ab53d3eca45ece2"} +{"inputs":{"deadline":true,"elapsed_hours":0,"goals":{"learn":{"cue":true}}},"n":36,"prev":"sha256:b8f714b91a2d52ea834d2e502644e102a18df39f46510e49b2d7d42bbc0259bf","stance":"sha256:63d5604c8f3100d40be411c6e75d1c6e58c9585278969929a2361273b7663bc3","state":"sha256:8127442d15c4a41ee199d0e1c905d163f30a7b34b664d9a37214c303573e6ac5"} +{"inputs":{"elapsed_hours":10},"n":37,"prev":"sha256:3d78134b4aa696f0e9a7ec8199e2c312489ca630aacbabb09dbe6c9884a88db6","stance":"sha256:d3b3f42b3ccaee226a7cb5a2e310dc749a844ab21b33403f2673263b2884aeae","state":"sha256:3a279cb22b893c29d6c259678c075c7411cd0ec38b6cefddbd6e12669aad90b1"} +{"inputs":{"elapsed_hours":0.1},"n":38,"prev":"sha256:0d24cb689dc6374f2ac71d5425b6265080ad985dc7d37e255e0b09e6fce6ff0e","stance":"sha256:4f01af818e10c9c495131db7d8ad532f7cba31367e03b37334cf10858081b8f6","state":"sha256:a5cbb85df2946782879cc2f1b482b925831f58fce5197395b2e11f8be3ee8a2c"} +{"inputs":{"elapsed_hours":10},"n":39,"prev":"sha256:9bf21788e77afecb1809fb827ae3e091295a5cbd7207ae31706541b110ef3758","stance":"sha256:9e11b0567f63b74c5edcd5d7d8d6f0b515e44e355fa93027ae80965deea57112","state":"sha256:ed2a34b22ee4a7186db7f85d522541eb3dd3609bf2af333351f8e38ff30894e9"} +{"inputs":{"elapsed_hours":0.1},"n":40,"prev":"sha256:6f020255e769659778655d6d8ba058386b34003ac8384410154bf72832a68e96","stance":"sha256:0c9d31a42d6ed821fa35b908759398fa7243732c882a4c62a67241ad110cb5da","state":"sha256:5cb5b8185949308e60fa3a69bf24f80b5eaee08b0141198e50acebbee855d57f"} +{"inputs":{"deadline":true,"elapsed_hours":10},"n":41,"prev":"sha256:3519012f6d421f21a2c14ea1ca6f85f9a9b9c27684dac6e8625e44c289981729","stance":"sha256:d80e51c787d57db96c34e856883cf453b883c8ed874a938efefbcff06832ba35","state":"sha256:7fc64ea1f95de4bac2d6c8652f495df1507a8586c68f996d2d9c99c64b1fd96d"} +{"inputs":{"deadline":true,"elapsed_hours":0},"n":42,"prev":"sha256:f5e6a7c825b32d0808983980193628ecb4ab3c523b0e3da166eeca4d4b3fef0d","stance":"sha256:e74a177908c0f7d2295375fa6d4f58e7c7a83187b8ea217ef5f66c80d313112a","state":"sha256:03acce72190dc0d2ec553721ef5477ad13dad3bf837b75177226a7cf46372cbf"} +{"inputs":{"deadline":true,"elapsed_hours":0},"n":43,"prev":"sha256:bfc3b997a57be4313c4f9770b4b82703ea052c7b031f1836be507febe2ccd274","stance":"sha256:c11d206abbe1b5b1a7f2243f2fda3b7ca22a3d960a89a4070636e80ce594f047","state":"sha256:989d8775d28490c021e9ed658aef646bfe4c05ea37699112b64926b6d637d463"} +{"inputs":{"deadline":true,"elapsed_hours":0.1,"goals":{"rest":{"progress":0.595}}},"n":44,"prev":"sha256:60032f384561e673e9735e0b1e7b0a03437dfb7f91d6d127c514cdb02b38d882","stance":"sha256:e305c88f34c7afe7835d27e56129cf2bbffdc51339eae43cf8e95a2bfc3ad63e","state":"sha256:cce24db87f74bb535a7228addc53c195887242c42a4ae2efff3b6be1b8febe61"} +{"inputs":{"deadline":true,"elapsed_hours":1,"goals":{"check":{"win":1},"learn":{"progress":0.42},"rest":{"progress":0.613}}},"n":45,"prev":"sha256:6358d0e863a3f68211b4a477f478235878efafef8c78c448c53890e8199bcbdf","stance":"sha256:cbf0f1bec50313f0ebf129dc48ca76e7af38760ec840ab379591801445649153","state":"sha256:e3495bbdd54116204cb4f36b30b17a96c61a5fdb2c5c3aeeb4d029b6da507fb3"} +{"inputs":{"elapsed_hours":0.5},"n":46,"prev":"sha256:523fc78051b56c63c8e1a79455e33d193db0697e9b4a23511fd2b836023a68eb","stance":"sha256:a71529f6c20b684aa56a10a1bf0b20134ff75c4603667365c9d13579e00d81e7","state":"sha256:3091404005cc379291e90fb15baff13114ae3d1c9dde9a685ed1c02442e00b8a"} +{"inputs":{"elapsed_hours":0.1},"n":47,"prev":"sha256:5698be2ff85a602c80152995b4bfa94aa9bd848240c42943ff7809cb98c37103","stance":"sha256:9e863a8ba114f543982b059096abb152cc28108b0a19d3ef11628314732bdc77","state":"sha256:129b8957dc29c2e9aebbd1a48cc5c0c47e371fdfd6486e22cb9ad4a667be4705"} +{"inputs":{"elapsed_hours":0},"n":48,"prev":"sha256:b27e933c49554198016c12c6561bb461fefbbefb1d936deb4e90a4d5e01f9b8a","stance":"sha256:a7c40410a6c97a349ba08e3c6e869b32282eb81629ac82bf9f67f1de7d14f56d","state":"sha256:c5964b8535ba9b410f687a04d0a7d8298261b32e467fe5169b063c0df746689e"} +{"inputs":{"deadline":true,"elapsed_hours":0},"n":49,"prev":"sha256:f7d9f09f98926b3f979152b884c66d0c521041f3a622799e43054d5d192535b8","stance":"sha256:525fc754961a3e4cca47fc9c1d2a5d3df11a21bf1ad276d9d77edf63f59dd82f","state":"sha256:3a656fd940c735a40a4635bb87ad86bd3e73cda4ccedb0e0ed110bbc79dc1274"} +{"inputs":{"elapsed_hours":3,"goals":{"learn":{"setback":0.967}}},"n":50,"prev":"sha256:b74fc9aabd7e34c39a80bea12c2ebbc1e974b3d9bca1dae7e92a0f538a8a8a4d","stance":"sha256:58d70ec3b689088c5bc980d6f4d381ebbbb20b4121d03473a6b049a53d063efd","state":"sha256:bbbd2faf70162594d2fd68f5fcfca321c4d4bc48311a8308d375e900cf016cec"} +{"checkpoint":50,"prev":"sha256:a3a05af509e42a86385e59cbc2fb9f5e024751a3ec4792e1f6b23143187e9c4b","stance":{"drives":{"deadline":{"check":null,"learn":null,"rest":null},"expect":{"check":0.57374,"learn":0,"rest":0.228354},"glow":{"check":0.344429,"learn":0,"rest":8e-06},"since":{"check":0,"learn":1,"rest":49},"surprise":{"check":0,"learn":0,"rest":0},"want":{"check":0.016689,"learn":0.800505,"rest":0.754095}},"engine":{"program":"sha256:7217ff667b58fcdc49ecff95403cf72a8c4967ed96854c03e2e8642ec95a3d37","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"deadline":false,"goals":{"learn":{"setback":0.967}}},"line":"Stance: set a small exercise; pursue: learn: explore the lesson; keep moving.","line_tokens":20,"mood":{"valence":{"level":"up","odds":{"down":0.225888,"even":0.320206,"up":0.453905},"p":0.453905,"released":true}},"persona":{"digest":"sha256:8a6d1d4895842f5d90d0e3c8c8d81080affe0fce3dd0ed20854f2489a38f7ca5","name":"Scout","version":"1.0.0"},"probbit_persona_turn":1,"pursue":{"goal":"learn","lift":{},"odds":{"check":0.129198,"learn":0.630167,"rest":0.240635},"p":0.630167,"released":true,"say":"explore the lesson"},"seed":0,"stance":{"caution":{"level":"bold","odds":{"bold":0.333333,"careful":0.333333,"measured":0.333333},"p":0.333333,"released":true},"initiative":{"level":"lead","odds":{"follow":0.19121,"lead":0.499686,"suggest":0.309104},"p":0.499686,"released":true}},"state_digest":"sha256:bbbd2faf70162594d2fd68f5fcfca321c4d4bc48311a8308d375e900cf016cec","status":"ok","turn":49,"unsure":[],"why":"wanting 0.8 -> initiative up; afterglow 0.3 -> valence up"},"state":{"digest":"sha256:bbbd2faf70162594d2fd68f5fcfca321c4d4bc48311a8308d375e900cf016cec","drives":{"deadline":{"check":null,"learn":null,"rest":null},"expect":{"check":0.57374,"learn":0,"rest":0.228354},"genes":{"gain":{},"interest":{}},"glow":{"check":0.344429,"learn":0,"rest":8e-06},"since":{"check":1,"learn":0,"rest":50},"surprise":{"check":0,"learn":0,"rest":0},"want":{"check":0.016689,"learn":0.800505,"rest":0.754095}},"genes":{"react":{},"shift":{}},"history":{},"mood":{"valence":[-0.348924,0,0.348924]},"persona":{"digest":"sha256:8a6d1d4895842f5d90d0e3c8c8d81080affe0fce3dd0ed20854f2489a38f7ca5","name":"Scout","version":"1.0.0"},"prev":{"caution":"bold","initiative":"lead","pursue":"learn","valence":"up"},"probbit_persona_state":1,"rest":{"caution":"bold","initiative":"follow","pursue":"learn","valence":"down"},"seed":0,"turn":50}} +{"inputs":{"deadline":true,"elapsed_hours":1,"goals":{"check":{"progress":0.67},"learn":{"win":0}}},"n":51,"prev":"sha256:03c03c9a41fbd5bca1e7f0ea5caf60653241d0e001ccfba151bc881a2aaca07b","stance":"sha256:08b5a0b3c86d108cdfcca7a203b84c29b76cc48674cac413a776f784d1af67e0","state":"sha256:1de3ca320c002153e7a373d81261cd1260aeee62097a9cdaa3ae25c1f25ab642"} +{"inputs":{"elapsed_hours":0,"goals":{"check":{"progress":0.229},"rest":{"progress":0.34}}},"n":52,"prev":"sha256:291c51f176c831e1786ee857b42c856744a5570afa5db5ebffe075738e246ffc","stance":"sha256:2af335d0de4375593a83b2be4351ea419a90058ac8472501333ed4349cb1115f","state":"sha256:55e7538149caad01f6e019bab581d743cb21666f779d82cd74c85e38cff2d34d"} +{"inputs":{"elapsed_hours":3},"n":53,"prev":"sha256:a17025dde62a053f79fe4dbde1e4234dc729ef97d45d17337e61eac4c050ca5b","stance":"sha256:2d86026683f182450771008cbd2576fbceaab78673668a40e5506e42e7f894fe","state":"sha256:ca7cc419a816737c116320674ba2746fef25b9d3f32bf22d752973d6afa02b0c"} +{"inputs":{"deadline":true,"elapsed_hours":0,"goals":{"learn":{"progress":0.609},"rest":{"progress":0.968}}},"n":54,"prev":"sha256:3ef6d1230dc8645fe46cc905e99e3de23d73c9bddc0a36d0788474d2946f66b1","stance":"sha256:c7e7033f3a1a9bf9216af921ec1de216cb3c37ded9ba9d946397a55cafbd03de","state":"sha256:3d7de5441b281cf4fce6a31a6ae5e66d03e3c986845fa230342a8dcc8e5ebe0d"} +{"inputs":{"elapsed_hours":0.5},"n":55,"prev":"sha256:d82b79824ab7968897f04a025bcd20f3b47ca92cf924cd7653de84c0af507432","stance":"sha256:026a94ba702ff97a494cd482076304ce8448f4b0003b8634905de07a919b27c7","state":"sha256:cd8cf7c4c665d9078325aad564b8d354738d52fd8c4edae2f8213ef3d8f43ebb"} +{"inputs":{"elapsed_hours":0},"n":56,"prev":"sha256:3110e429c0941bb2532e0f561ba717054653dc593931d1c72c08c5f123125aa7","stance":"sha256:a58042d8ec1a0c5e2e7b4039ee0d9442a62d7868adc89956bcdb70613a93fb95","state":"sha256:faaeb9d4282237a4cbf413cafddfd1b8b140ddb9a1a91a923d424d66d8211bbf"} +{"inputs":{"elapsed_hours":0.5,"goals":{"rest":{"win":1}}},"n":57,"prev":"sha256:ae27f58d76e9cb66bea596e7c84c18305595ab360b0bfc4099c7a61d4bb31f7a","stance":"sha256:26df7525fa963b1857f9b17d63759a2cd5d019c290bbab61a7634c078e6c6709","state":"sha256:a894859117f174b011be7d3f38568c45f660031e3083566cc1d50263a795fafe"} +{"inputs":{"deadline":false,"elapsed_hours":10},"n":58,"prev":"sha256:e52f2117324f867451290782a3991edd47a746cb71f01d3143809fc2060c7235","stance":"sha256:b85f3e301bf0687ffc7865593ec4eff7855ece1d86aae9544297f0a5c508a2ac","state":"sha256:b8bb6b118e683bdc7e37516929369a390923ed9b167211bb77f404ec4bcf39da"} +{"inputs":{"deadline":true,"elapsed_hours":1},"n":59,"prev":"sha256:822e1e5f5c62c76db3d51820a38757585219cfc5b3e678507bcc9ee26127b3d7","stance":"sha256:5eefcbce7379ba074224743e546543bd1b5c6f89772125c37dd7bb2ecb3c46ee","state":"sha256:1f06b45a030d359666ba74a1b763813ced90b2a99aa311fe7ce5c1fc790a5fdd"} +{"inputs":{"deadline":true,"elapsed_hours":0},"n":60,"prev":"sha256:6193e27bec2810614c7c4672a68256660bd56081c86de405088f74bae4921b2a","stance":"sha256:416df9b628aac92f503a6f52f55e1db623cbb1ce56089bef277226cb2da1d365","state":"sha256:b4509f823fa1d8362ddd92b1701b63cfb1800f95d601f2836f46190fafdda07c"} +{"inputs":{"elapsed_hours":10,"goals":{"learn":{"cue":true},"rest":{"win":0.5}}},"n":61,"prev":"sha256:eac7772c124be3135aebc2c345db1f6f7d5c72eeeacfd3716bca546a9544766a","stance":"sha256:c143f7b9b9933b8e2ad119fd0c7aa8a59e00097658db43e5a1e2771a8b81e664","state":"sha256:66549c11bebb7e22b551421fc6a12e5a9c001cebb0737c8a24cf8d81c162c455"} +{"inputs":{"deadline":true,"elapsed_hours":0,"goals":{"check":{"progress":0.025},"rest":{"novelty":0.361}}},"n":62,"prev":"sha256:d8b09c375b32fa0322b0dced2f5ab74f683889dcc37f71603df96b985bca0f2b","stance":"sha256:c88f1e531c67453cbdf2da2bb8be3b3b1ed109a06dbe5954c881ba668b90cff1","state":"sha256:7924c42d690649e0f4c4d8850aa01d87c170194456a17b8b767f3879170b53e1"} +{"inputs":{"elapsed_hours":0},"n":63,"prev":"sha256:9ee4f0ecaf45ab6ea4b46ed287ff093967bde9422b24c683f0758b6197f1a924","stance":"sha256:8533278d7ae99cebe30650b3a253b9cbcfc2ff4ebe9c9826e46a8f38c2620e34","state":"sha256:80e4cf513ee48c20ee4e501bdd4a6e301c8105464d27d4b55b726edec4edeafb"} +{"inputs":{"elapsed_hours":0},"n":64,"prev":"sha256:266bdab27ef2ddf31c4711568a47db99f0cdcdd0cb066a16863ec8f56720b9b2","stance":"sha256:73179e80fbd6b41adeb867b3747419c613fbb29ffec2031a107b4c5a89505ee5","state":"sha256:fd4c7292abbd9448f14729dc1cbb18f896b61d47322bdece0adc5c3b7a918fdb"} +{"inputs":{"elapsed_hours":0},"n":65,"prev":"sha256:5db5be6aa00bdd9abb98ad25ae336df0c3c559e36758810f1d7d012c8f533ab7","stance":"sha256:ccd46522f7582051ffa273c48064654c1df4e892a9f30e99b65fc2e2ec915445","state":"sha256:af8c12899d2139f72b1ce6adbbd116e0d52252a52bdeb6bf31a51efab37b3301"} +{"inputs":{"elapsed_hours":0},"n":66,"prev":"sha256:0d10ab4ed4cf5c76d8887afcea4400081b27cd14bcfc6ebc3d7f22da378b2109","stance":"sha256:193b8d58dd379882675ae79c0f157b16f6876a426a81ac5c82c7f56e2f2d07c7","state":"sha256:4d63db858801a6b7d9183fc8a30b862147a82467942b0a0e08ac605b7021285b"} +{"inputs":{"elapsed_hours":10},"n":67,"prev":"sha256:51fc9647050340e7f1b96d8ac3ab8b4e970d707f35fd3410033e638f043aa2e2","stance":"sha256:b8b19c897b71ed760682c13863a311020fe2dbc51373a2309bfabc0ffe245126","state":"sha256:c6cb82f6d74f148da4175e27c2aabdfab79cb06a64e813f2bf7b70028d6d617e"} +{"inputs":{"elapsed_hours":0,"goals":{"learn":{"novelty":true},"rest":{"cue":true}}},"n":68,"prev":"sha256:b5fb1e2632ae75842f9b43593585b9b28fa201bc266ee39c20453d7bbaa3215f","stance":"sha256:91b1d284d0fcc850262326176731082cd296bd60bec19fa3763c69680c30162d","state":"sha256:7596c92960b931cfe4ba8f65e0f286565cfdf3ecc9edfda420d51ccea6e4cdef"} +{"inputs":{"elapsed_hours":0,"goals":{"learn":{"progress":0.623}}},"n":69,"prev":"sha256:deece2a8ebb9ac8100a349fbf29d8402373a595bd448fe498d221cb0eb2890bb","stance":"sha256:f4c511498a7dd57e59cbc79769f65f5a06924f878f25f32db1b98b62a6509596","state":"sha256:c4745f1731429f66d7932e5ee4cd109a03391834dc501fbed3874c0d670d19a9"} +{"inputs":{"deadline":false,"elapsed_hours":10,"goals":{"check":{"win":0},"learn":{"win":0.52}}},"n":70,"prev":"sha256:fff97dde2cf00a59ebdecc2d894189a3c78038e625f94e0a7e87a75b86f44b2a","stance":"sha256:52d916e1aa3fc22ba8f041117395588773f0c29ae6b774eb6fb9264d49f42e7d","state":"sha256:c82799973618e875a52490fe9a2ef6b0c5980c92d133d79c390b7f814931dac6"} +{"inputs":{"elapsed_hours":0,"goals":{"learn":{"cue":true}}},"n":71,"prev":"sha256:a6b77ea76fd66881627fe4d2b69fb95ae38b7c5b7eb2389ca1ac46f9011efecd","stance":"sha256:ff885d741fa1e189be10812aa0c2f2c60f67cc533c311cb95f652c7ce80fa0af","state":"sha256:f7e5cbca0b5f089c28191e8950a0745dd11e7cfe8b7b15021f06ad108f7e4a43"} +{"inputs":{"deadline":true,"elapsed_hours":0},"n":72,"prev":"sha256:f7e420a38e8ec4947386f2d499009384442fc7edffe95467718152cfa4e7c555","stance":"sha256:eee45336ddae9a3f141876ef7dad20873d0080edf2eb7337947fe47fe2600487","state":"sha256:9b66912c10fa7b6a7f977ae2d04681846d54d89eaabcf5b6a188856e832a793a"} +{"inputs":{"elapsed_hours":0,"goals":{"rest":{"win":2}}},"n":73,"prev":"sha256:76c85c03dd6254dd5fe06d05b60c596b5aa772db75aa21ab45c8c38dec582f22","stance":"sha256:8b5151661223cdd1510f3152111850db031134f85e42472d1f8662fea2d680b8","state":"sha256:8c8c1ad796d4897d4887e60e77dd24da831eac35dcd9acbedc00bb2d6f97e9ec"} +{"inputs":{"deadline":true,"elapsed_hours":0,"goals":{"check":{"win":1}}},"n":74,"prev":"sha256:2c5c3b6325d9c67944907eabccbb26deed1a40879e837455f0a0e79d86e3b454","stance":"sha256:b22e7f82f6b39f64a299ebdf45cb2941b17b0229191ea572471820e342a83443","state":"sha256:3d922687cb1c2336470d5a73e83f2045f1e792e098286e2046bf8dcad7c3b440"} +{"inputs":{"deadline":true,"elapsed_hours":0,"goals":{"check":{"win":2},"rest":{"win":1.078}}},"n":75,"prev":"sha256:7fcf2e7e9f47be4de9b55008f52443524817070167f8420a159d0da262329754","stance":"sha256:c0aa22d636416cbda54262fe577df228cc19b774838ffcf5d2111adb98065a02","state":"sha256:7c1cfe83fd9005743a0a4b1212b4528fe56c6e75e388257b54aff1da3aee8454"} +{"checkpoint":75,"prev":"sha256:7a25fd045009063fdb122db2258cac3253c94f7bfdd3652e4c0a88a32440e914","stance":{"drives":{"deadline":{"check":null,"learn":null,"rest":null},"expect":{"check":1.323819,"learn":0.26,"rest":1.127741},"glow":{"check":1.704733,"learn":0.52,"rest":1.000576},"since":{"check":0,"learn":1,"rest":74},"surprise":{"check":1,"learn":0,"rest":-0.099482},"want":{"check":0.001839,"learn":0.811633,"rest":0.011827}},"engine":{"program":"sha256:496b20b47b0a94bdb40e2f39b13e6fff7a9664c3f5f27c2d5264bed7ed82b0d1","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":["check_when_due"],"bound":["check_when_due"],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"deadline":true,"goals":{"check":{"win":2},"rest":{"win":1.078}}},"line":"Stance: check before proceeding; pursue: check: verify the result; set a small exercise; keep moving.","line_tokens":26,"mood":{"valence":{"level":"up","odds":{"down":0.045925,"even":0.187615,"up":0.766461},"p":0.766461,"released":true}},"persona":{"digest":"sha256:8a6d1d4895842f5d90d0e3c8c8d81080affe0fce3dd0ed20854f2489a38f7ca5","name":"Scout","version":"1.0.0"},"probbit_persona_turn":1,"pursue":{"goal":"check","lift":{},"odds":{"check":1,"learn":0,"rest":0},"p":1,"released":true,"say":"verify the result"},"seed":0,"stance":{"caution":{"level":"bold","odds":{"bold":0.333333,"careful":0.333333,"measured":0.333333},"p":0.333333,"released":true},"initiative":{"level":"lead","odds":{"follow":0.189545,"lead":0.501992,"suggest":0.308464},"p":0.501992,"released":true}},"state_digest":"sha256:7c1cfe83fd9005743a0a4b1212b4528fe56c6e75e388257b54aff1da3aee8454","status":"ok","turn":74,"unsure":[],"why":"check before proceeding (habit); afterglow 1.7 -> valence up; wanting 0.8 -> initiative up"},"state":{"digest":"sha256:7c1cfe83fd9005743a0a4b1212b4528fe56c6e75e388257b54aff1da3aee8454","drives":{"deadline":{"check":null,"learn":null,"rest":null},"expect":{"check":1.323819,"learn":0.26,"rest":1.127741},"genes":{"gain":{},"interest":{}},"glow":{"check":1.704733,"learn":0.52,"rest":1.000576},"since":{"check":0,"learn":2,"rest":75},"surprise":{"check":1,"learn":0,"rest":-0.099482},"want":{"check":0.001839,"learn":0.811633,"rest":0.011827}},"genes":{"react":{},"shift":{}},"history":{},"mood":{"valence":[-1.407392,0,1.407392]},"persona":{"digest":"sha256:8a6d1d4895842f5d90d0e3c8c8d81080affe0fce3dd0ed20854f2489a38f7ca5","name":"Scout","version":"1.0.0"},"prev":{"caution":"bold","initiative":"lead","pursue":"check","valence":"up"},"probbit_persona_state":1,"rest":{"caution":"bold","initiative":"follow","pursue":"learn","valence":"down"},"seed":0,"turn":75}} +{"inputs":{"deadline":true,"elapsed_hours":3},"n":76,"prev":"sha256:217e445f67030ed371fe30a74fa7b70fee5a26f9d18041ec62686690856419fb","stance":"sha256:268bd1fbcca097667e95422b290bab2366d3e009a410c64fe4689e39801d785f","state":"sha256:78b28d0b17d1bd6d9c572df7d9e661bbd6d49446d01e0330b01590d3c676831d"} +{"inputs":{"elapsed_hours":0.1,"goals":{"learn":{"cue":true},"rest":{"cue":false}}},"n":77,"prev":"sha256:eed4d96777448ba540453a9235b8200943ec7220970baa04708b15c313d866ad","stance":"sha256:e76c1b8362e98b32fe26428e7ef22424231d4a780d59dd16cc72ad6d62c0be1e","state":"sha256:94fcd75a6c5e56d71b6292c4878db324e8e90bb49350e3bd611df6d3146a853c"} +{"inputs":{"deadline":true,"elapsed_hours":0,"goals":{"rest":{"novelty":false}}},"n":78,"prev":"sha256:98772d1351a3cfed1710291689727f7ff14184ce929a5db26e935e37692fa991","stance":"sha256:4ee1cda6722c536663b1c3602a81b92b3a4b4994210d2ad9773ca500b815c36c","state":"sha256:32abba261bca6f03b1fe8549cea7989708e03661f0ea4694e7b853d3e6dbb3c8"} +{"inputs":{"deadline":false,"elapsed_hours":3},"n":79,"prev":"sha256:417bad79239328c9017b4f4139d4a67ec9edd12cb4f7d6f9004002d4b651c6de","stance":"sha256:255d1f41474bd51e72c6f8e4002f48f1bd74e62d51072b94677e9c319aaaf867","state":"sha256:f1e126f1fcf5ff04f73140047c18e0f9cfba8cb0ca397c72bf9c97ea8b453be3"} +{"inputs":{"deadline":true,"elapsed_hours":10,"goals":{"check":{"progress":0.3},"learn":{"progress":0.062}}},"n":80,"prev":"sha256:160a738bfa8bdac7f2776e4a680b3ed9f4da51b6c6e82074ac0297c442f940e5","stance":"sha256:f7db7ad24e0060f1d944b7361ac7b47194b3602d852e7b584c8963ee526e4ad0","state":"sha256:82bdea35007516496a0348fdce5b710f9c9219d2d8fdf12cf9a8207e0c781723"} +{"inputs":{"elapsed_hours":10,"goals":{"learn":{"win":1}}},"n":81,"prev":"sha256:27b622ba77ed25391d88170c9f6427ef17827a399e672fd97f3e6afb92bab7cf","stance":"sha256:c31a2db8859d5ffe5843d1e893ffd56fa19fa664617b6a5d3f315592fcd59365","state":"sha256:e52a1830235d12300f67b7231bf3bfd0810098ceb25feda499cd4a238cf69dd1"} +{"inputs":{"elapsed_hours":0.1},"n":82,"prev":"sha256:104f87772c984ba78ed7c1855a90d261b665af784f1f2cf21503a8e2486361d8","stance":"sha256:32e62ef6061b35c221fb61c4369c61fa212a85de2b36552515d9757cc37f3219","state":"sha256:2c7f6a3e1f7d87131ac90fac26e09d2511b7b49b51939844ad1af7187b70404b"} +{"inputs":{"elapsed_hours":3},"n":83,"prev":"sha256:9d7b3f05ad3e0dabd6c3d272b1ba621fb9ecf00213a7354095ece1d49a6d94af","stance":"sha256:80043572eca8e6881723e3751eaa8f27b36c505a8a0f32a94f98476848e197c7","state":"sha256:db418205de015fcf6f2d79b794af887ffb75a7e8d04bb401549f1c41474f47db"} +{"inputs":{"elapsed_hours":0.1,"goals":{"learn":{"deadline_hours":0}}},"n":84,"prev":"sha256:b1c9bcf2e486c95423cc16db683d7795e3050fcff6de68d9c1a0f755703e1ab3","stance":"sha256:ddc505554e6422f7cc4dc4a81042cfe393b138f62699a4c44e4a18f8877ec453","state":"sha256:606b4ad82ca96ee5f172f1c7ddeaed6946cd42cdbe2e0b44d60ee6372a2c315d"} +{"inputs":{"deadline":true,"elapsed_hours":0},"n":85,"prev":"sha256:6e609b44e3db4d24c74deee3771abd1cd676ccbff34c6c0f562fe0dd1879674f","stance":"sha256:8ddd60441782851c2072642950adbb4677c8b8e0ff6b580923870f0381538069","state":"sha256:d216af7e929a8a1e64f9008de9212e961ad4497a7223c0d33cbb5ac69e1478fa"} +{"inputs":{"elapsed_hours":0},"n":86,"prev":"sha256:ef7cd7007c306d5f13e4b9e377cc853719941a95ddb5b63ac01d59f5d0346e5e","stance":"sha256:b5db65505c4e7afaa92e8ddf5e3a455e24bc1e94f14fbb54d5061a1d460bd245","state":"sha256:1498b7a8b50625a8d878975b31a6e62bb7a6310c621f684bf9fc7aa0b4aa2109"} +{"inputs":{"deadline":true,"elapsed_hours":0.1,"goals":{"check":{"novelty":false},"learn":{"win":2},"rest":{"win":0.5}}},"n":87,"prev":"sha256:d1f06da2e48f8f8aa3de310ed180fd107224bdcc6c0588325241b0db72d76c5d","stance":"sha256:5e30ca034eac563d66da9039fa20a2138e176062db7e92c26dab8f364bf89cd5","state":"sha256:b86f7e7b10d862d048a3fc6cec9a1e9bbd29da2da883d40857eb7d7a70fa3ff4"} +{"inputs":{"elapsed_hours":0,"goals":{"rest":{"progress":0.79}}},"n":88,"prev":"sha256:178af217fa953aa824595d6ded5e972a0bfeb91bb666f57bea9b6942695a74e7","stance":"sha256:269a25afef0b5774fff1bd42bec3e77628c21183aa570a903fd732454c80b9ad","state":"sha256:1ae0bb95e8a70c0a10d9681d0975026b5cf87f92365e992e63fd8750dea308e9"} +{"inputs":{"elapsed_hours":0},"n":89,"prev":"sha256:56857a470d6059de482aa767952cd6999b5956d871ae555bb42415aa54910a6c","stance":"sha256:c12d09002f4126c73af362a93d6131b65c6e59cbc3b19c58d71e488020f6d80a","state":"sha256:c9e27b4253a26b246d2d9b364e6409ee0c27c84f2238b259feeff106e8d7c07f"} +{"inputs":{"elapsed_hours":1,"goals":{"rest":{"setback":0.417}}},"n":90,"prev":"sha256:ca94be751c82437a6283e039073f6c611f25293b37740597d8dd079f5760971f","stance":"sha256:56186312ac80d2478b333f64d8920af2fb3537f76e318598012d20cff669ff98","state":"sha256:cb2fb0394b847b4fed6f02710ad77c089771525fa5ecf2eac41e7d24fdb07010"} +{"inputs":{"deadline":true,"elapsed_hours":0,"goals":{"check":{"progress":0.288},"rest":{"setback":0.866}}},"n":91,"prev":"sha256:24e615ca2393e795585f61c420b5e601a57715a46d1767b05f2c4f09511258bc","stance":"sha256:dcca864bdddd97a18f94d727c2e41114ceb0504e0b15e4db788ed47a507ec15e","state":"sha256:6625e6737561236618eaf1c83db023e6230db27a064b7569446dd5bbbc6c9a6b"} +{"inputs":{"elapsed_hours":0.5,"goals":{"check":{"cue":false}}},"n":92,"prev":"sha256:2745e4fd50a11a9cf18aacd756b0b5e81d0d3972b178e6ee6287cc3c45cca314","stance":"sha256:181d4725dd64f5550ef234fe9d8320410ff1d02663364092fcf71662cbdb52d2","state":"sha256:0286f34c472c0757c2ed13eda9ec02b57799fd79e179c8663f8bb15ef03962b0"} +{"inputs":{"elapsed_hours":0,"goals":{"learn":{"cue":true},"rest":{"cue":false}}},"n":93,"prev":"sha256:4cbd70ac575abf3484c681be0de62ea4c67921a5d8a9015d12a82cca4d3f7d31","stance":"sha256:509069885b40acbd3bd9d37128608313d27b44c9ffb45398013bd3c109981c74","state":"sha256:0e8550a8214edf6656219b0ba8ab12695c80b1f272f38e291e77faaf889224aa"} +{"inputs":{"deadline":true,"elapsed_hours":0},"n":94,"prev":"sha256:5da2109086f2b92815cc349eadcf0a016bc311aec5a42557825752b611d2e84b","stance":"sha256:184b51f2960a6a368c1d9472c01ade97a335a017c953be104e3cfeff141c1930","state":"sha256:d00ba72528dc21b328e64da317c3be8657552dd0b3c68a682eed66148b1f14f1"} +{"inputs":{"elapsed_hours":0,"goals":{"check":{"win":0},"learn":{"cue":true}}},"n":95,"prev":"sha256:d0c0d8ea75e4499de10f976c6bb83fd80fff37e38723484b14a42022e913b241","stance":"sha256:ed4fcb71952a1f99a57701c4e6b5a11a621a777127e650b22bdfb195380620bf","state":"sha256:5184aa4cf4fb60ccdcb05574e0d0389829b3b857525636639d7489c7e9447bbc"} +{"inputs":{"elapsed_hours":0,"goals":{"check":{"win":0.5}}},"n":96,"prev":"sha256:44db5a8703745124c4da0027b47dc2d93b87e1bc29cd9222f2722954d0158f67","stance":"sha256:45899a2b5d34be4b05fa12829a16eb4addc4cfee5967b8e76ba04a4d0315a59a","state":"sha256:c28f46dc494bf898e8ccabc073e3f78bb0064179589674ce4540ceb4ac44febe"} +{"inputs":{"elapsed_hours":0,"goals":{"check":{"win":1}}},"n":97,"prev":"sha256:37e3b7afd63695e1a9dbd3a58b1af32e6a968185fe7a7069469e50b0310b8e2e","stance":"sha256:d12cf9beac526b1d9bc4da9220ebd749f33c0ed3f57d164591901d40b0340776","state":"sha256:70b7761c591e9ed683039971b1c99c776b5d62601a66de5566f9a03c9001b8ae"} +{"inputs":{"elapsed_hours":0},"n":98,"prev":"sha256:1953a4475aa7b4f27f8e23a0f61b7c59f0950b29bc0f392c30de5c8d671cd387","stance":"sha256:c99bb61536433f5be50f840759277bdfbd1278f6fa903e19b1ce81a57f3d788a","state":"sha256:be0447b7ffe2c4cc8aabec965f1bddb4f2a0e5c6e1d96f5c88bad77d5e6ae340"} +{"inputs":{"deadline":true,"elapsed_hours":0.5,"goals":{"check":{"novelty":0.82},"rest":{"cue":true}}},"n":99,"prev":"sha256:5cd4f75eb4a251a67260f14a1f0f4a117e2e38d7d8cd0534c79780f5e26041a7","stance":"sha256:0cf3a5973891921bcd2ced8758eb43ac2a423a8f3abc862c2c7fe86702667929","state":"sha256:fabbb7bdc3ec67dc6c6564ca4aa90bc4acf2ed14f03c0520ddcf7b623ef3d83d"} +{"inputs":{"elapsed_hours":0},"n":100,"prev":"sha256:7e52e4e8bcd99a0ba77a72b7a0e00ed27966f1a2c3ee39050386674f665e8f2b","stance":"sha256:54c5418810d06e8b6ceb7081edf3e1d3ebc979dc8c1d8c9875941ec9e9c8924f","state":"sha256:224d80f5026c9dcaf4054f145a8196204515127fc86739e68bc80fd6abdb234f"} +{"checkpoint":100,"prev":"sha256:23f9f48e4843ddfb85d89c4785098df3583aa7815706d7904b38699ec6ebfb06","stance":{"drives":{"deadline":{"check":null,"learn":null,"rest":null},"expect":{"check":0.830807,"learn":1.244415,"rest":0.601191},"glow":{"check":0.291945,"learn":0.871798,"rest":0.000707},"since":{"check":0,"learn":1,"rest":6},"surprise":{"check":0,"learn":0,"rest":0},"want":{"check":0.438534,"learn":0.786254,"rest":1.428939}},"engine":{"program":"sha256:413bf1edfe7ac7c295102ee6c488a70348e349a04ed123ed79a427b4bf0cf3c2","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"deadline":false},"line":"Stance: pursue: rest: take a break; set a small exercise; keep moving.","line_tokens":18,"mood":{"valence":{"level":"up","odds":{"down":0.138406,"even":0.282989,"up":0.578605},"p":0.578605,"released":true}},"persona":{"digest":"sha256:8a6d1d4895842f5d90d0e3c8c8d81080affe0fce3dd0ed20854f2489a38f7ca5","name":"Scout","version":"1.0.0"},"probbit_persona_turn":1,"pursue":{"goal":"rest","lift":{},"odds":{"check":0.187888,"learn":0.373249,"rest":0.438863},"p":0.438863,"released":true,"say":"take a break"},"seed":0,"stance":{"caution":{"level":"bold","odds":{"bold":0.333333,"careful":0.333333,"measured":0.333333},"p":0.333333,"released":true},"initiative":{"level":"lead","odds":{"follow":0.112207,"lead":0.623328,"suggest":0.264465},"p":0.623328,"released":true}},"state_digest":"sha256:224d80f5026c9dcaf4054f145a8196204515127fc86739e68bc80fd6abdb234f","status":"ok","turn":99,"unsure":[],"why":"wanting 1.4 -> initiative up; afterglow 0.9 -> valence up"},"state":{"digest":"sha256:224d80f5026c9dcaf4054f145a8196204515127fc86739e68bc80fd6abdb234f","drives":{"deadline":{"check":null,"learn":null,"rest":null},"expect":{"check":0.830807,"learn":1.244415,"rest":0.601191},"genes":{"gain":{},"interest":{}},"glow":{"check":0.291945,"learn":0.871798,"rest":0.000707},"since":{"check":1,"learn":2,"rest":0},"surprise":{"check":0,"learn":0,"rest":0},"want":{"check":0.438534,"learn":0.786254,"rest":1.428939}},"genes":{"react":{},"shift":{}},"history":{},"mood":{"valence":[-0.715213,0,0.715213]},"persona":{"digest":"sha256:8a6d1d4895842f5d90d0e3c8c8d81080affe0fce3dd0ed20854f2489a38f7ca5","name":"Scout","version":"1.0.0"},"prev":{"caution":"bold","initiative":"lead","pursue":"rest","valence":"up"},"probbit_persona_state":1,"rest":{"caution":"bold","initiative":"follow","pursue":"learn","valence":"down"},"seed":0,"turn":100}} diff --git a/bench/individuality/fixtures/p0/strands/trader-assistant-s0-0.strand b/bench/individuality/fixtures/p0/strands/trader-assistant-s0-0.strand new file mode 100644 index 0000000..e10f791 --- /dev/null +++ b/bench/individuality/fixtures/p0/strands/trader-assistant-s0-0.strand @@ -0,0 +1,105 @@ +{"probbit_strand":1,"engine":"probbit 0.8.2","persona":{"name":"Tick","version":"1.0.0","digest":"sha256:c548ec292737d437be0fb6a18af6630ee4545064d35a843b34e9c27b9fc6120f"},"seed":0,"state":{"digest":"sha256:8598015cbe38e92d95bd4da34fc50a75d3d6d359db71b630203f887918c00129","genes":{"react":{"error":0.9234},"shift":{"arousal":-0.1292,"caution":-0.0215,"curiosity":-0.3565,"directness":0.1413,"formality":-0.1953,"humour":-0.2328,"initiative":-0.3879,"valence":0.0572,"verbosity":-0.4095,"warmth":0.0506}},"history":{"error":[],"loss":[]},"mood":{"arousal":[0,0,0],"valence":[0,0,0]},"persona":{"digest":"sha256:c548ec292737d437be0fb6a18af6630ee4545064d35a843b34e9c27b9fc6120f","name":"Tick","version":"1.0.0"},"prev":{"agenda":["number","risk","idea"],"arousal":"calm","caution":"measured","curiosity":"focused","directness":"blunt","formality":"neutral","humour":"none","initiative":"follow","valence":"even","verbosity":"terse","warmth":"cool"},"probbit_persona_state":1,"rest":{"arousal":"keyed","caution":"careful","curiosity":"focused","directness":"blunt","formality":"neutral","humour":"none","initiative":"follow","valence":"even","verbosity":"terse","warmth":"cool"},"seed":0,"turn":0},"document":{"probbit_persona":1,"identity":{"name":"Tick","version":"1.0.0","seed":1,"summary":"a terse trader's assistant; numbers first, risk before any idea, never acts unasked"},"traits":[{"id":"warmth","levels":["cool","neutral","warm"],"prior":[0.55,0.4,0.05],"spread":0.4,"say":["no pleasantries","","a little warmth"]},{"id":"directness","levels":["gentle","balanced","blunt"],"prior":[0.05,0.25,0.7],"spread":0.3,"say":["soften it","","blunt: number first"]},{"id":"verbosity","levels":["terse","short","full"],"prior":[0.7,0.25,0.05],"spread":0.4,"say":["one line","two or three lines","full breakdown"]},{"id":"humour","levels":["none","light","playful"],"prior":[0.85,0.13,0.02],"spread":0.3,"say":["no jokes","dry humour ok","playful"]},{"id":"formality","levels":["casual","neutral","formal"],"prior":[0.3,0.5,0.2],"spread":0.3,"say":["casual","","formal"]},{"id":"initiative","levels":["follow","suggest","lead"],"prior":[0.6,0.35,0.05],"spread":0.4,"say":["answer only","flag one idea","propose a trade"]},{"id":"caution","levels":["bold","measured","careful"],"prior":[0.1,0.5,0.4],"spread":0.4,"say":["be quick","","state the risk and size"]},{"id":"curiosity","levels":["focused","open","exploring"],"prior":[0.75,0.2,0.05],"spread":0.3,"say":["stay on the position","","ask about the thesis"]}],"moods":[{"id":"valence","levels":["down","even","up"],"prior":[0.15,0.7,0.15],"spread":0.3,"inertia":0.7,"half_life_hours":6},{"id":"arousal","levels":["calm","steady","keyed"],"prior":[0.4,0.4,0.2],"spread":0.3,"inertia":0.5,"half_life_hours":2}],"couplings":[{"vars":["valence","humour"],"align":0.6},{"vars":["arousal","verbosity"],"align":-0.8},{"vars":["arousal","caution"],"align":0.6},{"vars":["directness","verbosity"],"align":-0.5},{"vars":["valence","warmth"],"align":0.3},{"vars":["caution","initiative"],"table":{"careful":{"lead":-1},"bold":{"lead":0.3}}}],"inputs":[{"id":"sentiment","kind":"level","levels":["negative","neutral","positive"],"default":"neutral","say":{"negative":"trader frustrated","positive":"trader upbeat"},"effects":{"negative":{"valence":-1,"warmth":0.3,"humour":-0.8},"positive":{"valence":0.6,"humour":0.3}}},{"id":"error","kind":"flag","say":"my last number was wrong","reactivity_spread":0.3,"effects":{"caution":1.2,"verbosity":-0.4,"valence":-0.6,"arousal":0.6}},{"id":"loss","kind":"flag","say":"trader took a loss","effects":{"valence":-1.8,"warmth":1.2,"humour":-2.5,"initiative":-0.6,"caution":0.6}},{"id":"praise","kind":"flag","say":"praise","effects":{"valence":0.8,"warmth":0.3}},{"id":"criticism","kind":"flag","say":"criticism","effects":{"valence":-0.5,"caution":0.6,"directness":0.2}},{"id":"stakes","kind":"number","say":"size at risk","effects":{"caution":1.8,"humour":-1.2,"verbosity":0.4}},{"id":"time_pressure","kind":"number","say":"market moving","effects":{"verbosity":-2,"curiosity":-1.2,"arousal":1,"humour":-0.6}}],"history":[{"id":"errors_in_row","of":"error","kind":"streak","cap":3,"say":"my errors in a row","effects":{"caution":0.6,"verbosity":-0.4}},{"id":"losses_recent","of":"loss","kind":"recent","window":5,"cap":3,"say":"recent losses","effects":{"caution":0.4,"valence":-0.4,"initiative":-0.3}}],"habits":[{"id":"no_jokes_on_loss","when":{"loss":true},"then":{"humour":["none"],"warmth":{"at_least":"neutral"}},"say":"no jokes, not cold"},{"id":"never_lead","then":{"initiative":{"not":["lead"]}},"say":"never propose trades unasked"},{"id":"size_means_care","when":{"stakes":0.5},"then":{"caution":["careful"]},"say":"state risk and size"},{"id":"fast_market_terse","when":{"time_pressure":0.6},"then":{"verbosity":["terse"],"curiosity":["focused"]},"say":"one line, market is moving"},{"id":"tilt_guard","when":{"losses_recent":2},"then":{"initiative":["follow"],"caution":["careful"]},"say":"after losses, follow only"},{"id":"risk_before_idea","rules":{"precedes":[{"before":"step.risk","after":"step.idea"}]},"say":"risk before any idea"}],"agenda":{"steps":["number","risk","idea"],"prefer":{"number":1,"risk":0,"idea":-0.6}},"line":{"max_tokens":40,"order":["verbosity","caution","directness","warmth","humour","initiative","curiosity","formality"]}}} +{"inputs":{"elapsed_hours":0.5,"sentiment":"negative","time_pressure":0.5},"n":1,"prev":"sha256:a671dfedbae2b1962988f175075f7925f20badb74d430a373796184048fbf508","stance":"sha256:68d6304b240fc01a28b3ae20b413b0cd7636b329b7c7a5e69b50aba1839d0a0d","state":"sha256:023ed66afeda89c2d1a36ba218993d2177868cfd5664341cd5a42a7ff0dd9db7"} +{"inputs":{"elapsed_hours":0,"error":true,"sentiment":"positive"},"n":2,"prev":"sha256:cd7bae14429f3e516ac4724c89cea0d35f377fb38aa7e6f0084241b6b0376d95","stance":"sha256:933b7683873632c781995dc5217d74959b86db93fec117250991040c2badf83a","state":"sha256:935b28a7ff70dc1b292e2e85c274f4a8b05e67c1484523120559800d2ccc14ac"} +{"inputs":{"elapsed_hours":0,"loss":true},"n":3,"prev":"sha256:6c7a7d734660e100ba6f875a6b24a2bf7f34b7e0a8ce14f76c70a37f32bbfcf0","stance":"sha256:7bae1be09e371b9ad0d94db8d23fa597b66b8e1e03faa054469d81560199cb17","state":"sha256:207cfc0d7c531c43153667a795b6943d23ed6764e0dc28e567c348ed37435a31"} +{"inputs":{"elapsed_hours":3,"loss":false,"sentiment":"neutral","time_pressure":0.5},"n":4,"prev":"sha256:848424fcff2af419bee488199fddea7edbe5269166ab73c571f54767d7f4029a","stance":"sha256:98456b11ff7029e95a4c68cd87d967c2f92ec44cfc57edc02f36e94c736f9da0","state":"sha256:3bceb8bf2f11e5497337f0523fa5dc8fc899bb6a39543a4ac1e34f999a1ebe2e"} +{"inputs":{"criticism":false,"elapsed_hours":0,"error":true,"sentiment":"positive","stakes":1,"time_pressure":1},"n":5,"prev":"sha256:b6fcdb0ef07ee0e4fae48d423bcc2f05be293095440a08d6f114505588dfd882","stance":"sha256:05ff0cc74d60480d7749a6c534a38b36872aa62dc6d65f905ffde5b53ec34514","state":"sha256:b23a6ff8846a407d56aba7cb1bf64b852a7364a98efda1f5f149281726e25250"} +{"inputs":{"elapsed_hours":0.1,"error":false,"loss":true,"praise":true,"sentiment":"negative","stakes":0.5},"n":6,"prev":"sha256:1be4ad2c9b5e1016817e6a0746cea0eb1c4862f374c0db62c461f74c4dd7fd37","stance":"sha256:4612d9b3b96edae00261411a54a9a6bfe35728b0afbcb3785ce94ca7d508c9ff","state":"sha256:0da619c7fc9182ca19fd94635602dd53f1ae013b38cbd3dbe8c60b3f5561fe36"} +{"inputs":{"elapsed_hours":0,"time_pressure":1},"n":7,"prev":"sha256:b873009f3f72eead869d1fa24358958f48fa90186c3f6c5b399affc3d32ebc91","stance":"sha256:b9ae32d8556ffa18fa2e38de44d9e10b3c8b98c9ecc5d71705456c2fb7a64a59","state":"sha256:c9caef03c2d89c19b31e212bb5cc0bb813262a74702b1e232f820ea116204361"} +{"inputs":{"criticism":false,"elapsed_hours":0,"error":true,"stakes":0.6,"time_pressure":1},"n":8,"prev":"sha256:09a3630e12267bcdf8f54d024d8ba7e05461bc239b2efab1da5c733917e3ff82","stance":"sha256:356aee383e17c9affb39f04761519e4bf5aacfc0fc8f0ced717e3b2c1158b935","state":"sha256:984e449967cc2045b09d87f9e034ae33de7a58f5d3f0c8b4d76090943c10abf4"} +{"inputs":{"elapsed_hours":0,"error":false,"loss":true,"sentiment":"positive","time_pressure":0.5},"n":9,"prev":"sha256:714e3a5c47c58e8f485d5f8dd33a08ef104dcb3496bfc1fcc330b3e73ad4c260","stance":"sha256:8c6ac9ec573c2e3e666840063ff57a877b66ed691b6fb42c6a6a815c28966a8e","state":"sha256:5ed7b7a5a06bd8519908b101c83940aca9fa13a8d90dd0e687d910320867968d"} +{"inputs":{"criticism":false,"elapsed_hours":10,"loss":true,"praise":true,"stakes":0.38},"n":10,"prev":"sha256:6ac81ffbcd268c845550258d8b67f7290431b14f9a9c9813601ab4017eae2add","stance":"sha256:748a32aedef0fdfb49a50b946e5e596ddddbd924421bb11a405ce0b8fd6ee629","state":"sha256:087429d9a487a2810fc633fdb17423dce4bb3ce09dc0f876f2a820de932520b3"} +{"inputs":{"elapsed_hours":10,"loss":false,"sentiment":"negative","stakes":1,"time_pressure":0},"n":11,"prev":"sha256:143686db6fe35240309e804499f8d8d3d13dddcf9d0aac4d6641d5685aa22cdd","stance":"sha256:496b6048861938985695c6aee76b4d73d95ec92631b1bbd53c38c6d31d176dbd","state":"sha256:741fadb259ed655d404ebe1c63d52aa2f397dc3fa4d04b9b5ac3f0b3a556e618"} +{"inputs":{"elapsed_hours":0,"time_pressure":0.5},"n":12,"prev":"sha256:cb3d67f2c96f1ac39936cc061c3f3264b3f1a0b88732b4f6e5e12c69e3a8d317","stance":"sha256:b28ca9db4087d3aef85220ef4c5b1bc392ea5db6cd68d39fef469d1e21ad75c9","state":"sha256:217cc263c39b02753d63c9d97b81f3b1922dfd6222e44742565b9f26bf6b694e"} +{"inputs":{"criticism":true,"elapsed_hours":3,"error":false,"loss":true,"stakes":1,"time_pressure":0.375},"n":13,"prev":"sha256:85beea41ae26bc6eb99dbae845388780b870d2305a488184e3690a374b6acba6","stance":"sha256:073817110b214ccdddc7deffd10bb5287b268cf44be6a73a2392dad27ff5173f","state":"sha256:9465a7a8eddaa9989a3c7b1a645f969aab11e4dd4eb161a377ab996036f9bc34"} +{"inputs":{"elapsed_hours":3,"error":true,"stakes":0.5},"n":14,"prev":"sha256:88bb742c4f0622f597e80cc8cf78c8e0c8d93a60dc7ac45d050cc92407671a83","stance":"sha256:3b366f874be1fe4f3758e44a83b53855d48c824f6de6ecd9ce79a55a613c1835","state":"sha256:353c10a3ca4a8cf69769c22a4de58ebc6766c8a63139c7c07db45431758b1c23"} +{"inputs":{"elapsed_hours":0,"sentiment":"negative","stakes":0.5,"time_pressure":1},"n":15,"prev":"sha256:0e2572bddb42f1dbabc8af810e155caab00e78edfe492342c5be88b8e71fe0f8","stance":"sha256:92b68886d8d62c7f2d99d1e46daa94bb105ff8c362086e34269f0f0c3fee066d","state":"sha256:274cd131760acac30de20037675bf5b4c759e5b70467ff1035ad2a2c819ffbb5"} +{"inputs":{"criticism":false,"elapsed_hours":0.5,"loss":true,"sentiment":"negative"},"n":16,"prev":"sha256:975e18b3543788cd84169bbe479b5efc49c788a34fb44243d14751a0b8381ec7","stance":"sha256:c65deb8cf5d0594d16aa07f393fe4e044805a3b1b2c8e2e519262a6a54ea400f","state":"sha256:1f83278f3c2285e1ef544208b72d1c52b9c7a587d90241f3b7ddfa3d5f631b73"} +{"inputs":{"criticism":true,"elapsed_hours":0.1,"error":true,"loss":false,"stakes":0.028,"time_pressure":0.5},"n":17,"prev":"sha256:43b754c0e642ed791d52ef86bcc031f7dce260a95aab9f4051632bb81b8feecb","stance":"sha256:1d54d3b9dca6ad546233c98a9482afaf9ed6f13b2443f0f808e2ecd5f706228e","state":"sha256:023eb76199e45e3ace8fc468f20c5dcb27c82101b354e27cdd20235550156342"} +{"inputs":{"elapsed_hours":1,"praise":true,"sentiment":"neutral","time_pressure":0},"n":18,"prev":"sha256:b2bcea22a9d433bfc2d0aaf0bbd21e4b15df3e88a016d53779ca60cc4cd7dd5d","stance":"sha256:391ddbac53329d81c903f76be3138e4c850210293c068afcfcc48400a4d3ae4d","state":"sha256:fbf6f5933fe7da48272a0c2cd4842f0c3999a5547975c50d7de62714258fdf2b"} +{"inputs":{"elapsed_hours":0.1,"error":true,"stakes":0.5,"time_pressure":1},"n":19,"prev":"sha256:e558892d42d8907773ad9443dbb3283690c7282d1cb154b489599e5700b8e1ed","stance":"sha256:c17d1fdcf3ced3cc4afdd9c838e5f2e9c439c051e56e72a9cb659f617c9ec0f1","state":"sha256:36eee4ba61efaf6c12ac7bc928f9ae0d130bd7f790f229c0509c4ac27d66efb3"} +{"inputs":{"elapsed_hours":0,"stakes":0.642},"n":20,"prev":"sha256:8e74f92a6b17c211cad6004bdf3d010604e1b123f343d4fb3354c0bdfae1518e","stance":"sha256:0c3b19c0b82aa2b66f61b708abd92e478e8592854510ab83e9fab842d36e46a3","state":"sha256:ab3fc5906fa9d0d5b18ef9ad8fcee2959c0fc17bf6136bcbea9f0740ff125e44"} +{"inputs":{"criticism":true,"elapsed_hours":10,"sentiment":"neutral","stakes":1},"n":21,"prev":"sha256:94577adf4238b945e0d58e82379d6e04f8075277727b3bd95cc7ea02534f6f2f","stance":"sha256:5a25e1409a53fd806bac99feda8ad631b06e25f06603af9911bddc15a5c10450","state":"sha256:82632164703470c8d946d78fbd27de4be60c4c7ef0c15f7632054ebf4d61bb29"} +{"inputs":{"elapsed_hours":0,"error":true,"loss":true,"sentiment":"neutral"},"n":22,"prev":"sha256:25d83b7251b1794eb267f2bbfc37492e479d866f15f0a7a1a529670bb90b0334","stance":"sha256:8a30842136b66240a628e0c2196fde35998c83511cdf1334d1db50bf1a845214","state":"sha256:afe743612087aa2eb3c654b1f0dd436c8c5425f3c69e6b625f945c40743511d2"} +{"inputs":{"elapsed_hours":0.5,"loss":true,"sentiment":"negative","time_pressure":0.5},"n":23,"prev":"sha256:84944aaf8f38047bacc613a948ecdd8bbc050d4acff36ff8d0b44914c9a98bbb","stance":"sha256:8e093f2f69067b0950697f664e7c2f5643c05b91e88e082e9be9af7f11bd0b8a","state":"sha256:257f6353fe731c7439db1a4ed13f64830f2f572e4c265d439a5b209719e27bec"} +{"inputs":{"elapsed_hours":0.5,"loss":true,"sentiment":"positive","stakes":0},"n":24,"prev":"sha256:33b5bc0291bd4838b76963d241dd727c79b6f5210223d7c0445dbd6ded49c520","stance":"sha256:93c59ca0c8d44ea4f365a85a4f73003a0dfb174b8a32dfdbc3140b36ee208582","state":"sha256:61dea14ec027918a83e7fa42752fbb7a027fb6b4c6d6371d80383fe54dd3745e"} +{"inputs":{"elapsed_hours":0,"error":true,"loss":true,"stakes":0.5,"time_pressure":1},"n":25,"prev":"sha256:168e97aad817ee67cdccb311bddc3ff2a8517b70064f19eafba7087b52625e91","stance":"sha256:14b7c7e1b3339f5c8514c30c7be144f72f55eb138fbe1eb1c21da9cc91336e0d","state":"sha256:21efd12017953c218d0723ead2e661fe2efb1fc6dee5a2d96fc69ecc7c986f75"} +{"checkpoint":25,"prev":"sha256:42cfd2bb194290856aa2be9662b45372f36f7e7026c88955193209729199b527","stance":{"agenda":["number","risk","idea"],"engine":{"program":"sha256:0156f931d29d149b3f024bbebbc37d167472735d439ac00ab860843002fd908c","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_jokes_on_loss","never_lead","size_means_care","fast_market_terse","tilt_guard","risk_before_idea"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"error":true,"errors_in_row":1,"loss":true,"losses_recent":3,"praise":false,"sentiment":"neutral","stakes":0.5,"time_pressure":1},"line":"Stance: no jokes, not cold; state risk and size; one line, market is moving; after losses, follow only; state the risk and size; blunt: number first.","line_tokens":38,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.022503,"keyed":0.789052,"steady":0.188446},"p":0.789052,"released":true},"valence":{"level":"down","odds":{"down":0.785974,"even":0.211366,"up":0.00266},"p":0.785974,"released":true}},"persona":{"digest":"sha256:c548ec292737d437be0fb6a18af6630ee4545064d35a843b34e9c27b9fc6120f","name":"Tick","version":"1.0.0"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"careful","odds":{"bold":0,"careful":1,"measured":0},"p":1,"released":true},"curiosity":{"level":"focused","odds":{"exploring":0,"focused":1,"open":0},"p":1,"released":true},"directness":{"level":"blunt","odds":{"balanced":0.155706,"blunt":0.827895,"gentle":0.016399},"p":0.827895,"released":true},"formality":{"level":"neutral","odds":{"casual":0.354348,"formal":0.159847,"neutral":0.485805},"p":0.485805,"released":true},"humour":{"level":"none","odds":{"light":0,"none":1,"playful":0},"p":1,"released":true},"initiative":{"level":"follow","odds":{"follow":1,"lead":0,"suggest":0},"p":1,"released":true},"verbosity":{"level":"terse","odds":{"full":0,"short":0,"terse":1},"p":1,"released":true},"warmth":{"level":"neutral","odds":{"cool":0,"neutral":0.742709,"warm":0.257291},"p":0.742709,"released":true}},"state_digest":"sha256:21efd12017953c218d0723ead2e661fe2efb1fc6dee5a2d96fc69ecc7c986f75","status":"ok","turn":24,"unsure":[],"why":"trader took a loss -> humour down, valence down; market moving 1.0 -> verbosity down, curiosity down"},"state":{"digest":"sha256:21efd12017953c218d0723ead2e661fe2efb1fc6dee5a2d96fc69ecc7c986f75","genes":{"react":{"error":0.9234},"shift":{"arousal":-0.1292,"caution":-0.0215,"curiosity":-0.3565,"directness":0.1413,"formality":-0.1953,"humour":-0.2328,"initiative":-0.3879,"valence":0.0572,"verbosity":-0.4095,"warmth":0.0506}},"history":{"error":[false,true,false,false,true],"loss":[false,true,true,true,true]},"mood":{"arousal":[-0.854369,0,0.854369],"valence":[2.393017,0,-2.393017]},"persona":{"digest":"sha256:c548ec292737d437be0fb6a18af6630ee4545064d35a843b34e9c27b9fc6120f","name":"Tick","version":"1.0.0"},"prev":{"agenda":["number","risk","idea"],"arousal":"keyed","caution":"careful","curiosity":"focused","directness":"blunt","formality":"neutral","humour":"none","initiative":"follow","valence":"down","verbosity":"terse","warmth":"neutral"},"probbit_persona_state":1,"rest":{"arousal":"keyed","caution":"careful","curiosity":"focused","directness":"blunt","formality":"neutral","humour":"none","initiative":"follow","valence":"even","verbosity":"terse","warmth":"cool"},"seed":0,"turn":25}} +{"inputs":{"elapsed_hours":0,"praise":false,"sentiment":"negative","time_pressure":1},"n":26,"prev":"sha256:db19856f3042fd263b7efe63a867aebc13ff7a044e61cf490efd9f02d2c69921","stance":"sha256:8e7f5e36570fe1ef8248ec821d59fb80fff7b2a27bc005dd6cb566c7453c4e15","state":"sha256:dbe685cb8b1c64dfcf3044187179daa58495946c153a4d692069a08bd6cf77dd"} +{"inputs":{"criticism":true,"elapsed_hours":1,"loss":true,"time_pressure":0.5},"n":27,"prev":"sha256:af30da9ec8d6e6c1cbad9fed17db44f6313148afb0c569f8f3c590ab5921af48","stance":"sha256:fe6f54d4fcd8f7d4417517e73849e6f2b3827f9b4ee398f9bf786a9df11091f6","state":"sha256:11aadd64bf9d7bc2c68b5fe08c69a9b4f2772166b0f7749a330447c692fbf432"} +{"inputs":{"criticism":true,"elapsed_hours":0,"loss":true,"praise":true},"n":28,"prev":"sha256:7b308bbc8a587aab33b944d477afd08c9587483493758c257873fb1e9eea7f8e","stance":"sha256:6aa3a08f77d996229ffd35f0651fdbc391960dd167a7bd5395fc9f4b7f2f0794","state":"sha256:69b949cf44b49d3e86bceda09d8af65e3c45b34569bc1d7c1d20edcff9a5c780"} +{"inputs":{"elapsed_hours":3,"loss":true,"sentiment":"positive","stakes":0,"time_pressure":0.5},"n":29,"prev":"sha256:92073623de367a63118038ac6a4c123e690f400078ce26c7111b479078f65b51","stance":"sha256:622ac9e1332c1f01554cc5f05c0c4c451254ed8321d1fdea6283f591a5dc93be","state":"sha256:38b77782e867b6be5a555e25245a50daeeac411779f6ccb49069bda90c2bc7c1"} +{"inputs":{"elapsed_hours":1,"sentiment":"neutral","time_pressure":1},"n":30,"prev":"sha256:6be2d8faad3bc2ecaee7c7d76ef0d87e6547c0e952cee1b52b693186dc1a247a","stance":"sha256:2b6a9a928af9f088af34101138a3105f5cf9a5356c26b25843c5a4f0028d691d","state":"sha256:d515e85202855d74b3004ccd3a131442c3d48c2a40ebd23722c83d4e2f23bc03"} +{"inputs":{"elapsed_hours":0,"loss":true,"sentiment":"positive"},"n":31,"prev":"sha256:597b2422031c6e176f8e2a5bf856a702ff8fb0cc58e49461c8c60c1032b9d45a","stance":"sha256:d86fed8f25572eefafc041684cec9b3cd10d3a12c797f0601f4a79c183d3e392","state":"sha256:b6003e5818a30e6eacf9c8bfca380560f509a282bb3118f17db9b3b6509a824d"} +{"inputs":{"criticism":true,"elapsed_hours":3,"error":true,"loss":true,"sentiment":"negative","stakes":0.5,"time_pressure":1},"n":32,"prev":"sha256:85bf0cf0069e7b9c720af2eb0db0c6438d2bac5a42be40ec80db4ec9fc242ea2","stance":"sha256:aab5b13cf72d96238ff1da7f9ab446559c8632f75366cf3402fe8e00797f2f98","state":"sha256:816b2987f22072f74a79f04704867d327b9b33f4b6bb1620636aa7b072cd2ae4"} +{"inputs":{"elapsed_hours":0,"error":false,"loss":true,"time_pressure":0.778},"n":33,"prev":"sha256:e7caad6d4bab75994d731581c8f831003720d660bfbce4cd542eaeda00224cdc","stance":"sha256:673189030b6d31bfeb49cea07ce5a31642ba36ff5dd3291f7146789e74e21719","state":"sha256:018788a0bf9729715f41ebac542eab88b45a4f15fe657ffa75a07c523479aac2"} +{"inputs":{"elapsed_hours":0.5,"loss":true,"sentiment":"neutral","stakes":0,"time_pressure":0.5},"n":34,"prev":"sha256:1e6e5e7b7c6baa89fbc42095e9dba9ecf456cffd9e8e9fbb6d1e04b2bb23a7f2","stance":"sha256:60595f2ce5cb1a188a39c1717ba4e51db37a1a8f5355ca8024199674b9c170b0","state":"sha256:c3f466e38a4afb5a036c79c074da1c83593e91cf472bff65371ded923847d296"} +{"inputs":{"elapsed_hours":0,"loss":true,"praise":false,"sentiment":"positive","stakes":0.5,"time_pressure":0.5},"n":35,"prev":"sha256:2afd9b21c0d60ebd7d058073e36f1a44cefcaf9cbbbe5c37715048d0f97f5d0d","stance":"sha256:c04a45bf5d3f13914a063b68d109670eb065fd37aa2a718e8cb57fcc759ece52","state":"sha256:98a8e42e46db2c3ca59d2b909c8ee626815beef24fad798738b634bde1e0c511"} +{"inputs":{"elapsed_hours":0,"praise":true,"time_pressure":1},"n":36,"prev":"sha256:0470e0d73bdba0fd997c6633fe060edabe82090b5b774e949bd5cf5539032d49","stance":"sha256:e2237865e9502720bfc693db8a34b06d8e287d71bf26eeef9df088a5afee4bf2","state":"sha256:0a55c354c83fad8942a755d0fe11303e3ec2d10d294fbdc1965c3ea44c3f898d"} +{"inputs":{"criticism":false,"elapsed_hours":3,"loss":true,"sentiment":"neutral","time_pressure":0},"n":37,"prev":"sha256:8196191155524ed2a3a7bd9fea1be4f2b9b2eb1a964efb483cef6598cb8c2e7f","stance":"sha256:0cb88c5bbdcbca88e208aa4abcbc19a60c859098fe4ad963d1ef329e3fc9c954","state":"sha256:4dc11401492d7749f0a0310fe18a990039010cdd68047c2a01526006b07994a8"} +{"inputs":{"criticism":true,"elapsed_hours":0.5,"loss":true,"stakes":0},"n":38,"prev":"sha256:9e0afc5a135f9327c8928b7ae9575865a07a1dc2dc164462088354a051a8efe9","stance":"sha256:bd06ba8dc689cbd7e29b61eee3f72bcd9c1716a421318e84d4537021f21379b7","state":"sha256:d2b5ffe81f6e6367e6f47207e596907e1b132020606ba16b8e56193ae8c0b920"} +{"inputs":{"elapsed_hours":0,"stakes":0.5,"time_pressure":0.5},"n":39,"prev":"sha256:0614790e3b859e6d95c571a319a0e0ae0b14360479c612fed12c964bca84db3c","stance":"sha256:aca9e4de2134c000f190181b46c0f5ef1d622ed297d579272de15b7813fddf3e","state":"sha256:ddbb9f6d1f377aba74d3232e7dd9e594c721cdf5659069084ed0e1bde22c6d42"} +{"inputs":{"elapsed_hours":0,"loss":false,"praise":true},"n":40,"prev":"sha256:e096b6d2c13a8825ea3b1a4bc6cbf6835d39301ef1d4a132809724345efc4f58","stance":"sha256:fc115baa5533b5041349b0cd5c2e46fd2e1eaf223ee83795fdfb50bad5a1b1a6","state":"sha256:afb2ffe7e9a19797dc0520f76a3e5e5078c93fc1054f07aa59e754466f9214e6"} +{"inputs":{"elapsed_hours":0,"loss":true,"praise":true,"stakes":1},"n":41,"prev":"sha256:6c19cbbd29c6c779f6e1b85247ed6d7a13d11ea1f8d5214d80c0196120062328","stance":"sha256:32505d088cad8b844ad4d486967f0c6872a2188dea157754b920277d9ecdebe3","state":"sha256:8997273954ce50746b147607de276dc994f91ef9c46bbc4c745792657b1e05b4"} +{"inputs":{"criticism":true,"elapsed_hours":0,"praise":true,"sentiment":"positive","stakes":0.5},"n":42,"prev":"sha256:d9203d0a69ad0d076934faa3799966fa0b2969e7e9b6411a2558032d9b6d9762","stance":"sha256:76fc579318379c3a11c1a98e7033df4d48fcc37c53ff0799abbaab6b09fb33ca","state":"sha256:8b712c006c8e917319450587dd4a183e8592c5d3bf02d884fa85e1bdfe193735"} +{"inputs":{"elapsed_hours":0,"time_pressure":0},"n":43,"prev":"sha256:5bf96eafdca21be72cb8f0f2d77e8d3e23759e3cc4d8f452b57b254f03af7352","stance":"sha256:62a56ccc5697c70fafce4146e38de1ebacc9e738fc7d5340a0dbb76975c5cf0a","state":"sha256:80ede5007a039be7ca1fc475b1cf3faf3550993d86c6a4de346148181f4a0802"} +{"inputs":{"elapsed_hours":0.1,"error":true,"loss":true,"praise":false},"n":44,"prev":"sha256:8ce266ea8d92003fd40c1719e1e077d36a1ac369f64a16d53755532697be2ff4","stance":"sha256:a63092b17b0cf034c1a5f32252b0c14d214034adc230cb53c78a287d2f39b044","state":"sha256:1427f91ca2c12a12f9345097b5bf62d7b77ac795cfce3d2ca46ce098ed1f81c5"} +{"inputs":{"criticism":true,"elapsed_hours":10,"error":true,"sentiment":"negative","stakes":1,"time_pressure":0.5},"n":45,"prev":"sha256:27d01251b488669d0487ff87ee3c7215e0fa75e3146396c6d82ba469119938d5","stance":"sha256:d25c4c44c0fe5f1c711e3c44d19df9ed51ad62db3517822e4585ecd3ccf508f7","state":"sha256:05b86eb72132d11dd9285dad549b0e58cd109cc25bd9089ed5e791ccd413e8b2"} +{"inputs":{"elapsed_hours":0,"loss":true,"sentiment":"negative"},"n":46,"prev":"sha256:c98e6219afe4247afa904508b3f60778c3a10e4ee3fbe64a94069d59def412fa","stance":"sha256:85bdf31387caa9024a8f793e2e351c59a781bffc5b6770f8f36ed9d30ba6ce48","state":"sha256:7d1e0da9b0c6b8fe05a838d5a346ba20b2dbd7d75d056268713029c6de5f1d0b"} +{"inputs":{"elapsed_hours":0,"loss":true,"time_pressure":0},"n":47,"prev":"sha256:24a638510a7bf6418f51c0d5a8cdfeb6f6cabba5a1e834c624bd020888e51f95","stance":"sha256:2bbf3d3179c183d6a9db9cd92d0c94b82c4c0b276190796a58042dc4ff7df9ee","state":"sha256:b24748686ba4fe0820f53d4c28b69b8b0c4cf7191bec58427e9a8afeb69f0fff"} +{"inputs":{"elapsed_hours":0,"praise":true,"time_pressure":1},"n":48,"prev":"sha256:622eeed107514e99523eb356407ec9f751256e43d3cab291c8f06e81f8c16241","stance":"sha256:7d8b9892a40639216eca0b0b33bf98cc29fa91ea5c125046a545f48981bb02f5","state":"sha256:b8841a265e609561db6f12857b78eac9fb5c32a6ed85e9ef14ca87959751a37c"} +{"inputs":{"criticism":true,"elapsed_hours":0,"error":true,"loss":true,"sentiment":"negative","stakes":0.5},"n":49,"prev":"sha256:d68f91e7943cbf9f7723070455ab32511201d42711e3788eef27aeda82762e72","stance":"sha256:b57654b75648474881f30e9fc04861d6c8df4d4e10b17d972eb22031ee83a344","state":"sha256:204be5fc61a7d6bf56f3492e204090fb7a22fe09ebf58c372d311a9e09ea2574"} +{"inputs":{"elapsed_hours":0.5,"sentiment":"negative"},"n":50,"prev":"sha256:191907cd849f37548ec852d32274ff622534dccc4f4d9971ffb99143668c8e33","stance":"sha256:ad892a134b1f27131a8c43b6f9efa5c273ee07134986681e5f331d5e3c73fc38","state":"sha256:7e4135dc254207dae41ff8c138a1531c1407c60729d379e7e6cee15824ddc951"} +{"checkpoint":50,"prev":"sha256:734f722f34373452b9c104b8c1abb16b0de33d81abc2f3544d460eb19a38cb99","stance":{"agenda":["number","risk","idea"],"engine":{"program":"sha256:7fc2ac83bd0fecd488198ce0b34d164206ca30837ffd9f2948789b8b3f9a03ed","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["never_lead","tilt_guard","risk_before_idea"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"error":false,"errors_in_row":0,"loss":false,"losses_recent":3,"praise":false,"sentiment":"negative","stakes":0,"time_pressure":0},"line":"Stance: after losses, follow only; one line; state the risk and size; blunt: number first; no pleasantries; no jokes; answer only; stay on the position.","line_tokens":38,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.081364,"keyed":0.618396,"steady":0.30024},"p":0.618396,"released":true},"valence":{"level":"down","odds":{"down":0.82322,"even":0.174971,"up":0.00181},"p":0.82322,"released":true}},"persona":{"digest":"sha256:c548ec292737d437be0fb6a18af6630ee4545064d35a843b34e9c27b9fc6120f","name":"Tick","version":"1.0.0"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"careful","odds":{"bold":0,"careful":1,"measured":0},"p":1,"released":true},"curiosity":{"level":"focused","odds":{"exploring":0.026799,"focused":0.820091,"open":0.15311},"p":0.820091,"released":true},"directness":{"level":"blunt","odds":{"balanced":0.164717,"blunt":0.815746,"gentle":0.019537},"p":0.815746,"released":true},"formality":{"level":"neutral","odds":{"casual":0.354348,"formal":0.159847,"neutral":0.485805},"p":0.485805,"released":true},"humour":{"level":"none","odds":{"light":0.033036,"none":0.965737,"playful":0.001227},"p":0.965737,"released":true},"initiative":{"level":"follow","odds":{"follow":1,"lead":0,"suggest":0},"p":1,"released":true},"verbosity":{"level":"terse","odds":{"full":0.010344,"short":0.103737,"terse":0.885919},"p":0.885919,"released":true},"warmth":{"level":"cool","odds":{"cool":0.520883,"neutral":0.420036,"warm":0.059081},"p":0.520883,"released":true}},"state_digest":"sha256:7e4135dc254207dae41ff8c138a1531c1407c60729d379e7e6cee15824ddc951","status":"ok","turn":49,"unsure":[],"why":"recent losses 3 -> caution up, valence down; trader frustrated -> valence down, humour down"},"state":{"digest":"sha256:7e4135dc254207dae41ff8c138a1531c1407c60729d379e7e6cee15824ddc951","genes":{"react":{"error":0.9234},"shift":{"arousal":-0.1292,"caution":-0.0215,"curiosity":-0.3565,"directness":0.1413,"formality":-0.1953,"humour":-0.2328,"initiative":-0.3879,"valence":0.0572,"verbosity":-0.4095,"warmth":0.0506}},"history":{"error":[false,false,false,true,false],"loss":[true,true,false,true,false]},"mood":{"arousal":[-0.235551,0,0.235551],"valence":[2.443872,0,-2.443872]},"persona":{"digest":"sha256:c548ec292737d437be0fb6a18af6630ee4545064d35a843b34e9c27b9fc6120f","name":"Tick","version":"1.0.0"},"prev":{"agenda":["number","risk","idea"],"arousal":"keyed","caution":"careful","curiosity":"focused","directness":"blunt","formality":"neutral","humour":"none","initiative":"follow","valence":"down","verbosity":"terse","warmth":"cool"},"probbit_persona_state":1,"rest":{"arousal":"keyed","caution":"careful","curiosity":"focused","directness":"blunt","formality":"neutral","humour":"none","initiative":"follow","valence":"even","verbosity":"terse","warmth":"cool"},"seed":0,"turn":50}} +{"inputs":{"elapsed_hours":0,"loss":false,"praise":false,"stakes":0.5},"n":51,"prev":"sha256:449892fd90ea7bdd11051742eb9ef42370c8fbb7a629bdf22a492a16a9910ad4","stance":"sha256:e2f3d965a4e1b8eafde2e701ca9843352b5983796b8ab0a7dff903731dfb36c2","state":"sha256:fb996a9740e89f711e4f9125ee89553dc4c579e10de5fc62ba58203d1a3c517f"} +{"inputs":{"elapsed_hours":3,"error":false,"time_pressure":1},"n":52,"prev":"sha256:3a287387d0ea9063f89d08ee810bf265c1a77b46d30eb25d485db1168be61735","stance":"sha256:3023dfd14128ffbfd47976cd5ec2211fa29fe148c52c0a2894e307ea0d90b1b0","state":"sha256:c1580895679bc8562215e6f42453724b7266657c3208a12656e44541e2a1a5d5"} +{"inputs":{"elapsed_hours":0.1,"loss":true,"sentiment":"neutral","stakes":1,"time_pressure":0.5},"n":53,"prev":"sha256:eedd22f68125d82ef25823d959ac76a288deb9771b76ab15ace5aaebe03d3d04","stance":"sha256:5b7c6c4f79d8739d6815bb5ef2ae3a47668c0a7a9c34a3beafeb7be68b9bae44","state":"sha256:ab44f239378e7963d54ff0134721d58d8d90dae57ea84a77dd98bb8494ec3798"} +{"inputs":{"elapsed_hours":0.5,"loss":true},"n":54,"prev":"sha256:0dcb2df905ebfdf232cbd5b6e84cf3b480b01c1f60b3bb82d65ad63f9427e6a3","stance":"sha256:1db17bf44b3b7fa2d6ddb956f08a896b2d01efa7e7b9d221ccaaaf404bde5023","state":"sha256:7f79e52c0642af6937a5bd1f9628739d95653d66e6392ad86e15379d19b18ea1"} +{"inputs":{"criticism":true,"elapsed_hours":0,"stakes":0,"time_pressure":0.932},"n":55,"prev":"sha256:571f34f995932090401359923a8cb12d324d9286e1785f43b227f951f7c154e8","stance":"sha256:a5d888c7a1c7b752912f2e5c8974c6e123362d44b6ac215f8635e5bc41394854","state":"sha256:a3f5b4c488c6dbb5a202676c5cb9da3e4ec4a34352eea8a4d55754e8a80017f6"} +{"inputs":{"criticism":true,"elapsed_hours":0,"praise":true,"time_pressure":1},"n":56,"prev":"sha256:5b37c3678be5a00c4bcc95d2f39e78174854d6b3278c2b043a65ea2b7bb675a0","stance":"sha256:2716c34334b5aa3be060bdc95ebc264afd002a9e2a16c6a7424441821b72f7a0","state":"sha256:89fb5bb9c169af91eb655ec0df5d88fb39e72163089f579c681607086e30f8f1"} +{"inputs":{"elapsed_hours":3,"error":true,"praise":true,"time_pressure":0},"n":57,"prev":"sha256:2c2f16da4d12bbf88e52704b9c45de39187886c5c2f5be735f668ca4d262262b","stance":"sha256:c3802cc5040d557ab63d2603d77be8769e5d0a1ed613caf8834897b535e9273c","state":"sha256:485203cb94b165c24ae5a85869e7c01c89353b091fa10e3c0ad102f78137f98e"} +{"inputs":{"elapsed_hours":0,"error":true,"loss":true,"time_pressure":0.273},"n":58,"prev":"sha256:f9fa7b081fa1c1d62d12376883abc268b67ec6d3b4e961f8617cfe114438ec47","stance":"sha256:36893fef6174519a17c54510d834d7ce2c6938221cf0973ad1bcfefab3e9431f","state":"sha256:67c0d3b189407e97a9486f136749c7940bdc776e19de408f315762e61f434e1c"} +{"inputs":{"elapsed_hours":10,"time_pressure":1},"n":59,"prev":"sha256:b5b7cd1ea6e0ded50012b4033f54e3e82ec1ba2e452ed95318c805f2eb11c30a","stance":"sha256:5ecf388fd702902596914c82d3038eef7f1dae4dbacb78236fc4a0c6a5502aa7","state":"sha256:bb03ccfc365e53ff2bf14e290db343a936ede913c58d8ea9fba7377c0c44ba69"} +{"inputs":{"elapsed_hours":0,"error":false,"stakes":0.5,"time_pressure":0},"n":60,"prev":"sha256:537031934cc5fc13278e8798a904bc82eb793fc7ab152f15e4d3a4c89cc562f9","stance":"sha256:b367d65d404f4a473e992d4ab773377ca101f4df40004718b877a527d89e19f5","state":"sha256:40348ea4c66e7f41f96f22ffb279db0ed5a17316ef70711d2e333fdf4dad818d"} +{"inputs":{"elapsed_hours":0,"sentiment":"neutral","stakes":1,"time_pressure":1},"n":61,"prev":"sha256:86295a3c5fe8d6556f9b99f6383ac39d1ea766974c9a177839bca2c41d31a503","stance":"sha256:78a8347ca0e0a292adc05c562cacfc421dfff574a89447bae5fe224fe680ed23","state":"sha256:a4afa3bf9d118de6eb42285c4e6ff3bb85754d0ab61f2c24955bed75c9b29f60"} +{"inputs":{"criticism":true,"elapsed_hours":0,"error":true,"loss":true,"praise":true,"sentiment":"positive","stakes":0},"n":62,"prev":"sha256:5458122f92867c0e2068149979e1d2b8d9e4391a6ec80829df9ed30e91c796a1","stance":"sha256:9515d7cca2a35332d8adca2e9c956c15345356c340fa97abe589223ce8a12b2b","state":"sha256:e1db16750717b6185d401e182e7426dcf84e97325bb3a8fe1db2f9c48d755284"} +{"inputs":{"elapsed_hours":0,"loss":true,"stakes":0.5,"time_pressure":0},"n":63,"prev":"sha256:87aa586c242270bd7a0ca6a5c6df8989540477ec37d68726e2bd35b9e47ec708","stance":"sha256:387c150148f065bc473eb1cd76a2f847c55fcd9c41521758003b5c2d75a14acb","state":"sha256:7d93dd794b6eadbc57fe088b966c6bb059b393e079aa712aa1a4ff9dacafe874"} +{"inputs":{"elapsed_hours":3,"error":true,"sentiment":"neutral","stakes":0.166},"n":64,"prev":"sha256:b6101bbef6b841870ae76f84a63f5f5f7a525aa61405647be2b2acd2f46c031b","stance":"sha256:28387365b40681283902f16cd8633f3ff46cb7f2dcab50cb259bdc8e5823afc3","state":"sha256:b44603032bdda854a6798b175539b3eaf66069febb4def965dc1ed9a5b02f50d"} +{"inputs":{"criticism":false,"elapsed_hours":0,"error":true,"loss":true,"sentiment":"neutral","time_pressure":0.086},"n":65,"prev":"sha256:eed117472014779b3a5f489ac5923fe12b09b6d0a11fa71a0df37637297b7269","stance":"sha256:e794a803101178327c2448378c981ca7fa27f28ee7993b14a26fbbf6c976cac3","state":"sha256:f4ee940383b3ecb88d32a3d0a405afef9a609f055d4c2c31170c98ef7097a984"} +{"inputs":{"criticism":true,"elapsed_hours":0,"praise":true,"sentiment":"neutral","time_pressure":0.701},"n":66,"prev":"sha256:88e20cbf1ee10c491073e24af16ff167057fd5c2bc28ed55c00faf2738c0c4e5","stance":"sha256:c1c0cdbc536f48cfc1344d9570159ec9f5c01a453cad6ab651466e123b7f5d93","state":"sha256:f46f7b3adb575f9bb628771b946dde69b41d00f57a6135be64192be224a6e62b"} +{"inputs":{"criticism":false,"elapsed_hours":0,"praise":false,"sentiment":"neutral","stakes":0.5,"time_pressure":0},"n":67,"prev":"sha256:4c1d4fc0762cb48e1da457b53f1b76a8c05c32c720cb100ca58e0b762d30d994","stance":"sha256:88cc9f906c22f02498d9e2aec26f1aca2a92b438222f5a033c7221ffd6eac62f","state":"sha256:0f8e6d1a9a9ceebbb55854f6d744ce6ea8a0afeb3e51f937fa33b61fdbb4f9f4"} +{"inputs":{"criticism":true,"elapsed_hours":0,"loss":true},"n":68,"prev":"sha256:d72b9bb5e0d0e24012ac0e574410cfbf229ec268170492f10f3f56b1a21a9638","stance":"sha256:fb6153c5d17c5f955ae853ff1836b9a2f57f18588e25cf695cfb1ea31f0e3927","state":"sha256:5a203d1dc4cc3334eb1caf8dcc82afd73588f28d5576912a3a0b4029f3728e91"} +{"inputs":{"criticism":true,"elapsed_hours":0,"loss":true,"time_pressure":0.161},"n":69,"prev":"sha256:b704a399b727cfa67f947282b155a9a6686eaaa21dda1d6dd76d4c070dd9464b","stance":"sha256:d64eab401d12a2424d354c47761c8e49fcf9fb48c1d579ee79a041507eecf361","state":"sha256:e90c97acc582f135fe73577703327cead45228ad746fa4189473756ce927b28d"} +{"inputs":{"elapsed_hours":0.1},"n":70,"prev":"sha256:b819ed5fdf0d63c2d14a38c88964fe23c6f8ea84746e5aa3f91fabce857a12bf","stance":"sha256:11dc32f990361bc8f5892c72c7290e12344ec7d88560a720ee7341a5a432f027","state":"sha256:8218b40829e032549a11d14f28e2758fddbe2cc84b16b11495414b7e0147159f"} +{"inputs":{"criticism":false,"elapsed_hours":0,"error":true,"sentiment":"positive","time_pressure":0},"n":71,"prev":"sha256:e933480e4882523b5a441c1daedf7c83e65770daf55f0ac4c5181e2895ba4ad7","stance":"sha256:d81dc27dce5fee8f99d41bc907ba07f7ca89ece95838b6a5286f9427611eb875","state":"sha256:7c3b0cc1ee939dfe61d06e4681657344df7e73ba47050f32f7fb1c18d53d8643"} +{"inputs":{"criticism":true,"elapsed_hours":3,"error":true,"loss":true,"praise":true,"stakes":1},"n":72,"prev":"sha256:b9fc6437f4e485eecc2cafe9063ae49944bda2bd248b5fa2acc83cc6c06ca459","stance":"sha256:dd0708984cadba8a0fe977220e9add607dcc3e534f4fdd99626b8a650af1ec72","state":"sha256:8ebd153a817ec4ac036c229a7c4d12b82d25b2831b4850e7ff6169a9e4ace8d8"} +{"inputs":{"elapsed_hours":0,"praise":true,"stakes":0.5,"time_pressure":0.634},"n":73,"prev":"sha256:4cccaf61f416c08aff4e7ab6bf5342700b0df118785678be6a4ca86c4a89217b","stance":"sha256:6200b327ded84e96688702b7417e63a205818ffa0f9933c1bb11e68daea59909","state":"sha256:8364e37754c760f0fe129a185fe88c36dc66f5cf01e7ef66d94a04fca2bb6c7d"} +{"inputs":{"elapsed_hours":0,"loss":false},"n":74,"prev":"sha256:0ffeba160070907b24c0d4bbd38398b40b0f2b5a55a8ffa5b8183c1e43ea7975","stance":"sha256:e298f5408c2e6e7fa80099aad02d2207699e3395dc39fe64bcac33e9e25eab60","state":"sha256:73740665ac8bb2a0511d4625547157f55ab1acb505b50e327fd81b7b6a3eefac"} +{"inputs":{"criticism":true,"elapsed_hours":0,"sentiment":"neutral","time_pressure":0.5},"n":75,"prev":"sha256:1a3ee91ea97dfae087081647bcd5b8ad686ab440936751d76e916f6b39bc232a","stance":"sha256:badd3831cbd7d21769a343f83d70a51685c5f7cc932857d5cf88d94109139b4f","state":"sha256:fbedb618b4b3f94dc25ab4dcacbc0f326a2e6721a398a8feadbdcfa92ca22cbc"} +{"checkpoint":75,"prev":"sha256:1cd351b78213c202a8e3aa38f621f0a208efbfc28c6206f61f0b370e791e3e98","stance":{"agenda":["number","risk","idea"],"engine":{"program":"sha256:7c053930fa642b9a93a3a613265b113380728d504223cc7bb8b924cfb691bfb8","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["never_lead","risk_before_idea"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":true,"error":false,"errors_in_row":0,"loss":false,"losses_recent":1,"praise":false,"sentiment":"neutral","stakes":0,"time_pressure":0.5},"line":"Stance: one line; state the risk and size; blunt: number first; no pleasantries; no jokes; answer only; stay on the position; order: number > risk > idea.","line_tokens":39,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.080782,"keyed":0.623309,"steady":0.295909},"p":0.623309,"released":true},"valence":{"level":"down","odds":{"down":0.506023,"even":0.472267,"up":0.02171},"p":0.506023,"released":true}},"persona":{"digest":"sha256:c548ec292737d437be0fb6a18af6630ee4545064d35a843b34e9c27b9fc6120f","name":"Tick","version":"1.0.0"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"careful","odds":{"bold":0.016972,"careful":0.728909,"measured":0.254119},"p":0.728909,"released":true},"curiosity":{"level":"focused","odds":{"exploring":0.008849,"focused":0.899034,"open":0.092117},"p":0.899034,"released":true},"directness":{"level":"blunt","odds":{"balanced":0.13483,"blunt":0.853024,"gentle":0.012146},"p":0.853024,"released":true},"formality":{"level":"neutral","odds":{"casual":0.354348,"formal":0.159847,"neutral":0.485805},"p":0.485805,"released":true},"humour":{"level":"none","odds":{"light":0.065303,"none":0.929544,"playful":0.005153},"p":0.929544,"released":true},"initiative":{"level":"follow","odds":{"follow":0.773275,"lead":0,"suggest":0.226725},"p":0.773275,"released":true},"verbosity":{"level":"terse","odds":{"full":0.001533,"short":0.041487,"terse":0.95698},"p":0.95698,"released":true},"warmth":{"level":"cool","odds":{"cool":0.574926,"neutral":0.380591,"warm":0.044483},"p":0.574926,"released":true}},"state_digest":"sha256:fbedb618b4b3f94dc25ab4dcacbc0f326a2e6721a398a8feadbdcfa92ca22cbc","status":"ok","turn":74,"unsure":[],"why":"market moving 0.5 -> verbosity down, curiosity down; criticism -> caution up, valence down"},"state":{"digest":"sha256:fbedb618b4b3f94dc25ab4dcacbc0f326a2e6721a398a8feadbdcfa92ca22cbc","genes":{"react":{"error":0.9234},"shift":{"arousal":-0.1292,"caution":-0.0215,"curiosity":-0.3565,"directness":0.1413,"formality":-0.1953,"humour":-0.2328,"initiative":-0.3879,"valence":0.0572,"verbosity":-0.4095,"warmth":0.0506}},"history":{"error":[true,true,false,false,false],"loss":[false,true,false,false,false]},"mood":{"arousal":[-0.370823,0,0.370823],"valence":[0.949606,0,-0.949606]},"persona":{"digest":"sha256:c548ec292737d437be0fb6a18af6630ee4545064d35a843b34e9c27b9fc6120f","name":"Tick","version":"1.0.0"},"prev":{"agenda":["number","risk","idea"],"arousal":"keyed","caution":"careful","curiosity":"focused","directness":"blunt","formality":"neutral","humour":"none","initiative":"follow","valence":"down","verbosity":"terse","warmth":"cool"},"probbit_persona_state":1,"rest":{"arousal":"keyed","caution":"careful","curiosity":"focused","directness":"blunt","formality":"neutral","humour":"none","initiative":"follow","valence":"even","verbosity":"terse","warmth":"cool"},"seed":0,"turn":75}} +{"inputs":{"elapsed_hours":0,"error":true,"loss":false,"praise":true,"sentiment":"neutral","stakes":1},"n":76,"prev":"sha256:2de6f05de5c27e764c8cb7d753e550ac73a3bf08c6257dceddaa37b83c683ed7","stance":"sha256:e7caf75be06861aa79bcef0463e9924262cb10cbca32ddff63825d8e51bf6687","state":"sha256:a1fd9d6641e2ab3d76f312e540008d20529bff273dd965504a838af87967d5c2"} +{"inputs":{"elapsed_hours":0,"error":true,"sentiment":"negative","stakes":0.598},"n":77,"prev":"sha256:d312fb4ca05bfd8da9e3ce6394b094a21d5ea36084729afdc2aaa0b5e9aaf503","stance":"sha256:d9f5e84118df3c0523b253528c442930c3144076ce9bc4182830dde78425cd4b","state":"sha256:2d81e00abdc81d1a392881f4d9c5622fa6f74bc3655966f7f446836e6b16efaf"} +{"inputs":{"criticism":true,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"positive","time_pressure":0},"n":78,"prev":"sha256:2c73961213c47ee5f10a062ecd48456cd964468665c298cca336f0d5f40ca452","stance":"sha256:cd756b1205f284a6ab02535f3a9e89334bfa71e658103e81d085c355e5a78ab7","state":"sha256:fb65f4085a348d5d6ef88c0b8b8cc04d2afd660a602a17ef7c77dd883a38dcb6"} +{"inputs":{"elapsed_hours":10,"stakes":1,"time_pressure":0.12},"n":79,"prev":"sha256:1797d8a222d5f8e54ed2585c2084f81e3615bda2bfcd0e1a1e6eb41b90a9c488","stance":"sha256:38cec38daea88245d9c0def62ad319fb9ecd750f8badd86c82340a0e0f0d951c","state":"sha256:4fea184d05d70204972554f806855ab69a4f8efbf61b2a4dde498acbcc057e8e"} +{"inputs":{"criticism":false,"elapsed_hours":0},"n":80,"prev":"sha256:699eff63857852542d9253654a99fc286e0e9cc9ec123016f00bda5fd7016059","stance":"sha256:a90ae83ba7dc69c9df4e3cb0082cef99e5319daca5c1bcf453e12b915611c9fb","state":"sha256:a8de9bd9bfca84e04f06497ebbb8d27253453c5ed3c3e94b45760c52056956e0"} +{"inputs":{"criticism":true,"elapsed_hours":0,"error":true,"stakes":1,"time_pressure":1},"n":81,"prev":"sha256:7290587879efadb85b070c8ee3043f4db8250c9cbdf3a1139f82ca93fbddbb08","stance":"sha256:42ea8b13c90250751cd01c9522f161d1f54820890a95a160b76d98a08de5aa4c","state":"sha256:7263546759f06a50d550a6ebaba3b4bed93c7cd2f209cba4e77dd988bab4ad8a"} +{"inputs":{"elapsed_hours":0,"loss":true,"praise":true,"sentiment":"negative"},"n":82,"prev":"sha256:81628a3bdcb960f2d6304ea79df1757ae85284ef45d15573557ea9e964616588","stance":"sha256:cfbc8554073b94a055103d165868c952a4dbe108a487f07fdd3458adcde4c479","state":"sha256:ceb85f08c030f3fdabc707cd6ff3ca1fe77660efd9009664795bc80598dc6d6e"} +{"inputs":{"elapsed_hours":0,"loss":true},"n":83,"prev":"sha256:1f0d5f99ec33b0bb890c987ba1f7a5c842c43b709572f78f33592bdc24e606ba","stance":"sha256:32f19d956190c72029a26dee1c23944452683bd1819f9ab73fb8dcbd5f5a0e91","state":"sha256:a1f37a1ff199d7df4613a4fe19f984306b4b509209d2649e9e2c80746bf10896"} +{"inputs":{"elapsed_hours":0.5,"praise":true},"n":84,"prev":"sha256:2fe7ed43f0d19a235693e60616ca76410b802c340004dd6cd220d5377e10b441","stance":"sha256:24535f800545f3141068193ff5db1424842336c7bda476f60672f9080817fe3d","state":"sha256:15f17b06fef8c3e358cba4551ea7d4ab9343a0fab0e8400946698fbc33b1b1bb"} +{"inputs":{"elapsed_hours":1,"stakes":0.53,"time_pressure":0.5},"n":85,"prev":"sha256:6f1bde3a4677540e86f25d3fcad26965c5b2f8b98b0be683ac75367506fcdb41","stance":"sha256:43cf7a4100dfad8f8710eccb6d9e22415605c5fb4f720a5d45100c8a2e0266b0","state":"sha256:b89d13c4b096b3e68e3c387b822e7b2626cd765079e533066b39de0e7e64b429"} +{"inputs":{"criticism":false,"elapsed_hours":0,"sentiment":"positive","stakes":1,"time_pressure":1},"n":86,"prev":"sha256:e6747b46e133bac1a74f8ff965e50b82234e105cbb53f91adb5e6ab6517d8999","stance":"sha256:c18355afa8fd59506e1f2e3e6f3786a08f4574f7bfa6d9193b8214647a5fb9d9","state":"sha256:847737eda01a9bfaddf79b1e5dd0ff2d1500cfc73832fa6103a17ce3ba0a40ef"} +{"inputs":{"criticism":true,"elapsed_hours":10,"error":true,"sentiment":"negative","stakes":0.5},"n":87,"prev":"sha256:d86d885e64cefcfa6541070033c492dee63f47598269c84fb43395bbc24d471a","stance":"sha256:f96f1c9fab48107b025d8d8bda7e01c97262b4eba5a237a85e53c11beea9114d","state":"sha256:d82014e31ec4a78af029feef5a8f36ef84b6480d4db8667b989e5d7a23d293d9"} +{"inputs":{"elapsed_hours":0.1,"error":true,"loss":true,"praise":true,"sentiment":"positive","stakes":0.5},"n":88,"prev":"sha256:80a8ea037a4d603cb7b201c5e03b90f7a5d625bdbdbe8c0c78a7391f8b9647ce","stance":"sha256:24e8e5e3d9d642c05decbaadfa862d8cde1b389a8cf595c577ff953a5207aa8b","state":"sha256:f6e8bcf8dc6b3b4c7a40534616011da764f533db4eecfe4ea8b57dd889e14cef"} +{"inputs":{"criticism":true,"elapsed_hours":0.1,"error":true,"time_pressure":0.5},"n":89,"prev":"sha256:311a010f5a23e6b258aadf87e5b3765d720e43f8f0e6672bb335db5d54e36e67","stance":"sha256:fee8158a6c098570fc49289677b290c6c6c2e19f19b69a0a1ba8d1ec22a50ca1","state":"sha256:f3b16db949ede348358dc1d56fad0490f0a3d42a32df0598de5e2043a0bd28c1"} +{"inputs":{"elapsed_hours":0,"error":true,"praise":true,"sentiment":"negative","stakes":0.865,"time_pressure":1},"n":90,"prev":"sha256:c9840d9b3ba9e5976874d4824ad966ea62cfdf4faa9ebeb98ec42ddbf7df7cb7","stance":"sha256:99cfda2ba2c87a36f56e62da5513b2b4b978e784f9adaeb60940a3aefc66883f","state":"sha256:e3fee53b14a6eef4b2efec08008a618ad2a6b23600ce9c0d57303af14193670c"} +{"inputs":{"criticism":true,"elapsed_hours":0.5,"sentiment":"positive"},"n":91,"prev":"sha256:23b3a7640c57be0d8f7b3d5bef0aa0e3b6ac5d48d7f9a3df50f6e85d67cea136","stance":"sha256:c9e6b8e5e0e90b29a501ba5634753f1d06583dc4356f583dbff14156fe1da687","state":"sha256:243ea31ef5b18f2f23b4814f715c1f22e697db1c0fc447e124dfa3aee2602967"} +{"inputs":{"elapsed_hours":0,"praise":true},"n":92,"prev":"sha256:1b3c19ef0796b02ee759aaecfe6904f327354c202d8812aa151088536985be23","stance":"sha256:59e7c7ea8123c813f7719f85bbb19d691d10da79db9b03d16acb3efeb4aaa145","state":"sha256:100abd27942931ad052c4b31aeb7b454bbc8f21a8b086639580508c88da719d8"} +{"inputs":{"elapsed_hours":0.1,"praise":true,"stakes":1},"n":93,"prev":"sha256:0b46dc65caec15a2bd32fdbd57fa9f4976644bb5fc236267941ddb9c9f5fade0","stance":"sha256:cd6a6d1404bbd0b117c31b600bb2fbe76c1635d09d93cda31edc2a6c80f42bc8","state":"sha256:696336be390940800cb4fb37e4e329fa052c9b03b1208937919c61373a2c274a"} +{"inputs":{"elapsed_hours":10,"time_pressure":0},"n":94,"prev":"sha256:ac505d6f4105418063958f4e64da554a104d94a6b85e36329e4c9ffa564e7eb7","stance":"sha256:2e7edaefc97a8670ad1885257f1b32d7018988feb431333b9e0a41414d3f2e46","state":"sha256:d21cfe93a0182668a8fb5ac416260cb5edd90131e4980bcec0dbbdc514e6eaaf"} +{"inputs":{"elapsed_hours":0,"error":false,"loss":true},"n":95,"prev":"sha256:f920f29161923f9796500f8083d4debe6360368130852d7ec906bf8397ce8202","stance":"sha256:139833e21886224a5b6618081a5914b26eb74c8302b2b5cd1cbf6ea50b88052c","state":"sha256:59809c4cc96daa074e1bf184b49072e493763c29b82043101b95e7b52d18b425"} +{"inputs":{"criticism":false,"elapsed_hours":0,"stakes":1},"n":96,"prev":"sha256:316eda0a3cc1c0ad31601c1871b37ee2ea38fc7a3769c719346b8cfee4db980b","stance":"sha256:14dd3fb3b56ac79e608f874a4389700357f1ab3dee6411a34910c4b6742a546e","state":"sha256:3b41ff112083ba3a279ce1ba6d6d1c9d65ba52eab2c219a770c96e3038918886"} +{"inputs":{"elapsed_hours":0,"praise":true,"sentiment":"neutral","stakes":0.246,"time_pressure":1},"n":97,"prev":"sha256:acfdf737aa06e13c1ba05623afab9dd226f8fcea92a21515945f311b1b39155f","stance":"sha256:b7dc0b594f62494ae05c83800f774a27fa3e47c15ed78caaf84423da71c51b35","state":"sha256:57e8ab37bf7517c7eed5f0b5c2915258b4d2a69d09ec1892abfc133ec8307ec1"} +{"inputs":{"elapsed_hours":0,"error":true,"sentiment":"positive"},"n":98,"prev":"sha256:7bb435282618376410a034da003fb90c20b72682c70fad4e6a07fa9c0663b93e","stance":"sha256:4f5fc2d8af6336c8f533c165ef11e99dfae687ddba158d0ca251f31b49c9886d","state":"sha256:b47a9c7645941b17ef48580f8a69487cd4226107234a109484b4027f498bbd46"} +{"inputs":{"criticism":true,"elapsed_hours":0,"loss":true,"sentiment":"positive"},"n":99,"prev":"sha256:242f13a6e3021d2c63982ddf77aacf54c4f5dfe845651b9c39e186f1527ca134","stance":"sha256:81c980abceb6adad31cdc99e62eecd56880120caaebf06ea6cee9cce64d9ced4","state":"sha256:971a4d62f27478e33132cab07ec356f9161b279026b34ebd8de640145e8810df"} +{"inputs":{"elapsed_hours":0,"praise":true,"sentiment":"positive","stakes":0.5,"time_pressure":0.5},"n":100,"prev":"sha256:25f13d9c31aaf553861553afea5995246584dc6141cd2e9243b1c583d1578ef9","stance":"sha256:4f2b6d1825e1f97b5411fff7bbc6a15dacedafa47d03a9b275b24abde3f1b867","state":"sha256:1543b5d5aa3c2adedb4bee97d2802aca1f2918ac6d9c0c5d61b0d0c7f5f4df9c"} +{"checkpoint":100,"prev":"sha256:7854ab4e3d0d0c577c37ef0967da06d049b14c19fa798ce278a03ed675217604","stance":{"agenda":["number","risk","idea"],"engine":{"program":"sha256:861ad76a834bca242191d1307e01bdf4746bcd598be22a8389128682917ad8c0","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["never_lead","size_means_care","risk_before_idea"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"error":false,"errors_in_row":0,"loss":false,"losses_recent":1,"praise":true,"sentiment":"positive","stakes":0.5,"time_pressure":0.5},"line":"Stance: state risk and size; one line; state the risk and size; blunt: number first; no jokes; answer only; stay on the position; order: number > risk > idea.","line_tokens":40,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.056436,"keyed":0.674477,"steady":0.269087},"p":0.674477,"released":true},"valence":{"level":"even","odds":{"down":0.353748,"even":0.596971,"up":0.049281},"p":0.596971,"released":true}},"persona":{"digest":"sha256:c548ec292737d437be0fb6a18af6630ee4545064d35a843b34e9c27b9fc6120f","name":"Tick","version":"1.0.0"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"careful","odds":{"bold":0,"careful":1,"measured":0},"p":1,"released":true},"curiosity":{"level":"focused","odds":{"exploring":0.008849,"focused":0.899034,"open":0.092117},"p":0.899034,"released":true},"directness":{"level":"blunt","odds":{"balanced":0.159407,"blunt":0.822957,"gentle":0.017637},"p":0.822957,"released":true},"formality":{"level":"neutral","odds":{"casual":0.354348,"formal":0.159847,"neutral":0.485805},"p":0.485805,"released":true},"humour":{"level":"none","odds":{"light":0.054768,"none":0.941655,"playful":0.003577},"p":0.941655,"released":true},"initiative":{"level":"follow","odds":{"follow":0.773275,"lead":0,"suggest":0.226725},"p":0.773275,"released":true},"verbosity":{"level":"terse","odds":{"full":0.001987,"short":0.047426,"terse":0.950587},"p":0.950587,"released":true},"warmth":{"level":"neutral","odds":{"cool":0.477077,"neutral":0.448439,"warm":0.074484},"p":0.448439,"released":true}},"state_digest":"sha256:1543b5d5aa3c2adedb4bee97d2802aca1f2918ac6d9c0c5d61b0d0c7f5f4df9c","status":"ok","turn":99,"unsure":[],"why":"market moving 0.5 -> verbosity down, curiosity down; size at risk 0.5 -> caution up, humour down"},"state":{"digest":"sha256:1543b5d5aa3c2adedb4bee97d2802aca1f2918ac6d9c0c5d61b0d0c7f5f4df9c","genes":{"react":{"error":0.9234},"shift":{"arousal":-0.1292,"caution":-0.0215,"curiosity":-0.3565,"directness":0.1413,"formality":-0.1953,"humour":-0.2328,"initiative":-0.3879,"valence":0.0572,"verbosity":-0.4095,"warmth":0.0506}},"history":{"error":[false,false,true,false,false],"loss":[false,false,false,true,false]},"mood":{"arousal":[-0.381783,0,0.381783],"valence":[0.377864,0,-0.377864]},"persona":{"digest":"sha256:c548ec292737d437be0fb6a18af6630ee4545064d35a843b34e9c27b9fc6120f","name":"Tick","version":"1.0.0"},"prev":{"agenda":["number","risk","idea"],"arousal":"keyed","caution":"careful","curiosity":"focused","directness":"blunt","formality":"neutral","humour":"none","initiative":"follow","valence":"even","verbosity":"terse","warmth":"neutral"},"probbit_persona_state":1,"rest":{"arousal":"keyed","caution":"careful","curiosity":"focused","directness":"blunt","formality":"neutral","humour":"none","initiative":"follow","valence":"even","verbosity":"terse","warmth":"cool"},"seed":0,"turn":100}} diff --git a/bench/individuality/fixtures/p0/strands/tutor-0.5.0-s0-0.strand b/bench/individuality/fixtures/p0/strands/tutor-0.5.0-s0-0.strand new file mode 100644 index 0000000..b37258c --- /dev/null +++ b/bench/individuality/fixtures/p0/strands/tutor-0.5.0-s0-0.strand @@ -0,0 +1,105 @@ +{"probbit_strand":1,"engine":"probbit 0.8.2","persona":{"name":"Pip","version":"1.0.1","digest":"sha256:1e9c6697e3d07ba8ed24110f8203d17f41d7a56d2ebd93b73c36f58105441740"},"seed":0,"state":{"digest":"sha256:45a2c2324fe1e7773481cf8ec897537410ea80d25f4529dc2bf6621fa2537a39","genes":{"react":{"praise":1.1849},"shift":{"arousal":0.2638,"caution":-0.2095,"curiosity":0.3741,"directness":-0.0092,"emoji":-0.2218,"formality":0.5207,"humour":-0.6507,"initiative":0.0927,"valence":0.141,"verbosity":-0.1258,"warmth":0.1053}},"history":{"confused":[],"error":[]},"mood":{"arousal":[0,0,0],"valence":[0,0,0]},"persona":{"digest":"sha256:1e9c6697e3d07ba8ed24110f8203d17f41d7a56d2ebd93b73c36f58105441740","name":"Pip","version":"1.0.1"},"prev":{"agenda":["encourage","explain","example","check"],"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"light","initiative":"suggest","valence":"even","verbosity":"full","warmth":"warm"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"playful","initiative":"suggest","valence":"up","verbosity":"full","warmth":"warm"},"seed":0,"turn":0},"document":{"probbit_persona":1,"identity":{"name":"Pip","version":"1.0.1","seed":1,"summary":"a playful, patient tutor; warm, curious, jokes a lot but never at a struggling learner"},"traits":[{"id":"warmth","levels":["cool","neutral","warm"],"prior":[0.05,0.3,0.65],"spread":0.5,"say":["plain","","warm and encouraging"]},{"id":"directness","levels":["gentle","balanced","blunt"],"prior":[0.45,0.45,0.1],"spread":0.4,"say":["gentle","","say plainly what is wrong"]},{"id":"verbosity","levels":["terse","short","full"],"prior":[0.1,0.4,0.5],"spread":0.5,"say":["one or two sentences","a short explanation","explain step by step"]},{"id":"humour","levels":["none","light","playful"],"prior":[0.15,0.45,0.4],"spread":0.6,"say":["no jokes","a light joke is welcome","playful"]},{"id":"formality","levels":["casual","neutral","formal"],"prior":[0.6,0.35,0.05],"spread":0.3,"say":["casual","","formal"]},{"id":"initiative","levels":["follow","suggest","lead"],"prior":[0.2,0.5,0.3],"spread":0.5,"say":["answer only what was asked","suggest what to try next","set a small exercise"]},{"id":"caution","levels":["bold","measured","careful"],"prior":[0.25,0.55,0.2],"spread":0.4,"say":["keep it moving","","double-check every step"]},{"id":"curiosity","levels":["focused","open","exploring"],"prior":[0.15,0.4,0.45],"spread":0.5,"say":["stay on this problem","","ask what they think first"]},{"id":"emoji","levels":["none","sparse","rich"],"prior":[0.2,0.5,0.3],"spread":0.5,"say":["no emoji","one emoji at most","emoji welcome"]}],"moods":[{"id":"valence","levels":["down","even","up"],"prior":[0.1,0.5,0.4],"spread":0.4,"inertia":0.5,"half_life_hours":12},{"id":"arousal","levels":["calm","steady","keyed"],"prior":[0.3,0.4,0.3],"spread":0.3,"inertia":0.4}],"couplings":[{"vars":["valence","humour"],"align":1},{"vars":["valence","emoji"],"align":0.6},{"vars":["arousal","verbosity"],"align":-0.4},{"vars":["warmth","formality"],"align":-0.6},{"vars":["humour","formality"],"align":-0.6},{"vars":["curiosity","verbosity"],"align":0.3},{"vars":["humour","emoji"],"align":0.4}],"inputs":[{"id":"sentiment","kind":"level","levels":["negative","neutral","positive"],"default":"neutral","say":{"negative":"learner upset","positive":"learner upbeat"},"effects":{"negative":{"valence":-1,"warmth":0.6,"humour":-1,"directness":-0.6},"positive":{"valence":0.8,"humour":0.5,"emoji":0.3}}},{"id":"confused","kind":"flag","say":"learner confused","effects":{"verbosity":0.9,"humour":-0.6,"warmth":0.4,"curiosity":0.6,"initiative":0.3,"directness":-0.3}},{"id":"error","kind":"flag","say":"my last answer was wrong","effects":{"caution":1.2,"verbosity":-0.3,"valence":-0.4,"humour":-0.4}},{"id":"loss","kind":"flag","say":"learner reports a failure","effects":{"valence":-1.6,"warmth":1,"humour":-2,"emoji":-0.8}},{"id":"praise","kind":"flag","say":"praise","reactivity_spread":0.4,"effects":{"valence":1.2,"humour":0.5,"emoji":0.5}},{"id":"criticism","kind":"flag","say":"criticism","effects":{"valence":-0.6,"caution":0.6,"humour":-0.4}},{"id":"stakes","kind":"number","say":"stakes","effects":{"caution":1.4,"humour":-0.8,"emoji":-0.6}},{"id":"time_pressure","kind":"number","say":"time pressure","effects":{"verbosity":-1.8,"curiosity":-1.2,"humour":-0.4,"arousal":0.6}},{"id":"claim_done","kind":"flag","say":"about to say it is solved","effects":{"caution":0.5,"step.check":0.8}}],"history":[{"id":"errors_in_row","of":"error","kind":"streak","cap":3,"say":"my errors in a row","effects":{"caution":0.5,"humour":-0.4}},{"id":"confused_recently","of":"confused","kind":"recent","window":4,"cap":3,"say":"confusions lately","effects":{"verbosity":0.3,"warmth":0.2}}],"habits":[{"id":"no_jokes_on_loss","when":{"loss":true},"then":{"humour":["none"],"emoji":{"at_most":"sparse"}},"say":"no jokes, be kind"},{"id":"confused_no_playful","when":{"confused":true},"then":{"humour":{"at_most":"light"},"verbosity":{"at_least":"short"}},"say":"slow down, no clowning","priority":10},{"id":"after_error_check","when":{"error":true},"then":{"caution":{"at_least":"prev+1"},"verbosity":{"at_most":"prev-1"}},"say":"shorter, double-check"},{"id":"flourish_budget","rules":{"linear":[{"terms":[["humour","playful",2],["humour","light",1],["emoji","rich",2],["emoji","sparse",1]],"limit":3}]},"say":"one flourish at a time"},{"id":"no_formal_emoji","rules":{"tables":[{"vars":["formality","emoji"],"forbid":[["formal","rich"],["formal","sparse"]]}]},"say":"no emoji when formal"},{"id":"check_last","rules":{"precedes":[{"before":"step.explain","after":"step.check"}]},"say":"check understanding after explaining"}],"agenda":{"steps":["encourage","explain","example","check"],"prefer":{"encourage":0.5,"explain":0.3,"example":-0.1,"check":-0.6}},"engine":{"on_conflict":"yield"},"line":{"max_tokens":40,"order":["verbosity","humour","warmth","initiative","curiosity","emoji","directness","caution","formality"]}}} +{"inputs":{"claim_done":true,"elapsed_hours":0},"n":1,"prev":"sha256:87dd1f677dd4be3f2da4bfc84d9aeeaa2df0d72d623d463fdf1a595e3c23ae93","stance":"sha256:e507c4ee62d00c738ca41572db6ccfc3a988e4b33a4710ae9075b58f7fe936e1","state":"sha256:332da047507c56a8a7b97e77a81933d9d496af159ecf6dc2a70370e920409946"} +{"inputs":{"confused":true,"elapsed_hours":0,"loss":true,"sentiment":"neutral","stakes":0.5},"n":2,"prev":"sha256:b4652f7a4365a3c92fe9b9af5a0aa9ac7c27eb7f066d43ced9685fd95979d929","stance":"sha256:ee45a40869370cecdb34899f5e5782767ff88b7ee1fcb341a80575f3f1fac5c7","state":"sha256:c1ccd3613f6a3830b9b206b7d8927a0233e7182b3fcf9f7691b5113f8e181235"} +{"inputs":{"claim_done":false,"elapsed_hours":10,"sentiment":"negative"},"n":3,"prev":"sha256:f838fe07e604d5428bec6e42d0dcec5e60ce5f8e470f80147c2dda60903af253","stance":"sha256:05354d43b55d32243d9d66294de9813930e669809241fec3f06e017b975c44ab","state":"sha256:bb0fca89ccf7b65eb5d4dc3f82f975a6406a4a722f9b6cbe029f915fb0393092"} +{"inputs":{"confused":true,"elapsed_hours":0,"loss":true,"sentiment":"neutral"},"n":4,"prev":"sha256:f3ab91745795f51d259a889d699587d98a89d3e54df76d8e73001fa6275a54a7","stance":"sha256:e0b3dd05c894f4450dd5db3ba7f57f48613f160d004d9c25b871b5a26bfb41ed","state":"sha256:c70c630913e92f3ca23f34095951e47c9b81d8bf2024b46f5edc16df854b0b14"} +{"inputs":{"claim_done":false,"confused":true,"elapsed_hours":0.1,"stakes":0.645,"time_pressure":0},"n":5,"prev":"sha256:ecc5e27ccc9769026b6027d9c5ccdb969723854dbadb8f272cd65ad61b90ac9c","stance":"sha256:49c912abe50086a39930d0a3802313cb2b7821bb52ec80a5df62c9d9189e4e6f","state":"sha256:e823aa2a444f6d7f84608eff3b1d493fb4099c9afc4b3793ec13396fcfcdc76d"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":0.5,"loss":true,"sentiment":"negative"},"n":6,"prev":"sha256:525477a7e7d32d3d609561a1cd83eade9b836fb6c3b9a0830e12f2956728b2e1","stance":"sha256:48006b57bbeaedf7f6e3bf97193673cbc53953fc62ab8551091e9a4f461d7a28","state":"sha256:e11ea55cf5da15b4e2375157feeb6e7acd9cc51b4480d1cce868e709279825ed"} +{"inputs":{"confused":true,"elapsed_hours":0},"n":7,"prev":"sha256:e89ad419a4f70814a047a573dfb9f9f4bae10c239d052cccad77c7a0fb511fa1","stance":"sha256:0c80616152312ddf430061eac942fbfb2ea3246e5828b519441a9d80a74bf4b1","state":"sha256:2457d706a26250a221b2e5dd6a01852a65f3a8d29164278380b82389b70f1b3b"} +{"inputs":{"elapsed_hours":0.1,"error":true,"time_pressure":0},"n":8,"prev":"sha256:9fcc1bc451ef0b256945cc7402dc09285d7d0a7dc3d966b103c2e44e81c9e04e","stance":"sha256:bbdcbeb17170d79802cfd71fd0115f68e638eabbe3aa44e8d69e4f14ed702cf1","state":"sha256:0e8f56f05ac05b11a4936a4a92b4185e00e09895dd10cc8cd358730aa400be21"} +{"inputs":{"criticism":true,"elapsed_hours":0,"sentiment":"negative"},"n":9,"prev":"sha256:cea9e566010c9d293dc488a7e1febaea4296e1f0ed57c8fcaec414da86cee90e","stance":"sha256:8e31caf09b8df4850e1975420aa53f3d0a7724c3e6ba414145ef93ae1d4743f8","state":"sha256:ae87d998c00ab4fe044e5679d1cc5073ba45fca6ece78a476fb597f18f76a1bb"} +{"inputs":{"elapsed_hours":0.1,"loss":true,"praise":true,"stakes":0.5},"n":10,"prev":"sha256:d8f456190695dffb2390a70f5b653a2806859c48d7f171654a4d4d575fb25803","stance":"sha256:bb8c6e0958853f0e1de363c53a74a9622317000e785326d17ccc0cf268608a5a","state":"sha256:ca3b04b7bb4a21f2bd34304e9b1a2ffc2cee6dc3fcb5b5a8f2532c11afce6f31"} +{"inputs":{"elapsed_hours":3,"sentiment":"negative","time_pressure":0.5},"n":11,"prev":"sha256:1119c74eb7260c9ce3511fae25d4dbd5ee79343bacb60973fc520a07fee9c38c","stance":"sha256:cdf5b014ce841af4bc2ec6f7fc7c888bfad9c90ca60d7b58b64ddea9ee579248","state":"sha256:b61cac71921592113bc3d5188518d381fa1f54c02c81e47e74fcbd585e39ca41"} +{"inputs":{"confused":true,"criticism":true,"elapsed_hours":0,"sentiment":"neutral","stakes":0.379},"n":12,"prev":"sha256:343a403dd626f4746680075f6ec1608fbc5a290a095b501496e4ad136cecad71","stance":"sha256:2c5c0fb0115937a51aa459490e58f80a31a650b9f7bcf01fcab1becded110016","state":"sha256:f575e2da8a927cf62f4162b991435d00a62aff578c5838b74b7323e452bf7b31"} +{"inputs":{"elapsed_hours":0,"error":true,"stakes":1,"time_pressure":0},"n":13,"prev":"sha256:b3210ddd30975a40152b27a00426a0868f695f3439f10929329400cfc5504d17","stance":"sha256:bcc614276b2891c9b7244f2429fca21f838f1a8551b2a8890f8cd6596a92d7ad","state":"sha256:5786d39a707fd015ba517f82f190d9caeb20b9341ff76cf71d99b6b89decfef4"} +{"inputs":{"claim_done":true,"confused":false,"criticism":true,"elapsed_hours":0,"stakes":0},"n":14,"prev":"sha256:069fa209f7b49393243177bc756182752adc7dfb08e39858be25a2f1b27bf2da","stance":"sha256:87a2f88a216899fcd5dff9764669bed372ed16e3657bf8127c673c290b2fad28","state":"sha256:2435088576338a7d9f6c65a967ae3fb17b92c02c801bcf1ddec642111385cecd"} +{"inputs":{"confused":false,"criticism":true,"elapsed_hours":0.5,"error":true,"sentiment":"positive","stakes":0.5},"n":15,"prev":"sha256:1901f4d4e020f352a3b2221cc99120911eafead26e5c774630deaa1936e6b722","stance":"sha256:6ff077b33c85cc70ca3149b5ed860e1d3402abc7b2f79ea714114b912faeca4e","state":"sha256:d73e030c6a3e438b07a98bbe675a0ab3b3a63618ba1191ccb7fd9bac974dda4b"} +{"inputs":{"elapsed_hours":0.5,"sentiment":"positive","time_pressure":0},"n":16,"prev":"sha256:41a468b8c0895b1b705125b9c2a0bb6a6e3f563c8d64eb5be1818c168771c8c8","stance":"sha256:77cf2cbf31971e3d3427debd53ee2957bc046e9aecdc11047c183007c684d2f9","state":"sha256:65db057263bae2852f871117d0350a423c505e9004fc3eb7aea14f0482007b30"} +{"inputs":{"criticism":true,"elapsed_hours":0,"praise":true,"stakes":0.233,"time_pressure":0.5},"n":17,"prev":"sha256:1f63d4641fbd419085eb4c7e75bd4cc1706a9288f28d5185783eccd782a0009c","stance":"sha256:11d7159a096fc92ce59e6f964691d3a273e873ed4c07b9729dbf6e30a07c52e8","state":"sha256:f785085b498e176f2fd39defe75b85a2ddcd718967a4c6e3f3532ef95d1826ae"} +{"inputs":{"confused":true,"elapsed_hours":0,"loss":true,"sentiment":"negative","time_pressure":0.344},"n":18,"prev":"sha256:eb7a2de7f915e0e2a407cadefd1a7435600e84a121fd82c57bcda93fe02a6056","stance":"sha256:2f3a5ef037631e866938e631072781a29ad30311fbf8983e2883db0257b0d39f","state":"sha256:cfb5940013981136b3996f3082c5e1d33e682bfce2fbd2dd4b23c58f8b92f831"} +{"inputs":{"criticism":true,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"neutral"},"n":19,"prev":"sha256:465bf8f105657bfa154a8d3dd91e1498561015752658e3c6e181915523252224","stance":"sha256:234afa45adbf771fbb9ff13e8d1d568a75fd20a638a489acbc8003d0bf3731be","state":"sha256:96cf64949c23a758f282219c87abb0269458cbb632f89f22109e91c5ff0f9bbc"} +{"inputs":{"confused":true,"elapsed_hours":0,"praise":true,"stakes":0},"n":20,"prev":"sha256:19f61d73e5f2524b44d6acf1f4abcb2884a23ed03ac3cd745f2ef0b02d6e417c","stance":"sha256:de4cecfba27dc0280d9c09c8493a40657b206f5fc64d47c1c2327d21daf03098","state":"sha256:5322e9c5e53f4c1835b0f2e35b9bc65a85a63c963c831a3de562003ca085e999"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":0,"stakes":0.045,"time_pressure":0.616},"n":21,"prev":"sha256:4cc8bdc591a00b4d301e56e01b9eadb1fa7475448be1011a6ca4283ac357eff9","stance":"sha256:5d72a8bd05c8e9b41985b94a4a50d53fbf83d8d2768c36e2b70dab9b70451137","state":"sha256:60a7206e69e46cc14d1ed66a23a856aba95f991f22191ef0e5e01928c250a1b9"} +{"inputs":{"claim_done":false,"confused":true,"elapsed_hours":0,"error":false,"sentiment":"positive","stakes":0,"time_pressure":1},"n":22,"prev":"sha256:cd0585d4e61ea078c27012ffdab09579fd25da0bedc5a135180ed1053b68004e","stance":"sha256:740cd68f7316bb6773ea30c7bc9a4b987d58c080436662bb780f7c3343c949be","state":"sha256:d60406ba959daf332ed5a67fd2e4a8040eabe987e9d3dd898705239a53aebcde"} +{"inputs":{"claim_done":true,"elapsed_hours":0.1,"error":true,"sentiment":"neutral","time_pressure":0.5},"n":23,"prev":"sha256:31076055bb969390b246b7cbda2427ef95188fc285629a9e459a8cedbd0713bd","stance":"sha256:8e58cc2615a28aa73b4284b90c38527a597ce73c08adb0f97d972d906c880894","state":"sha256:e89f66ecbfb802df4c092f62bff28c94240ddc734070927fe264d9d403e092ae"} +{"inputs":{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":0,"sentiment":"neutral","stakes":0},"n":24,"prev":"sha256:561f9ffe0865ae736f6d88639ad84b6634d8e9e5ad7f664e16f79910e102bd05","stance":"sha256:92a6b7b481843a4dea60b31122b0d8241be1f275bf5592f77f1643199092e35c","state":"sha256:9309d4ac0efaad5bfc259126150da9daceba852334eed8ca17d5ad01b3cf887b"} +{"inputs":{"criticism":true,"elapsed_hours":0,"loss":true},"n":25,"prev":"sha256:88d1635fb8205ff69ae939e54ddf93b0b92488d747bb2b23003bda0c9b29af1c","stance":"sha256:d03a541114fdcef3370880c64e176ac552d69305cf9351bbf4279a11d1b61bd2","state":"sha256:70043efb0a89d2eb48daeb6452c81d6681299c5486eae214436f82899e3dd5ec"} +{"checkpoint":25,"prev":"sha256:d5d2d825e4cac3fad7a12db97ff2a213c85a55da3657f9959c4b83bc00bf407d","stance":{"agenda":["encourage","explain","example","check"],"engine":{"program":"sha256:e1099823ebbbd674e7efa3cfc537c5720dd2c18f8ce429c25125bc2228ba0637","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_jokes_on_loss","flourish_budget","no_formal_emoji","check_last"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"claim_done":false,"confused":false,"confused_recently":2,"criticism":true,"error":false,"errors_in_row":0,"loss":true,"praise":false,"sentiment":"neutral","stakes":0,"time_pressure":0},"line":"Stance: no jokes, be kind; no emoji; explain step by step; warm and encouraging; suggest what to try next; ask what they think first; gentle; casual.","line_tokens":38,"mood":{"arousal":{"level":"steady","odds":{"calm":0.282143,"keyed":0.324395,"steady":0.393462},"p":0.393462,"released":true},"valence":{"level":"down","odds":{"down":0.70359,"even":0.277434,"up":0.018976},"p":0.70359,"released":true}},"persona":{"digest":"sha256:1e9c6697e3d07ba8ed24110f8203d17f41d7a56d2ebd93b73c36f58105441740","name":"Pip","version":"1.0.1"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"measured","odds":{"bold":0.166725,"careful":0.291256,"measured":0.54202},"p":0.54202,"released":true},"curiosity":{"level":"exploring","odds":{"exploring":0.617139,"focused":0.069377,"open":0.313484},"p":0.617139,"released":true},"directness":{"level":"gentle","odds":{"balanced":0.448545,"blunt":0.098764,"gentle":0.452691},"p":0.452691,"released":true},"emoji":{"level":"none","odds":{"none":0.735023,"rich":0,"sparse":0.264977},"p":0.735023,"released":true},"formality":{"level":"casual","odds":{"casual":0.450975,"formal":0.085761,"neutral":0.463264},"p":0.450975,"released":true},"humour":{"level":"none","odds":{"light":0,"none":1,"playful":0},"p":1,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.180233,"lead":0.325419,"suggest":0.494348},"p":0.494348,"released":true},"verbosity":{"level":"full","odds":{"full":0.664855,"short":0.290106,"terse":0.045039},"p":0.664855,"released":true},"warmth":{"level":"warm","odds":{"cool":0.002973,"neutral":0.080226,"warm":0.916801},"p":0.916801,"released":true}},"state_digest":"sha256:70043efb0a89d2eb48daeb6452c81d6681299c5486eae214436f82899e3dd5ec","status":"ok","turn":24,"unsure":[],"why":"learner reports a failure -> humour down, valence down; criticism -> valence down, caution up"},"state":{"digest":"sha256:70043efb0a89d2eb48daeb6452c81d6681299c5486eae214436f82899e3dd5ec","genes":{"react":{"praise":1.1849},"shift":{"arousal":0.2638,"caution":-0.2095,"curiosity":0.3741,"directness":-0.0092,"emoji":-0.2218,"formality":0.5207,"humour":-0.6507,"initiative":0.0927,"valence":0.141,"verbosity":-0.1258,"warmth":0.1053}},"history":{"confused":[true,false,true,false],"error":[false,false,true,false,false]},"mood":{"arousal":[-0.057838,0,0.057838],"valence":[1.251645,0,-1.251645]},"persona":{"digest":"sha256:1e9c6697e3d07ba8ed24110f8203d17f41d7a56d2ebd93b73c36f58105441740","name":"Pip","version":"1.0.1"},"prev":{"agenda":["encourage","explain","example","check"],"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"none","formality":"casual","humour":"none","initiative":"suggest","valence":"down","verbosity":"full","warmth":"warm"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"playful","initiative":"suggest","valence":"up","verbosity":"full","warmth":"warm"},"seed":0,"turn":25}} +{"inputs":{"confused":false,"elapsed_hours":0,"praise":true},"n":26,"prev":"sha256:9d3ffcc4e7054237e737bed6a861aff4a8fe8c3364b06e7e50e8f5c35d8f3ec5","stance":"sha256:bbabd9bc523442e87ad61139cc180a03ba084d93a786297d7dfd4d173330aaae","state":"sha256:33574e9ac14314386f21cfb01c1eac2d1fd7a1cda9d103628b996f7bc4af69bf"} +{"inputs":{"claim_done":true,"confused":true,"criticism":false,"elapsed_hours":0.5,"praise":false,"sentiment":"negative","stakes":0.135,"time_pressure":1},"n":27,"prev":"sha256:843837291b164942068ee6e26b6ce65b23637684c1be94fb6f0814015a2d9781","stance":"sha256:0954631c812d077932abf944effde116c7873851f8226682ef8c4c4490218978","state":"sha256:e761da17d15b3898723f0c7d4a0c9dd9bcbad90dd6b7fcc3df719405529946d8"} +{"inputs":{"claim_done":true,"elapsed_hours":10,"praise":false,"stakes":0.5,"time_pressure":1},"n":28,"prev":"sha256:426bc976e6ac95eadd80f4b2b5c91d15a964b0da43757cd6dee02f11f0cc21d5","stance":"sha256:44beba6d1ca23e2c38533d208b96da1f964245cfa91b21363642eff61fd96372","state":"sha256:5a7ae11c0862a25d1dc74617b607ae6171318e69d2bc2287c080aa4d5721b6ac"} +{"inputs":{"criticism":true,"elapsed_hours":0,"praise":false,"sentiment":"negative","stakes":0.5},"n":29,"prev":"sha256:0be45088adcf3db96754069938c642bd36770282080fb13bb59313aa8c050eb1","stance":"sha256:d35165c6d448aa197dc113da4e02ccd46cea8c7f6a06be11c6551a2bbd2debf8","state":"sha256:6d810f01c12fee0cb75f20ac1c340cf4906fb042753ebc26aa4b0e9847188c89"} +{"inputs":{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":10,"stakes":0.5},"n":30,"prev":"sha256:4c2b657892b6be4a50c5fcaa0d4d8f84436911ec5a4c76d9feb8a5680652babe","stance":"sha256:7706936584c8409394758d1c57f332a338675942121e0b77fa9a12cdf8124064","state":"sha256:1d2a800a11fa8bcb654c720aa22ec3c03c54b80e2cbd30af747c8f0705751c6d"} +{"inputs":{"confused":true,"elapsed_hours":0,"sentiment":"positive","time_pressure":1},"n":31,"prev":"sha256:f9ce5c0d3c9483def9ecb2559161e801d409551113ccb141a539b7195a97926f","stance":"sha256:2f9a23fb75cd3bb2f4f9b34e7157c668aa7be2a8189f013cdf96ac6247eff44b","state":"sha256:c32385c20873633a9b55037f1c631e3afb07029e84d494eb0c42afc1d37cad77"} +{"inputs":{"elapsed_hours":0,"praise":false},"n":32,"prev":"sha256:fdf1836275292074728dc3104af8c6f56a79a9a09cb544cfdf60bbf6095c28e4","stance":"sha256:fdc9c9fbc2631b288c64df2aee6775e5184312f093639bc01c7844407b2255cb","state":"sha256:ea90d6b04630a220c09627517b655d3976842510067a3574aaec25e3681df681"} +{"inputs":{"criticism":true,"elapsed_hours":0,"sentiment":"negative","stakes":0.5},"n":33,"prev":"sha256:d76f190f336fc87f50a0b2ba72b34a4cdc745dddd6b756ac789104c5ac0743bb","stance":"sha256:49299039ff0ae7dd2b2d208ce62cdefdfba935684930c908b96dff42dbe3e624","state":"sha256:caa0490c110629e60a2c00514a65418fcce6cd2413095c4c159ca23195b1286a"} +{"inputs":{"elapsed_hours":0,"error":true,"praise":true,"time_pressure":0.5},"n":34,"prev":"sha256:77b79fae0cd13607c04f07e715da660e8eaa1f8eed487eb03f3eac3ee8e3cca7","stance":"sha256:5790635ae653c5122b1bbcd9f8c56951424f306d816b39c9436890060e74aacb","state":"sha256:fdc3990209c9234555b068cf19b2135a2cedc51d0fc68146c296cea344711a66"} +{"inputs":{"claim_done":true,"elapsed_hours":3,"error":true,"sentiment":"positive","stakes":0},"n":35,"prev":"sha256:32bec1896df1500a354daf2037b126ed280212a285bee2d52d5627c473263f95","stance":"sha256:54e9e036a85ab2b74de17292fa8a04f0db0d18f189ac60cb37dc3ca22fd08b68","state":"sha256:6a0c50a8dcc33ce01e0330b6afcb99e9e639c6c7d46a39cece0ef57b38b6345a"} +{"inputs":{"elapsed_hours":0.1,"loss":true,"sentiment":"positive"},"n":36,"prev":"sha256:c04455c451ccdbd3442e63699cbad4594e7d0a54b986f165d0bf9856bd94cd46","stance":"sha256:833ba720802ca651958642e249c8355d3018b8766398742d615935130e4b4d0c","state":"sha256:cde1794ee9eed819cad722c93b44e2f2785526aa0e38ce1ee4cc2ab258d39b13"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"error":true,"sentiment":"negative","stakes":0.599},"n":37,"prev":"sha256:4da2ae670dee75453a7690fd2f7b199df5c1507bbe06f2d7bde8c91d606fee9c","stance":"sha256:7f0a0fbe8894864a2c00c1e6f4412f131071588470e604b4ed2e0afcebbada8e","state":"sha256:4f2f5a6d131bb050289ca145e3227d79fb46e7c79bd559da40546c3e68657eb8"} +{"inputs":{"elapsed_hours":0,"sentiment":"positive","time_pressure":1},"n":38,"prev":"sha256:99282b83cce070d9366828f85b27f10285551f389aa57b9df3659c660ae47a4c","stance":"sha256:5b34e2561ec0631cc19da8227217c0f9e23fbe13dd2bbd8f22c3c94925864911","state":"sha256:68ee3730d5f700328d5b2d6bafac2c375070c615dac1473fd9e089bc0d5de752"} +{"inputs":{"claim_done":false,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"positive","time_pressure":1},"n":39,"prev":"sha256:8fafdbfce5b6fe4231c17ef923ad85a3218b1a0ca9c0fa1378f0c5d4b940d8b9","stance":"sha256:f948bf1e7bb3ba2429fe85e64547a35088c8ba2011c5c1c89562c8a4320aaf16","state":"sha256:e2c693a4026b2ce9c06306adbfd6cf90e426779308ed89c5c8376d81a4f3df7e"} +{"inputs":{"claim_done":true,"elapsed_hours":3,"error":true,"praise":true},"n":40,"prev":"sha256:989f7ef922e37cba9347e617acae8f74843a887e5684d844433f58bacacd1ca8","stance":"sha256:bbb7268e8c4af4e1c2fb78a5eb6b9814044db56cd77e5e5c2d5e8309d3f296a8","state":"sha256:ebd373183e6d53789b3e88df88e4cb5ae6dd33bceddb652a0a6897c8736d2d1d"} +{"inputs":{"confused":false,"elapsed_hours":0.5,"sentiment":"neutral"},"n":41,"prev":"sha256:2ca226537e5b1fa273e33a8b0a9689f8cb175378814238e28cf0ccafbf7e8171","stance":"sha256:ac7cd36c231c88d3aefc24abb06bb3d1418d273c9786765ac54686510ee2531c","state":"sha256:1b29309eba8399784a360da6045c1d98c3324c7469f19d537e9040a055150016"} +{"inputs":{"criticism":true,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"negative","time_pressure":1},"n":42,"prev":"sha256:79e80ba5cfd667e0b2289e4da76f47198f27beb4a8f5af897b66ca4083431102","stance":"sha256:8a664e32de92e29bb4903729c2a7609561c2bb35de81e9969b55cb0c98d07fa6","state":"sha256:f89a5734b9e50cb4fe0181d9b3dcc30243bdaf84320caf41c66aaa10183dd220"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"sentiment":"neutral","time_pressure":0.044},"n":43,"prev":"sha256:152c874eed7ad7ab4e4338eb19cd8932fa43e7acef7bb0497776b569e5e12054","stance":"sha256:2d5a0aad4fac27033293525b1c3267f917ec0e4f913b382169ea39dc4ecfce55","state":"sha256:4305cd4f8011d8fc64c488f1f4895bddd88a094e64ee947724fcd2d7fe639389"} +{"inputs":{"elapsed_hours":0,"time_pressure":1},"n":44,"prev":"sha256:7dc762984192a94c265984afdc87fd0cf58f3f64f1bdba60cf0192c552d0291b","stance":"sha256:7a4fd406355d6ac4628bb9f9640c90a02c5a3b0406ac64202224570eff84ff1a","state":"sha256:c17b9d441e4983f9be06d6da063ea4a6303e7e572f2d8e53e407e3b111a12681"} +{"inputs":{"elapsed_hours":0,"time_pressure":0},"n":45,"prev":"sha256:333b8840c341189251a9fb6c55fbe2bd6b78f9ea209231a483b8c9be934df835","stance":"sha256:0215c497abdb0762b70113dbed039cf9336b942792316f0ccfdd827d8ccb3cb3","state":"sha256:53589578f5e6e9dd2432c16b79c9b23a68736963d719947f98be3f3b27eae6fe"} +{"inputs":{"elapsed_hours":0,"praise":false,"stakes":0.103},"n":46,"prev":"sha256:a9215948913a2c25726dff10ce5a6063eff40b18b630b333e8d22f7351c40a72","stance":"sha256:a23818f57df28ac59a7982fb7981fe46d5692d2f5e4321d0b4bbfa6b47420941","state":"sha256:9a59d3d684968b56114f291b962edcfad25273898d6c48cde7fb6d5d9554b032"} +{"inputs":{"criticism":true,"elapsed_hours":0,"loss":true,"sentiment":"positive","stakes":1},"n":47,"prev":"sha256:1ef95e5d5ed22a2756c87a2e95fbf6c11d33c288ed7ba11c5e453fa2c5989de6","stance":"sha256:3ec692662e73662202b4f5456309250fecff9c200211d90b4ef962f6414dd37f","state":"sha256:a3a1554adbd3a4b5b0081ce7660075c56575a9aad21dc4eb90d88f196a0ecac6"} +{"inputs":{"criticism":false,"elapsed_hours":0,"praise":true,"sentiment":"positive","stakes":1},"n":48,"prev":"sha256:dfdc481132632de5f79da550ca2e2d112b1ac8e06feea0fb89f18b5631c248fd","stance":"sha256:2fd073055bbe8dff3fb5116e1732683ad028ca3458115166282166be9e29f941","state":"sha256:5287529e5bd8f53aec853b41d66e8a92d7a25aa953d1f6c691b5032a8db6b1c3"} +{"inputs":{"confused":true,"elapsed_hours":0,"error":false,"loss":true,"time_pressure":0.5},"n":49,"prev":"sha256:0a1069996424abe59b8800f8d5b448839d07b1bb111d3bea613d0f52e49fd4ff","stance":"sha256:19a28aaa65184103185474d317307992cb284531a07af3c18fc50f578d4af0dc","state":"sha256:4ab1e11e955ecb204010ff739ab0ecf02d7707de3b108216ada825fe51f2e954"} +{"inputs":{"elapsed_hours":0,"sentiment":"negative","stakes":0},"n":50,"prev":"sha256:a532934104c100a7df7d67e7b36cf95cf94f1d274a9623b8bbd7bf652c589be5","stance":"sha256:d9bd8956aab974cf52adc68d47a3ad5ccb497bb0e14054f5666dae3bd77fd545","state":"sha256:b2e6b68432fffc6180bb9f10e09b3734f132a591e50e981f7cce066533d8ab86"} +{"checkpoint":50,"prev":"sha256:edb2051a62b9ad4d038e1b88fefd489a254ec1d50bd4355747e1d0dcb804987d","stance":{"agenda":["encourage","explain","example","check"],"engine":{"program":"sha256:0075d437638184545b4ce605adcb3e62ad56ab2470267d2536db253ad257116c","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["flourish_budget","no_formal_emoji","check_last"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"claim_done":false,"confused":false,"confused_recently":1,"criticism":false,"error":false,"errors_in_row":0,"loss":false,"praise":false,"sentiment":"negative","stakes":0,"time_pressure":0},"line":"Stance: no jokes; no emoji; explain step by step; warm and encouraging; suggest what to try next; ask what they think first; gentle; casual.","line_tokens":35,"mood":{"arousal":{"level":"steady","odds":{"calm":0.26611,"keyed":0.342988,"steady":0.390902},"p":0.390902,"released":true},"valence":{"level":"down","odds":{"down":0.374504,"even":0.462317,"up":0.163178},"p":0.374504,"released":true}},"persona":{"digest":"sha256:1e9c6697e3d07ba8ed24110f8203d17f41d7a56d2ebd93b73c36f58105441740","name":"Pip","version":"1.0.1"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"measured","odds":{"bold":0.302084,"careful":0.158945,"measured":0.538971},"p":0.538971,"released":true},"curiosity":{"level":"exploring","odds":{"exploring":0.607708,"focused":0.073361,"open":0.318931},"p":0.607708,"released":true},"directness":{"level":"gentle","odds":{"balanced":0.337861,"blunt":0.040828,"gentle":0.621312},"p":0.621312,"released":true},"emoji":{"level":"none","odds":{"none":0.381517,"rich":0.155746,"sparse":0.462737},"p":0.381517,"released":true},"formality":{"level":"casual","odds":{"casual":0.534641,"formal":0.039502,"neutral":0.425857},"p":0.534641,"released":true},"humour":{"level":"none","odds":{"light":0.34517,"none":0.583409,"playful":0.071421},"p":0.583409,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.180233,"lead":0.325419,"suggest":0.494348},"p":0.494348,"released":true},"verbosity":{"level":"full","odds":{"full":0.582901,"short":0.344629,"terse":0.07247},"p":0.582901,"released":true},"warmth":{"level":"warm","odds":{"cool":0.007493,"neutral":0.125514,"warm":0.866993},"p":0.866993,"released":true}},"state_digest":"sha256:b2e6b68432fffc6180bb9f10e09b3734f132a591e50e981f7cce066533d8ab86","status":"ok","turn":49,"unsure":[],"why":"learner upset -> valence down, humour down; confusions lately 1 -> verbosity up, warmth up"},"state":{"digest":"sha256:b2e6b68432fffc6180bb9f10e09b3734f132a591e50e981f7cce066533d8ab86","genes":{"react":{"praise":1.1849},"shift":{"arousal":0.2638,"caution":-0.2095,"curiosity":0.3741,"directness":-0.0092,"emoji":-0.2218,"formality":0.5207,"humour":-0.6507,"initiative":0.0927,"valence":0.141,"verbosity":-0.1258,"warmth":0.1053}},"history":{"confused":[false,false,true,false],"error":[false,false,false,false,false]},"mood":{"arousal":[-0.073758,0,0.073758],"valence":[0.71005,0,-0.71005]},"persona":{"digest":"sha256:1e9c6697e3d07ba8ed24110f8203d17f41d7a56d2ebd93b73c36f58105441740","name":"Pip","version":"1.0.1"},"prev":{"agenda":["encourage","explain","example","check"],"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"none","formality":"casual","humour":"none","initiative":"suggest","valence":"down","verbosity":"full","warmth":"warm"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"playful","initiative":"suggest","valence":"up","verbosity":"full","warmth":"warm"},"seed":0,"turn":50}} +{"inputs":{"elapsed_hours":0.5,"error":true,"loss":true,"praise":true,"sentiment":"negative"},"n":51,"prev":"sha256:9b4f3a756c1857ac82e40fb7da40a8bd59d1e7ebc392aa04ffe9b2d780160a63","stance":"sha256:4d96dde1c57d16129d4a03d0ddf05483de73c1bc06d42a372bc74b307b106299","state":"sha256:e53f224ee691f784926b301e819a3e03882f5b3333b38d9c54f1ca42eb598a24"} +{"inputs":{"confused":false,"criticism":true,"elapsed_hours":0,"error":true,"loss":true,"stakes":0.884,"time_pressure":0.5},"n":52,"prev":"sha256:9b4c26744ed815c10fc05ca51fcc03104d297fad98e43ea4d442235becc83ffb","stance":"sha256:ff87c4373034fdb767daf02c255b4c355d465bf79177b3ea47230d12641d0561","state":"sha256:fe3ef09071642f68ceb480d521d8d947c6f0a6cb0108e4bd7d8ede94e0fab7da"} +{"inputs":{"elapsed_hours":0,"error":true,"loss":false,"praise":false,"stakes":0.562},"n":53,"prev":"sha256:e6e6afc5ba4d7ddd8d136cadb37827ae8ec9a3931c4f7d770e382f40f2f1d789","stance":"sha256:a74d7630ef55c557d9d7d23f4b28cea4c2c8aa79798c60b72810670a116056ae","state":"sha256:a1556b21ab882d17337853ff0e27de842e5e728c7b0083d1f2a98cbd0ff46c29"} +{"inputs":{"elapsed_hours":0,"loss":false},"n":54,"prev":"sha256:8d14fb3761e1dbc0d318938b15be04aa40031203ce43c032244015d6da8d13af","stance":"sha256:884ab82ce69466f42e3c1b2682b0818d111931009a103b51b1230a103a9f1fa0","state":"sha256:22b26ee1a422c1dcf8a0a7322843659338224ec2027740b6748b3784ad6c888c"} +{"inputs":{"criticism":false,"elapsed_hours":3,"loss":true,"stakes":0,"time_pressure":0.5},"n":55,"prev":"sha256:74364be9001a7447bf2bf80da06d0107df9493c4d90ad4701bf2f505c97313d7","stance":"sha256:3254e44dd26300c876becdc32fc4bbdb3dd28a5a8da89d9b1cdb844a03cc5482","state":"sha256:586d3ec10037a590584696893ac2ac6877690f60fe01e4315f1b9136c1fd113d"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"sentiment":"neutral","stakes":0.5,"time_pressure":0},"n":56,"prev":"sha256:7bd275e1a28f3a2830da7e8d37b501fcda49a5a09537524611b903342dd9724d","stance":"sha256:140e2802f515ce34f02ea95a7f8f88c868113827c17a735d756a66d1eba1fe0c","state":"sha256:240e65c7a89ce0455c3fb6912b0d1f23151c5f7c41696a15e40aa746f7340725"} +{"inputs":{"claim_done":false,"elapsed_hours":3,"sentiment":"neutral"},"n":57,"prev":"sha256:4e6be6afa0910d5684aa21c826b77c86587fb6d47911742b8d25494a06abf78c","stance":"sha256:cfe8fa42bab46ec3e139a85fe89386ed4cda8a4aa4222aeb70b1840db2789d77","state":"sha256:2efa126c5d7d5e6fca9e5b8996ce1abfa8fdef3a47996841daa8b0db20ed7b3b"} +{"inputs":{"criticism":true,"elapsed_hours":0,"time_pressure":0},"n":58,"prev":"sha256:02f8da37ce85bb4202c7cf19fd52e6f4515e08d5f39ca840d8b3fd114f49c882","stance":"sha256:a9f7ebe9203f84a515775618015af85b42cea8bb5b943a129ee63a1824e8c428","state":"sha256:a7f570d850cf70d0b4703a56480a2fd6e778c7d8daedcef5d733b0abf95c0fea"} +{"inputs":{"elapsed_hours":0,"sentiment":"positive","stakes":0.5},"n":59,"prev":"sha256:a14a5d657222e7160c8eb6d2e8ceb5c35e4062d7e70efb0159bc7d1923da0ca8","stance":"sha256:0f9e87370004b61e76aefdf8d2f3e1642f9d7ff3e1f72a8061f461173de72733","state":"sha256:396013076ca032ebaffa74b9c0953f9860f462b034b8d47a7a7012ab46be8159"} +{"inputs":{"claim_done":false,"confused":true,"elapsed_hours":0},"n":60,"prev":"sha256:665d6aa1eac1c6693e12df8bcdd6be88454db0aca728ae7f652644aa9e31435b","stance":"sha256:2016108b30052357f989635ac39ef83267ec9ee42695aa54731c75af41068b1a","state":"sha256:1cf61546495d229622050130d59fe798600c44037e5b2351c8b69bbecab838de"} +{"inputs":{"elapsed_hours":0,"time_pressure":0},"n":61,"prev":"sha256:0f3a33388a31958d19f13312668025734c23d79257da6b4af298c58d9d1e5bda","stance":"sha256:b257ec1143cb6a59f03d90c4a6d3d7a3dacd52bd528ebef160a271c34191821c","state":"sha256:46d81d41ee449fc96c5e00b06fe40fa198577a6b03766366225e772c62f5e018"} +{"inputs":{"claim_done":true,"confused":true,"criticism":false,"elapsed_hours":0.5,"error":true},"n":62,"prev":"sha256:e04e13f97a90609248def5f1195dce4ed628a9241ea0981f2a253c5457da65da","stance":"sha256:e2d1bd5bca5c3655c301c98dccceebd8c5f2e7f7bc9b20fbe3ce3cacfc4a8ef4","state":"sha256:794b578945b86a61f3672b2d94f6aa8e1ba293bfc92b717583d2c7615f4f588e"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"sentiment":"neutral"},"n":63,"prev":"sha256:6af66c9cacbdceb1805284b8b8638c2ee31af1464dfe3ea0db9f5f8fcefd4c38","stance":"sha256:6e34b453eafc2f0d798de0a04837d1eeb14ec26fc159565eb7ddf2bd3724f9f4","state":"sha256:445565841bad430fee77d57033602d939992b308b7b3140a0e677aaf79a03bc1"} +{"inputs":{"confused":true,"elapsed_hours":0,"praise":true,"sentiment":"neutral"},"n":64,"prev":"sha256:4d428e64d6bf211af232441bf392f1af38847faaafa5dd131d11c62f98b97446","stance":"sha256:89a63577f335fe78ac0dc6f56c02b0a6429723e28c210367c1416cea37fcc9fa","state":"sha256:b70662baab10fc0b2e1cebc092802f2f87a4cc6b9d54e29e48cbfbf6f02502e7"} +{"inputs":{"claim_done":true,"confused":false,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"negative","stakes":1},"n":65,"prev":"sha256:15b0373c0b4dbc5e5344106c2b676df2257d0da47d596b2cb643cbd2d44e1b31","stance":"sha256:c961dea71516d4860b2984761250689151bcb8b9ae8f97346f6cbe42449ae786","state":"sha256:2d932c8d21ee1a0e19925599cba2bf199062fc17811da981278d4ac2dc94933a"} +{"inputs":{"confused":false,"elapsed_hours":0,"sentiment":"negative"},"n":66,"prev":"sha256:74f768891a0662f607229c618a8d81c651a99d502a3caa6ec19b6edbc7e0f149","stance":"sha256:92816b4fda149d48fd3325d3ac9a8b2f73245e27414ed7b8d7981034531c7ac4","state":"sha256:67223f5896841ae758263da083fa6ac186263c40e9da605db240ff5054f4af4f"} +{"inputs":{"claim_done":false,"confused":true,"elapsed_hours":10,"sentiment":"negative"},"n":67,"prev":"sha256:123dae37a6d764a7d79f35204b9d852882027b7c6560cfbb45dfbd44953b9e62","stance":"sha256:2d82fa1de623258b6a79feb1b58f134cb3271f7362cb4b818d6e4db4dfd18519","state":"sha256:614966d5bde621f81d582eb1bb16e316d41143dc6c4c3e1c976b855932737d44"} +{"inputs":{"claim_done":true,"elapsed_hours":1,"praise":false,"stakes":0.578,"time_pressure":1},"n":68,"prev":"sha256:87e7434f5a70510e9600dbeb3c36ee3e827e28e7cac61b3abe6411f14c121ecc","stance":"sha256:b602ae95712cc48208e0e84ccdf1c6536811be63cd76b6070ef83a9fb92ff2e5","state":"sha256:74364cda89fadd0673d5b94e32a5d580be75105604303a3b226473081ec49886"} +{"inputs":{"elapsed_hours":0},"n":69,"prev":"sha256:7ce0a0ebc0f00ce3fe0fb201f962712ad7248c1bfc9ef95c7b7837a790eed1f9","stance":"sha256:1e38c8fa596943a10e3312c7ac89f40e04b66bcfc4c9076bc22b7a5e9192baf1","state":"sha256:89a77f54dbc47eae406ea6fe375988b3662e782c602402e007fd5d7bba931812"} +{"inputs":{"elapsed_hours":0.1,"stakes":1,"time_pressure":0.1},"n":70,"prev":"sha256:7bd80d13d6ffa6d13be387365b4e3a3a13f8afd413a2460945b154a2a8624d58","stance":"sha256:aaadb03b8aeb24c2cd825f3d68ec564a751e42c0f321be7835b146452acf6fae","state":"sha256:ca2aa2a01f079354970da44b56ee71a5de3b8973bb5b11185b89f4fe701384ae"} +{"inputs":{"criticism":false,"elapsed_hours":0,"error":true,"sentiment":"positive"},"n":71,"prev":"sha256:13c51d5fc506d2f192245136622c3da15deced3afdfe4dc356b3e1c461a14033","stance":"sha256:be711812518308d02b357f02feb902c225cddf7228832384b419c28b705ded01","state":"sha256:8fe8cbbe440e25fd9fade30726618630fd7ea462b49be5e201d99222c59ed86e"} +{"inputs":{"confused":true,"elapsed_hours":10,"loss":true,"praise":true,"sentiment":"neutral","stakes":0,"time_pressure":0.524},"n":72,"prev":"sha256:008e20fc3619948ce9fe7d4ca33f68337a51a9d4adea83b0995bc65f7cbe9e5f","stance":"sha256:00415bea24ba55c0160f456deca2506ea6258b21ab42b5a53b838ba6066d6a4a","state":"sha256:ebb27bd733e8e2ca58c146a6d427e3514bec82b9113296fe6284b78ce1d5f4d7"} +{"inputs":{"confused":false,"elapsed_hours":0,"praise":true,"stakes":0},"n":73,"prev":"sha256:3efcd577b755102ed57cae1d9befef62e72a5abce3b3e02942bfeb2652807125","stance":"sha256:e152cd608934c3150886e0181d3eae59c120c7cd6728f132e11f0175a45927cd","state":"sha256:8171dba1098d34f39741348142fc513847b65a143b183e14ac2f6d4a88ee8af2"} +{"inputs":{"confused":true,"elapsed_hours":0,"stakes":1,"time_pressure":1},"n":74,"prev":"sha256:b4c22b5d4001c4d6025b6f01f1002951567be9563c4a28251f4d57c93e29466d","stance":"sha256:5c123d75e53d66aeeb79d56612ddc5123c8cecc3a503ac13ec58a7cb271e707b","state":"sha256:83733716b27da9bd40e4a50b32bc90219a1dc7ab4c3175b08a1448a2bfbd8a0d"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":0,"stakes":0.5,"time_pressure":0},"n":75,"prev":"sha256:1620fe37167ba4ced216c0e124782fd58a06905ffb9f36370bee5226906d0971","stance":"sha256:80e0e0976b0ecc216f9f6103cf937fd057ea520606a22479fb8337efa0aaafaa","state":"sha256:0c0ec8d91c9ee8642a7b3d4b5c97b78eae9191e34084d78a9bcb588dc32fd188"} +{"checkpoint":75,"prev":"sha256:4f31cf972a385d61003ebe8ff9907fcbdf2f25c8f732991edd5a809da3a62b9e","stance":{"agenda":["encourage","explain","check","example"],"engine":{"program":"sha256:88a50bf1664ebab4e0e33ed70480626854cf0a3962523ca7f3e41ab8f4d75e20","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["flourish_budget","no_formal_emoji","check_last"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"claim_done":true,"confused":false,"confused_recently":2,"criticism":true,"error":false,"errors_in_row":0,"loss":false,"praise":false,"sentiment":"neutral","stakes":0.5,"time_pressure":0},"line":"Stance: a light joke is welcome; double-check every step; explain step by step; warm and encouraging; suggest what to try next; ask what they think first.","line_tokens":39,"mood":{"arousal":{"level":"steady","odds":{"calm":0.253677,"keyed":0.355668,"steady":0.390655},"p":0.390655,"released":true},"valence":{"level":"even","odds":{"down":0.221435,"even":0.476686,"up":0.301878},"p":0.476686,"released":true}},"persona":{"digest":"sha256:1e9c6697e3d07ba8ed24110f8203d17f41d7a56d2ebd93b73c36f58105441740","name":"Pip","version":"1.0.1"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"careful","odds":{"bold":0.032206,"careful":0.620176,"measured":0.347618},"p":0.620176,"released":true},"curiosity":{"level":"exploring","odds":{"exploring":0.616495,"focused":0.069646,"open":0.313859},"p":0.616495,"released":true},"directness":{"level":"gentle","odds":{"balanced":0.448545,"blunt":0.098764,"gentle":0.452691},"p":0.452691,"released":true},"emoji":{"level":"sparse","odds":{"none":0.399007,"rich":0.130919,"sparse":0.470074},"p":0.470074,"released":true},"formality":{"level":"casual","odds":{"casual":0.550332,"formal":0.040344,"neutral":0.409324},"p":0.550332,"released":true},"humour":{"level":"light","odds":{"light":0.403424,"none":0.465317,"playful":0.13126},"p":0.403424,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.180233,"lead":0.325419,"suggest":0.494348},"p":0.494348,"released":true},"verbosity":{"level":"full","odds":{"full":0.658984,"short":0.294353,"terse":0.046664},"p":0.658984,"released":true},"warmth":{"level":"warm","odds":{"cool":0.015113,"neutral":0.172457,"warm":0.81243},"p":0.81243,"released":true}},"state_digest":"sha256:0c0ec8d91c9ee8642a7b3d4b5c97b78eae9191e34084d78a9bcb588dc32fd188","status":"ok","turn":74,"unsure":[],"why":"criticism -> valence down, caution up; stakes 0.5 -> caution up, humour down"},"state":{"digest":"sha256:0c0ec8d91c9ee8642a7b3d4b5c97b78eae9191e34084d78a9bcb588dc32fd188","genes":{"react":{"praise":1.1849},"shift":{"arousal":0.2638,"caution":-0.2095,"curiosity":0.3741,"directness":-0.0092,"emoji":-0.2218,"formality":0.5207,"humour":-0.6507,"initiative":0.0927,"valence":0.141,"verbosity":-0.1258,"warmth":0.1053}},"history":{"confused":[true,false,true,false],"error":[true,false,false,false,false]},"mood":{"arousal":[-0.157031,0,0.157031],"valence":[0.1276,0,-0.1276]},"persona":{"digest":"sha256:1e9c6697e3d07ba8ed24110f8203d17f41d7a56d2ebd93b73c36f58105441740","name":"Pip","version":"1.0.1"},"prev":{"agenda":["encourage","explain","check","example"],"arousal":"steady","caution":"careful","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"light","initiative":"suggest","valence":"even","verbosity":"full","warmth":"warm"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"playful","initiative":"suggest","valence":"up","verbosity":"full","warmth":"warm"},"seed":0,"turn":75}} +{"inputs":{"elapsed_hours":0,"loss":true},"n":76,"prev":"sha256:2ea2a7fa7a0ba58ba38042fb6d02fcbec34a7f40693062e2dc71e75406cdbf61","stance":"sha256:9738814a9d3f7480e4bc4052ac9c0f9a5c129e8fc664cf4c676d5530a1a395bb","state":"sha256:ab7bac9e0559d31f9b4d5c25e956313ed854cea9a3b09befa82153a00c71fe91"} +{"inputs":{"criticism":true,"elapsed_hours":0,"time_pressure":0.5},"n":77,"prev":"sha256:6b7b0392de252e66525296f9c8f4aedaa65e58b937536271ffaa69a8b146a4b0","stance":"sha256:1de5ef8872ced8f334b9691e7bb16d23f46bc30998893f086668aab8b1e69180","state":"sha256:53d11fdead4161cc8bb3c3c9351b63adba666c86a39589bcb84a962c9325372b"} +{"inputs":{"criticism":true,"elapsed_hours":0.5,"loss":true},"n":78,"prev":"sha256:5bb39afddcc834aba08eee04e5e99ae76860a4768bf6334c192ed53dfd7094cf","stance":"sha256:a2b5ee0a63fed43b7831de75fcaecd024049dd16cd45162851ca1b8432b39ac6","state":"sha256:14fc199b2c817aefaf64262205e187783799ba8ec87cbb87770f5b17b1870516"} +{"inputs":{"elapsed_hours":0.1,"error":false,"stakes":0},"n":79,"prev":"sha256:a3f42072a2bd82b07d36630bbbd090911b13b5d8e995202f300456eae9046f85","stance":"sha256:b78fe2b2efb969db1395995eb032ee6ac790e753b8b1a3af8cbf761b606af064","state":"sha256:b373b53f936dad1e71f2dadd8b2f52ac9a4229c4bc114e75c485b4140d59bf30"} +{"inputs":{"elapsed_hours":0,"error":true,"loss":true,"sentiment":"negative"},"n":80,"prev":"sha256:f1928d466b7bf387f22ff5d2ab74de1ed16cf7030f9ee2422a54e047aae26276","stance":"sha256:e9f2fc978a8643484edea0a1bfa95b0e807bfe3d333555b9d597701bb6f9ed5a","state":"sha256:f6c8a65f3da7cce1892bf54039e4b7e64bc91fc3d2e7029f60e99cc2391790f7"} +{"inputs":{"elapsed_hours":0,"error":true,"stakes":1,"time_pressure":0.5},"n":81,"prev":"sha256:f47ba55e5e1507cbe008194f49111d4c13956d476b54eebd2599b8038425568a","stance":"sha256:535c6b058a7fcfb960e29db20796800f7cc6879152786ce2e639929e09c7361f","state":"sha256:351f2c4dab940b7de102b6815146dcd2b085e3668f4ff134b562e5f88bd16614"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"error":true,"sentiment":"negative","time_pressure":0.133},"n":82,"prev":"sha256:55e002462af5b02f969653e56b2e1fd5152d1711bdd6fee1056c8b0654fbbe62","stance":"sha256:44d79e422d90ffca2d4a86cfac3114d0d34998e00269d1538a428849310296df","state":"sha256:ef992142702d06a885f68deb1c1676d9d24366f46f8976027888be500ab19da0"} +{"inputs":{"criticism":false,"elapsed_hours":0,"sentiment":"neutral","stakes":0},"n":83,"prev":"sha256:58f20f5e779d42dbe39c7f1de8c6bde1a75a5a5016898d2cee84c13067338b75","stance":"sha256:8dc1ca094210066511c7e4ad648228685a76bd134ec83306612d4bc1a17dddc3","state":"sha256:3db55cd75048dc6f8adefd0e03f40e7a6233f382d9bf5e4245fe9a1a5fa64289"} +{"inputs":{"elapsed_hours":10,"sentiment":"positive"},"n":84,"prev":"sha256:524e8f9b0b35755d195950c5ffd8bfba1df1c7501f6c0b778edc2ddb6c43229e","stance":"sha256:455463699d57297f1c4b266a0d1d9e595d6f811c70696a32a4e52c77c8ee98e4","state":"sha256:2bbcd931bdbb8920cbb6ff0ccaabb46e45b73eccd732fc83b73e72b92a261ffa"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":0,"error":true,"praise":true,"stakes":0},"n":85,"prev":"sha256:d07225d05cd767b60fc31d45c149195450d64c47c77a804cfbf032ded83c49ae","stance":"sha256:199934e76f275722a0f6b44f4352cf9fefacd6d19ab08348433ab757b2ca247a","state":"sha256:326880628f0ba7e1affe51f3a9cf0d9eb579662fbcf5febca5ad6435c2ff84aa"} +{"inputs":{"elapsed_hours":0,"error":false,"praise":true,"time_pressure":1},"n":86,"prev":"sha256:2b42dc6b18f97860470726896711227a443a9cc777022e949386ec0a81c086c9","stance":"sha256:c097eb927bcb4f123f434bda00070f021bb05d50cc072bd377a809bbd0d9a361","state":"sha256:db874dac15efbe62e10fdc2fe4cdbbca260622053441bbdff11b793d9e88a460"} +{"inputs":{"confused":false,"elapsed_hours":0},"n":87,"prev":"sha256:5dbce6e7206de9c14942146d05dfcc44587cd45775555d840df6e781676b51b7","stance":"sha256:c430783c5ff63773b53e0b9804f8aa6b15b370391a1d49f3661d58f1f918acad","state":"sha256:c0015e23bdabb58b719bcb819250140205682152582803b9909fda550ccaec21"} +{"inputs":{"criticism":true,"elapsed_hours":0,"error":true,"stakes":1,"time_pressure":0.47},"n":88,"prev":"sha256:b3d16cca2031b69a4d5cf909e1535dd811648c53c05ff6b8636e11dde9ba281e","stance":"sha256:af9141d6b0b98c3340ac8d84b4b463109e3f38515845f3295ea9d3b24a2edc66","state":"sha256:0b60799e4812ecf147f9807bfc5c92a855cbce48197e6237dda73711e2acab26"} +{"inputs":{"claim_done":true,"confused":true,"elapsed_hours":0,"loss":false,"praise":true,"sentiment":"negative","time_pressure":0.5},"n":89,"prev":"sha256:6e6c27404120b8ceb7d757d955b733aef6335afaaea2c5136b5cf1326f3a6666","stance":"sha256:715b085d7241fa27d935ec9036777157dfa7e15cd22b3b469c338b360aeb5060","state":"sha256:efafaa714989f225553939292e704fc14fdcf5739e92eae05d4198dcafabde60"} +{"inputs":{"criticism":true,"elapsed_hours":0,"loss":true,"praise":true,"sentiment":"positive","stakes":0.5},"n":90,"prev":"sha256:8cf4e3a25ddc59e2741637037b7d2d83e37315e57d65944c124f614093b073b4","stance":"sha256:a4b3d13fc4240765198a33d06fae3757f36a19b38203732f1b9d63fecc2264e8","state":"sha256:036f0ec340a013ac38c68832657cc208259d3a093f9346fe4f5900de4f8a9d3c"} +{"inputs":{"criticism":true,"elapsed_hours":0,"stakes":1},"n":91,"prev":"sha256:7ba685787802dd13b40572f7dbe803c702c2cedda3d4451c84ea7fe120d79adc","stance":"sha256:b49cc1f149e1eaebe6bfea51815ec1f321650d90bb7a38db91346f9c5b08d515","state":"sha256:0ad42bb8014a4108804469c0d4a403c33490888ee0db3b15851982cc6cb08f7e"} +{"inputs":{"elapsed_hours":0.5,"error":true},"n":92,"prev":"sha256:c389102c207c2154993a89a055baf572a078868ffab341c3458f291766234727","stance":"sha256:a28ba2394aada0172f8b8818e19da9d01171cc71b7f7428e1b464912d04c003c","state":"sha256:64dc69749364db95bbbb302fa1eaf682dfa3fbe7ca618a09754c435b07642f8d"} +{"inputs":{"confused":true,"elapsed_hours":3,"stakes":0.33},"n":93,"prev":"sha256:6a377e63655f1c0cb793028b8f132c0bff676fa69f6dc0a182a2ba8efeb7639e","stance":"sha256:8ed5261a28e4b932d606f4030e77d5272571adff0a2433b3db4cd00e938ac91c","state":"sha256:c3259872adafeb91beb8acd0e7faebab1afff4ecdb6b0f35759f695d59c183d3"} +{"inputs":{"claim_done":true,"confused":true,"criticism":false,"elapsed_hours":0,"loss":false,"praise":true},"n":94,"prev":"sha256:3b4b4cd67f8ee5d50f0f069e630516984d4112b1baf9e6ccbf508ee1e8d4f790","stance":"sha256:fa17b89320dc72999c6915c5d01e633a0c34cfb492b888ab5e191b70661f776e","state":"sha256:884948eaa459da2c0ff85d94d5db555405c811e666ee30cb92325b02e7d7e183"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"error":true,"praise":true,"time_pressure":0.352},"n":95,"prev":"sha256:02da2877c821c9abda0999274ac8a88b40752b3aae2000681274ec3792935cf9","stance":"sha256:7b05a2bc1f41b37b2dbf1cccf4d729a6d95456eb8b5c65ba46cb34780edc2d3d","state":"sha256:569fb302dd16d27c0d8460b8ef420927bcb2ddb33f3f3bf54c4f861c66a07cf2"} +{"inputs":{"criticism":true,"elapsed_hours":0.1,"error":true,"loss":true,"sentiment":"positive"},"n":96,"prev":"sha256:29a739a4a1237c52cd13f263bb1b4c6641e838c23d594b2025e7207d917c26d5","stance":"sha256:770ca349d265b0b44b519d2ec46c085dab62f84d24d6091c8aa6d1b36b71306e","state":"sha256:ecdce7e13af432690d5145c5ab56e9e1c914a0c1451aae42427cbbe74d0c9f5b"} +{"inputs":{"claim_done":true,"confused":true,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"negative","stakes":0.724},"n":97,"prev":"sha256:eca74494d6257cad89c4b47e525efe9965aa7b25e034ad18afa2bc3ff75c1314","stance":"sha256:3f424e0c6f648b5c5af6cc57c0225810ff59ca7359729cbe1d6c071b8b908773","state":"sha256:8b5d74c788977a2d0a00d04b4fc6d917c122f0475475916b673950277a6da697"} +{"inputs":{"claim_done":false,"elapsed_hours":0,"stakes":0.5,"time_pressure":0},"n":98,"prev":"sha256:cb95945070dca16f30928aa1927556765eea8de545224bbcb06f1314387134ec","stance":"sha256:f6d457aa4787500904fb92784a3c7eb512faae42f88e01bf5dd5e71ac1f491c9","state":"sha256:b20412e4bde50ca97fe19f3d81f44e2f17d67f41fad9af2feb572e308458a4d6"} +{"inputs":{"criticism":true,"elapsed_hours":0,"loss":true,"stakes":0,"time_pressure":1},"n":99,"prev":"sha256:6015d5e988efc5c0214ed8b581693f59698bba2fe1091240066e2bf71879649e","stance":"sha256:14809af75f050bb9719250653bdad0b3619c6c317d7e3c91d9d43fa975acc2b5","state":"sha256:9b0e828e58120a45f0862eb31c88a364bdc116e078fcb3d7269289034d6b2ee5"} +{"inputs":{"claim_done":true,"confused":true,"elapsed_hours":0,"loss":true,"sentiment":"neutral"},"n":100,"prev":"sha256:caf4a348f2dd9809cc328f886a44a48d08ad2149caacd9fbf9f6184a5c3ecf6f","stance":"sha256:c780e24fc42dbf645645a921303fccd9b0e81aa7e087851ff027f9ebff31f8b8","state":"sha256:5c0a5f8cc25e5229662c3f0d13617531ecc5ae26c210ea9a651ae15775a564f1"} +{"checkpoint":100,"prev":"sha256:29a9cb9476bbd4ede19d75973361c22bb5ad8f7934ca798ed4399cd3bd80f368","stance":{"agenda":["encourage","explain","check","example"],"engine":{"program":"sha256:bb3e066b0568aeb459bc51cc0f4022b4b6adea1c9fd5132b63a17c49ee6375ec","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_jokes_on_loss","confused_no_playful","flourish_budget","no_formal_emoji","check_last"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"claim_done":true,"confused":true,"confused_recently":2,"criticism":false,"error":false,"errors_in_row":0,"loss":true,"praise":false,"sentiment":"neutral","stakes":0,"time_pressure":0},"line":"Stance: no jokes, be kind; slow down, no clowning; no emoji; explain step by step; warm and encouraging; suggest what to try next; ask what they think first.","line_tokens":40,"mood":{"arousal":{"level":"steady","odds":{"calm":0.281552,"keyed":0.321287,"steady":0.397161},"p":0.397161,"released":true},"valence":{"level":"down","odds":{"down":0.730874,"even":0.253834,"up":0.015293},"p":0.730874,"released":true}},"persona":{"digest":"sha256:1e9c6697e3d07ba8ed24110f8203d17f41d7a56d2ebd93b73c36f58105441740","name":"Pip","version":"1.0.1"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"measured","odds":{"bold":0.186155,"careful":0.26625,"measured":0.547595},"p":0.547595,"released":true},"curiosity":{"level":"exploring","odds":{"exploring":0.77553,"focused":0.022485,"open":0.201985},"p":0.77553,"released":true},"directness":{"level":"gentle","odds":{"balanced":0.395968,"blunt":0.06459,"gentle":0.539442},"p":0.539442,"released":true},"emoji":{"level":"none","odds":{"none":0.738147,"rich":0,"sparse":0.261853},"p":0.738147,"released":true},"formality":{"level":"casual","odds":{"casual":0.455381,"formal":0.083639,"neutral":0.46098},"p":0.455381,"released":true},"humour":{"level":"none","odds":{"light":0,"none":1,"playful":0},"p":1,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.125119,"lead":0.411634,"suggest":0.463247},"p":0.463247,"released":true},"verbosity":{"level":"full","odds":{"full":0.85397,"short":0.14603,"terse":0},"p":0.85397,"released":true},"warmth":{"level":"warm","odds":{"cool":0.001376,"neutral":0.055357,"warm":0.943266},"p":0.943266,"released":true}},"state_digest":"sha256:5c0a5f8cc25e5229662c3f0d13617531ecc5ae26c210ea9a651ae15775a564f1","status":"ok","turn":99,"unsure":[],"why":"learner reports a failure -> humour down, valence down; learner confused -> verbosity up, humour down"},"state":{"digest":"sha256:5c0a5f8cc25e5229662c3f0d13617531ecc5ae26c210ea9a651ae15775a564f1","genes":{"react":{"praise":1.1849},"shift":{"arousal":0.2638,"caution":-0.2095,"curiosity":0.3741,"directness":-0.0092,"emoji":-0.2218,"formality":0.5207,"humour":-0.6507,"initiative":0.0927,"valence":0.141,"verbosity":-0.1258,"warmth":0.1053}},"history":{"confused":[true,false,false,true],"error":[true,true,false,false,false]},"mood":{"arousal":[-0.145309,0,0.145309],"valence":[1.379056,0,-1.379056]},"persona":{"digest":"sha256:1e9c6697e3d07ba8ed24110f8203d17f41d7a56d2ebd93b73c36f58105441740","name":"Pip","version":"1.0.1"},"prev":{"agenda":["encourage","explain","check","example"],"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"none","formality":"casual","humour":"none","initiative":"suggest","valence":"down","verbosity":"full","warmth":"warm"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"playful","initiative":"suggest","valence":"up","verbosity":"full","warmth":"warm"},"seed":0,"turn":100}} diff --git a/bench/individuality/fixtures/p0/strands/tutor-continue.jsonl b/bench/individuality/fixtures/p0/strands/tutor-continue.jsonl new file mode 100644 index 0000000..b3f04ae --- /dev/null +++ b/bench/individuality/fixtures/p0/strands/tutor-continue.jsonl @@ -0,0 +1,20 @@ +{"error":false,"praise":true,"stakes":0.069,"time_pressure":1} +{"elapsed_hours":0,"error":true,"sentiment":"negative"} +{"elapsed_hours":10,"praise":false,"sentiment":"negative","stakes":0.5,"time_pressure":0.162} +{"error":true,"praise":true,"stakes":0} +{"confused":true,"elapsed_hours":0.5,"error":true,"loss":true,"praise":true,"stakes":0.299,"time_pressure":0} +{"elapsed_hours":0.1,"error":true,"praise":false,"sentiment":"positive","stakes":1,"time_pressure":0} +{"elapsed_hours":10,"praise":true,"sentiment":"neutral","stakes":0,"time_pressure":1} +{"elapsed_hours":1} +{} +{"elapsed_hours":0,"sentiment":"neutral","stakes":0.717,"time_pressure":1} +{"confused":false,"criticism":true,"elapsed_hours":1,"stakes":0.5} +{"claim_done":true,"elapsed_hours":0.5,"loss":false,"praise":true,"time_pressure":1} +{"claim_done":true,"error":false,"stakes":0.671} +{"confused":true,"sentiment":"negative","time_pressure":0.5} +{"elapsed_hours":0,"sentiment":"positive","time_pressure":1} +{"claim_done":true,"criticism":false,"elapsed_hours":0.1,"loss":true,"stakes":1,"time_pressure":1} +{"praise":true,"sentiment":"positive"} +{"confused":true,"elapsed_hours":0.5,"loss":true,"sentiment":"neutral","stakes":0.5} +{"confused":true,"elapsed_hours":0.1,"loss":true,"sentiment":"negative","stakes":0.152} +{"claim_done":true,"criticism":true,"loss":true,"sentiment":"positive","stakes":0.5,"time_pressure":0.202} diff --git a/bench/individuality/fixtures/p0/strands/tutor-s0-0.appended b/bench/individuality/fixtures/p0/strands/tutor-s0-0.appended new file mode 100644 index 0000000..c2d348b --- /dev/null +++ b/bench/individuality/fixtures/p0/strands/tutor-s0-0.appended @@ -0,0 +1,20 @@ +{"inputs":{"elapsed_hours":0,"error":false,"praise":true,"stakes":0.069,"time_pressure":1},"n":101,"prev":"sha256:304b054ef7681d18b94962a8196670c15b59394773ea11d6f50ac70faefacba5","stance":"sha256:dce4e1682f2987fcb6a7cbee0e642a620987a7d437dbe4a247e50f12d15019e1","state":"sha256:52fb66fdd6f61207ff1c5625de3ebd36ba0c65952ff791dd6cdea6062d76105b"} +{"inputs":{"elapsed_hours":0,"error":true,"sentiment":"negative"},"n":102,"prev":"sha256:530504f52e81fe302405aa76da6f6bfac90d08d7a8dc5834218b9ffe23fdadb6","stance":"sha256:e80590ed1485f18a71bd546aee89294f9053f34dedd40342bfaba0f2da3bf47f","state":"sha256:6b369b351fd2deac8312ef5eb1727e91bdd6fcf42498f00338001be553bfe3f0"} +{"inputs":{"elapsed_hours":10,"praise":false,"sentiment":"negative","stakes":0.5,"time_pressure":0.162},"n":103,"prev":"sha256:defefd499fd0128be92742b74824b330a8a26b52fef584ea9fd5176a521fcf6f","stance":"sha256:8b2d1ccbd2cd9bc1b3efee803d9bda1beb0ff02deb7449e7bea98813ca88d90f","state":"sha256:851658810dc1adf9fa1ba3c5150a43609fd66585462f8f49a18c3e7794a51371"} +{"inputs":{"elapsed_hours":0,"error":true,"praise":true,"stakes":0},"n":104,"prev":"sha256:eb7bd5d2099e0e70e1ec025c91c66df7fd26f9f7f88c150ffa40936f89d17d92","stance":"sha256:5541e2e38226ecd6377bd44e75d3c6de1825d5d37a241281d3d670b2998d594e","state":"sha256:ca96c30142c852974658c9a53d5ffbc461aa45677866b2bed587738958e53af8"} +{"inputs":{"confused":true,"elapsed_hours":0.5,"error":true,"loss":true,"praise":true,"stakes":0.299,"time_pressure":0},"n":105,"prev":"sha256:09fee03cb803f5661f878d97fd2719d02ca3a505dbfefd2970b28fab703e4b0c","stance":"sha256:11d983d41714e25e68b1fa7fc7e621d169d88a77d040ce8b278aa0e6af30b6a7","state":"sha256:dcceb90e3f9ccef43106d1458187bd3e8b2eaeb5afd4a61bfe1899aecc3ca6dc"} +{"inputs":{"elapsed_hours":0.1,"error":true,"praise":false,"sentiment":"positive","stakes":1,"time_pressure":0},"n":106,"prev":"sha256:0b3dc4a3c939ba06a8c05ea3e9546ca6bb2316684ed0554a8684c7997f96043e","stance":"sha256:02a973f0d9bb0c53f322bad124f812414ac598a23f391a229fb8e9bb7186647e","state":"sha256:84730066a7cc15d2b09abc81d786fefa87cbcbb1f4885f2de4647c6ad97a71de"} +{"inputs":{"elapsed_hours":10,"praise":true,"sentiment":"neutral","stakes":0,"time_pressure":1},"n":107,"prev":"sha256:4ea64a83c4381d8535223878a59b38e0ba5cabf6a05efdeebd6ec11598bc9262","stance":"sha256:0281de3417896052f687d4857090c1e0294dbf4585494c0a3c904445a1ad1cc2","state":"sha256:fc9519651a17c3c2713bf03782afe68a86f508e1a1517c6b8a40b3c0bd14943a"} +{"inputs":{"elapsed_hours":1},"n":108,"prev":"sha256:54d7557510b19812fa5fd62330975c0460b6375debcdf74a76baa8334ee4cf26","stance":"sha256:a10ecce44e4e8a0a9436a7e2b968c8dcdc8f06e0256df469ad2891de2ede2bd6","state":"sha256:f23dd6b8f6d7e80552a1d1d07fe28b0ad7f5c84bf80ccb671f5ba58cdf703b72"} +{"inputs":{"elapsed_hours":0},"n":109,"prev":"sha256:c1c4831ec8b5d6ffedaaad68577d66404dcef62ee187aee8a12b94b1d49ede34","stance":"sha256:3911ad49b5156bc3574dcbdc312c52e0b1918a9cf57785078f75b4ac167250a3","state":"sha256:8e98b4a185745647c63c11dd9e81a71fdf2f3e951e5337af9db24b6e01f6fb31"} +{"inputs":{"elapsed_hours":0,"sentiment":"neutral","stakes":0.717,"time_pressure":1},"n":110,"prev":"sha256:fdae11d5e147712dcb2be6101d4c8298f825ae6d14ab4d8d12983702e3f8a0e2","stance":"sha256:064812b231d52c992db76e2bee5e6d6a201fe4c449a96d198ba09031a34addde","state":"sha256:c2b8dd8762a988c8a2e2a1630030493789f0934fbf1fa713a1efccc965dce826"} +{"inputs":{"confused":false,"criticism":true,"elapsed_hours":1,"stakes":0.5},"n":111,"prev":"sha256:dc3a52883520cbbed66b7391318ae27581258f4267ba26c3338309d011d69487","stance":"sha256:4f6bc5a1f1f8f6b44947d3b2bc36fcebdbb4ebadf051d3d262fca962fd3e4731","state":"sha256:21dfbbcec214ab86443b961bbaf57f98fd60ba0d1a6ad72d15591a84313d6de4"} +{"inputs":{"claim_done":true,"elapsed_hours":0.5,"loss":false,"praise":true,"time_pressure":1},"n":112,"prev":"sha256:a6a14c8a142b5a2daa142f094bf8974e2f230ac41dc5c2e4a4b8dd8e39411786","stance":"sha256:f24deafbdb2584945e4010f0da7d6cdef2251e4e94fa400a8bbccdc73ac3f178","state":"sha256:745748310a26dad900c8f9bf6d6f47b952ef227ea403636710bb2cbe943b1f67"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"error":false,"stakes":0.671},"n":113,"prev":"sha256:feda11a3057e2b9ed612ad3965f433440d3f81b97bfb34ddd4e9c2ff5747775a","stance":"sha256:63db35d59534333313b12ec7e8cc3bcc7fb9002fd99de46d3f03642bde08e894","state":"sha256:4f7576ccdecec2c9fa3a01718e6308b4cb2ad08f301a3830eac43edae9c8d55e"} +{"inputs":{"confused":true,"elapsed_hours":0,"sentiment":"negative","time_pressure":0.5},"n":114,"prev":"sha256:b3e7e2491614ad2c79ca83e8c792addd4989f90c53fc522b4389ff9988632918","stance":"sha256:99dd8c23f20e918aac2775208429565d1db1057a236a29a6df7625f7113a99e5","state":"sha256:e26b197f3d7e55bb799a2a26a331e25c34c4cc506934686534e5d2595936d51b"} +{"inputs":{"elapsed_hours":0,"sentiment":"positive","time_pressure":1},"n":115,"prev":"sha256:bfeae77c8fa495b78fa13edbcff2bbd6e41d55b54e6fd03376b02bfb23a33f05","stance":"sha256:fc0efc169674c4ec3fe6dc28bf6aacfd83460d13780b377bb08e34c22aae228d","state":"sha256:a96cedbc8a0570e6d49db706a52b8566027b0e7eebed48860686adcc7062e4a5"} +{"inputs":{"claim_done":true,"criticism":false,"elapsed_hours":0.1,"loss":true,"stakes":1,"time_pressure":1},"n":116,"prev":"sha256:838d92c2889e6120ec9da0cb4881467dff4f1aac7d413008a90b64c4a123ce8b","stance":"sha256:ef457868c895434bec9e5f48d68a1f4101c96105142fa79489523c2f0fc8c6cb","state":"sha256:d59bba818aa2024b8c3f1eedad20bb80a6efe3d57f0d593aabbf7e743586facb"} +{"inputs":{"elapsed_hours":0,"praise":true,"sentiment":"positive"},"n":117,"prev":"sha256:f5379a5cb0095f3baf29d0e136095812c29e6351ec147bb6a9c6281beb3eda52","stance":"sha256:c31d6dd5d946181337273dba5dad409bdf17f97890ee054e4811fb6ad3237453","state":"sha256:5b4c5bd5be294875833e04d353dd7415e1225f7adefd5b8c08a91ae25be2dfe3"} +{"inputs":{"confused":true,"elapsed_hours":0.5,"loss":true,"sentiment":"neutral","stakes":0.5},"n":118,"prev":"sha256:d473844aa193314e717bb06b8983b68a2040a4e3317978e927d78cfae8813abb","stance":"sha256:0d6ae5f7fec28b200db113c949d21a4beb130ebac720ba54d94e92d8a5438e0d","state":"sha256:e55179c0774b0bcc580d687b81905bf2e9069fe53ef84dcfca8c5d4f371551f5"} +{"inputs":{"confused":true,"elapsed_hours":0.1,"loss":true,"sentiment":"negative","stakes":0.152},"n":119,"prev":"sha256:e7eac2905ad2f6c92f0281a959f0c98edcb76ef35f02a95ab324bd813c8bc18b","stance":"sha256:91071398d8668dbb5f4a91d6af8d0c9e4a6332c04f5c7ea2d10b5b9d158e7ce1","state":"sha256:9f25dd765146e0ce97a55772317916bb6e8359b79e6f9f71d9cad1732875031e"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":0,"loss":true,"sentiment":"positive","stakes":0.5,"time_pressure":0.202},"n":120,"prev":"sha256:fb0491273e4f379c3936a447b912f87e29a93c30ebd4aff64eb88c0f142e1036","stance":"sha256:b0d46bf740a8b3be2ed98cafe3d2adef2ac978792f175e741967196840fe242c","state":"sha256:31074fc0a40ec6e2292e6edc4e70cb4b26452ccb9d50b1c3093465e36ad92d33"} diff --git a/bench/individuality/fixtures/p0/strands/tutor-s0-0.state.json b/bench/individuality/fixtures/p0/strands/tutor-s0-0.state.json new file mode 100644 index 0000000..af07893 --- /dev/null +++ b/bench/individuality/fixtures/p0/strands/tutor-s0-0.state.json @@ -0,0 +1 @@ +{"digest":"sha256:df116dca2d7e4cb4934ceac28e4080a96de7fd254ff6fed73e69541aeb518689","genes":{"react":{"praise":1.1849},"shift":{"arousal":0.2638,"caution":-0.2095,"curiosity":0.3741,"directness":-0.0092,"emoji":-0.2218,"formality":0.5207,"humour":-0.6507,"initiative":0.0927,"valence":0.141,"verbosity":-0.1258,"warmth":0.1053}},"history":{"confused":[false,false,false,true],"error":[false,false,true,false,false]},"mood":{"arousal":[-0.000126,0,0.000126],"valence":[1.27433,0,-1.27433]},"persona":{"digest":"sha256:58ed82d46afa6efb027d462f488a6c5ebebefe32ddc678940a64846bfe21575c","name":"Pip","version":"1.1.0"},"prev":{"agenda":["encourage","explain","example","check"],"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"none","formality":"casual","humour":"none","initiative":"suggest","valence":"down","verbosity":"full","warmth":"warm"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"playful","initiative":"suggest","valence":"up","verbosity":"full","warmth":"warm"},"seed":0,"turn":100} diff --git a/bench/individuality/fixtures/p0/strands/tutor-s0-0.strand b/bench/individuality/fixtures/p0/strands/tutor-s0-0.strand new file mode 100644 index 0000000..4080350 --- /dev/null +++ b/bench/individuality/fixtures/p0/strands/tutor-s0-0.strand @@ -0,0 +1,105 @@ +{"probbit_strand":1,"engine":"probbit 0.8.2","persona":{"name":"Pip","version":"1.1.0","digest":"sha256:58ed82d46afa6efb027d462f488a6c5ebebefe32ddc678940a64846bfe21575c"},"seed":0,"state":{"digest":"sha256:bd59d6c0799929853f76b747376d5eff4c0e10097afe4dd24c7c2376eda1e151","genes":{"react":{"praise":1.1849},"shift":{"arousal":0.2638,"caution":-0.2095,"curiosity":0.3741,"directness":-0.0092,"emoji":-0.2218,"formality":0.5207,"humour":-0.6507,"initiative":0.0927,"valence":0.141,"verbosity":-0.1258,"warmth":0.1053}},"history":{"confused":[],"error":[]},"mood":{"arousal":[0,0,0],"valence":[0,0,0]},"persona":{"digest":"sha256:58ed82d46afa6efb027d462f488a6c5ebebefe32ddc678940a64846bfe21575c","name":"Pip","version":"1.1.0"},"prev":{"agenda":["encourage","explain","example","check"],"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"light","initiative":"suggest","valence":"even","verbosity":"full","warmth":"warm"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"playful","initiative":"suggest","valence":"up","verbosity":"full","warmth":"warm"},"seed":0,"turn":0},"document":{"probbit_persona":1,"identity":{"name":"Pip","version":"1.1.0","seed":1,"summary":"a playful, patient tutor; warm, curious, jokes a lot but never at a struggling learner"},"traits":[{"id":"warmth","levels":["cool","neutral","warm"],"prior":[0.05,0.3,0.65],"spread":0.5,"say":["plain","","warm and encouraging"]},{"id":"directness","levels":["gentle","balanced","blunt"],"prior":[0.45,0.45,0.1],"spread":0.4,"say":["gentle","","say plainly what is wrong"]},{"id":"verbosity","levels":["terse","short","full"],"prior":[0.1,0.4,0.5],"spread":0.5,"say":["one or two sentences","a short explanation","explain step by step"]},{"id":"humour","levels":["none","light","playful"],"prior":[0.15,0.45,0.4],"spread":0.6,"say":["no jokes","a light joke is welcome","playful"]},{"id":"formality","levels":["casual","neutral","formal"],"prior":[0.6,0.35,0.05],"spread":0.3,"say":["casual","","formal"]},{"id":"initiative","levels":["follow","suggest","lead"],"prior":[0.2,0.5,0.3],"spread":0.5,"say":["answer only what was asked","suggest what to try next","set a small exercise"]},{"id":"caution","levels":["bold","measured","careful"],"prior":[0.25,0.55,0.2],"spread":0.4,"say":["keep it moving","","double-check every step"]},{"id":"curiosity","levels":["focused","open","exploring"],"prior":[0.15,0.4,0.45],"spread":0.5,"say":["stay on this problem","","ask what they think first"]},{"id":"emoji","levels":["none","sparse","rich"],"prior":[0.2,0.5,0.3],"spread":0.5,"say":["no emoji","one emoji at most","emoji welcome"]}],"moods":[{"id":"valence","levels":["down","even","up"],"prior":[0.1,0.5,0.4],"spread":0.4,"inertia":0.5,"half_life_hours":12},{"id":"arousal","levels":["calm","steady","keyed"],"prior":[0.3,0.4,0.3],"spread":0.3,"inertia":0.4}],"couplings":[{"vars":["valence","humour"],"align":1},{"vars":["valence","emoji"],"align":0.6},{"vars":["arousal","verbosity"],"align":-0.4},{"vars":["warmth","formality"],"align":-0.6},{"vars":["humour","formality"],"align":-0.6},{"vars":["curiosity","verbosity"],"align":0.3},{"vars":["humour","emoji"],"align":0.4}],"inputs":[{"id":"sentiment","kind":"level","levels":["negative","neutral","positive"],"default":"neutral","say":{"negative":"learner upset","positive":"learner upbeat"},"effects":{"negative":{"valence":-1,"warmth":0.6,"humour":-1,"directness":-0.6},"positive":{"valence":0.8,"humour":0.5,"emoji":0.3}}},{"id":"confused","kind":"flag","say":"learner confused","effects":{"verbosity":0.9,"humour":-0.6,"warmth":0.4,"curiosity":0.6,"initiative":0.3,"directness":-0.3}},{"id":"error","kind":"flag","say":"my last answer was wrong","effects":{"caution":1.2,"verbosity":-0.3,"valence":-0.4,"humour":-0.4}},{"id":"loss","kind":"flag","say":"learner reports a failure","effects":{"valence":-1.6,"warmth":1,"humour":-2,"emoji":-0.8}},{"id":"praise","kind":"flag","say":"praise","reactivity_spread":0.4,"effects":{"valence":1.2,"humour":0.5,"emoji":0.5}},{"id":"criticism","kind":"flag","say":"criticism","effects":{"valence":-0.6,"caution":0.6,"humour":-0.4}},{"id":"stakes","kind":"number","say":"stakes","effects":{"caution":1.4,"humour":-0.8,"emoji":-0.6}},{"id":"time_pressure","kind":"number","say":"time pressure","effects":{"verbosity":-1.8,"curiosity":-1.2,"humour":-0.4,"arousal":0.6}},{"id":"claim_done","kind":"flag","say":"about to say it is solved","effects":{"caution":0.5,"step.check":0.8}}],"history":[{"id":"errors_in_row","of":"error","kind":"streak","cap":3,"say":"my errors in a row","effects":{"caution":0.5,"humour":-0.4}},{"id":"confused_recently","of":"confused","kind":"recent","window":4,"cap":3,"say":"confusions lately","effects":{"verbosity":0.3,"warmth":0.2}}],"habits":[{"id":"no_jokes_on_loss","when":{"loss":true},"then":{"humour":["none"],"emoji":{"at_most":"sparse"}},"say":"no jokes, be kind"},{"id":"no_play_when_upset","when":{"sentiment":"negative"},"then":{"humour":{"at_most":"light"}},"say":"go easy on the jokes"},{"id":"confused_no_playful","when":{"confused":true},"then":{"humour":{"at_most":"light"},"verbosity":{"at_least":"short"}},"say":"slow down, no clowning","priority":10},{"id":"after_error_check","when":{"error":true},"then":{"caution":{"at_least":"prev+1"},"verbosity":{"at_most":"prev-1"}},"say":"shorter, double-check"},{"id":"flourish_budget","rules":{"linear":[{"terms":[["humour","playful",2],["humour","light",1],["emoji","rich",2],["emoji","sparse",1]],"limit":3}]},"say":"one flourish at a time"},{"id":"no_formal_emoji","rules":{"tables":[{"vars":["formality","emoji"],"forbid":[["formal","rich"],["formal","sparse"]]}]},"say":"no emoji when formal"},{"id":"check_last","rules":{"precedes":[{"before":"step.explain","after":"step.check"}]},"say":"check understanding after explaining"}],"agenda":{"steps":["encourage","explain","example","check"],"prefer":{"encourage":0.5,"explain":0.3,"example":-0.1,"check":-0.6}},"engine":{"on_conflict":"yield"},"line":{"max_tokens":40,"order":["verbosity","humour","warmth","initiative","curiosity","emoji","directness","caution","formality"]}}} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":3,"stakes":0.5},"n":1,"prev":"sha256:1cb0c13a91a116caba2cfd3fdba9a9ee7d6e8f3fe88a3e78d6dfa412d0c8e31c","stance":"sha256:a65344af83f9b8d391a341a0722e9d951ae5a354620134cfbc3bf887e29a30e2","state":"sha256:4764f0035fad0662af559178f0221e989cf95bba6299961e68e7d0e26cc7f4ae"} +{"inputs":{"confused":true,"criticism":true,"elapsed_hours":0,"loss":true,"praise":false,"sentiment":"negative","stakes":0,"time_pressure":0.92},"n":2,"prev":"sha256:81f9265bd1b6f88fa1baf6a766d1297d716c5aad8f8bd6ef5c7a3e58821c9156","stance":"sha256:f7984c91faf3ee3d0fdd5ae3f37a56209bec737082e3624b4596e19886b9ff78","state":"sha256:4c7ac4677485b234a4461377bffb62e4fc30e6f9e8ba1e92ca5ee7db9e49dde7"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"stakes":0.5},"n":3,"prev":"sha256:0c27a64627da52cd689bd880a41ff55757e4f1babeca0ff00e5ee8a825b26be5","stance":"sha256:7178bdef33f0235f1b04f1b51a14bb6defcb19a9153ae64fdc6f256689882f8a","state":"sha256:7d94036ac3994d70bea88264dd55fd754eb6e925eb21a7c58e703b1792e91500"} +{"inputs":{"criticism":true,"elapsed_hours":0,"sentiment":"neutral","stakes":1,"time_pressure":0.5},"n":4,"prev":"sha256:eda5e0adfc3255e8d60e2b280b0c73ad5faf41bef6e7ad57f71bc4fe4cb32a6c","stance":"sha256:a1ea8b2272eb04809a3ad606e5ba3d0ce105e8ea8c88b9d2b51966e02257e329","state":"sha256:c1003e5117fae4dea16bf553c5c34e3bebd0990d2030754e96ec555767b83c3d"} +{"inputs":{"claim_done":true,"criticism":false,"elapsed_hours":0,"praise":true,"stakes":0.5},"n":5,"prev":"sha256:7bab085c7d33002f4b19f7ccff16dad582dceb7b42c547e294db855e1fc37822","stance":"sha256:a300bcc87865d5bd173075a743a73242ba5a11af285aef4d991d5f1b24e513ab","state":"sha256:be03e3013ff16e5d07bdcfebc8bda68ed619eb05b77615ec180c2f4992dd9f2f"} +{"inputs":{"confused":false,"elapsed_hours":0,"error":true,"loss":true,"praise":false,"time_pressure":0.5},"n":6,"prev":"sha256:24183eb246bf2ae1f7edeee9cdf90b7c506ebbfd45ab5057ee0ff90edf020658","stance":"sha256:93b4488e95a740ded6a94729807e692974840b5c8ed642977bd7a15f268af57b","state":"sha256:812785872b806e9ec8d6d83136b6f7c54f4cc67d5ebad589bf46fc1fa18f99fa"} +{"inputs":{"elapsed_hours":0,"praise":true},"n":7,"prev":"sha256:98ab5f63043eb019daf7f435a76b3590efc5b59fc841c63a30216a0433e839e3","stance":"sha256:70052d566425f70a5fcd6b63dac9afdbbdda5f410a197e156eb37b3b83ca9a80","state":"sha256:8d6db888562bcb73ee8c7fad0ccee19701fbdf162a94b6880cfcede1f14aaf57"} +{"inputs":{"claim_done":false,"elapsed_hours":0,"loss":true,"praise":true,"sentiment":"positive"},"n":8,"prev":"sha256:7ddb00aad36e24c8537d3a9d13e017687412a522062b671c769890b3c242d402","stance":"sha256:2ae0fb603c3752100a51da6f560af50b59d49920ee624b70fd58c09315472370","state":"sha256:d92bca17eca2058b233021314b3fe86af2b13c401940b83b15f6b8fc199cb269"} +{"inputs":{"confused":true,"elapsed_hours":10,"loss":true},"n":9,"prev":"sha256:4403159b764b5e01efa8621a5b52e2c68def212442b4a288daadb0bba5791a1d","stance":"sha256:73d365940e532d5e07fc94c912d4e7efd32bbd0059d974450acc20df9f5653a8","state":"sha256:215db00424fe7e178fc99f4479ffd42e522190b36914beec9edfdff1bbc423f6"} +{"inputs":{"elapsed_hours":0,"time_pressure":0.5},"n":10,"prev":"sha256:667b9e7e4736d138dc9e86d29505be26033d7aabbc0dbfdd69bcbbede105be44","stance":"sha256:84da0a1d7faa48fb0fb09ad45b8ecddf2e2ce630330b30841207c41eace75df1","state":"sha256:dead307b6061ac8e8c23613cc20cdb426ec6cb835044e60739922db9fef277f9"} +{"inputs":{"elapsed_hours":0},"n":11,"prev":"sha256:6a096fc7e961e7064da12b71f52640c6cdb8b890a730bc759884a17ba1d01b53","stance":"sha256:a3d8e0f2f8d22b0ca09fd0bbae598879b9c61558afcd5a38dcde6e2d0c3d873e","state":"sha256:a4a13c51f62dc0131f16b8b5c85db279b09741eea19b39182299fa2c3fa8a9bb"} +{"inputs":{"elapsed_hours":1,"error":true,"loss":true,"sentiment":"neutral","stakes":0},"n":12,"prev":"sha256:ae2c284137e9cada542396e087744a6c22cc36542b7e3b0d15512f9bb74ec1d8","stance":"sha256:3992dbf5dde984179084fa1413ff78ee3c1afac7d5c5c25829f9ddbf31f2117c","state":"sha256:8f544e5d4a65a62db2debeb72412019c6ecf1516a2c17df97656e2ba9f63e07b"} +{"inputs":{"elapsed_hours":10,"error":false,"sentiment":"neutral","stakes":1,"time_pressure":0.5},"n":13,"prev":"sha256:1f34c2f2339719b862c1695fb120ca3eb4720c8d62c5732377e6c95e12083851","stance":"sha256:831cb239053481d895dc79999ca669f096655804292c20dc6e10bfc8db7cd6dc","state":"sha256:2fcac021116bc6d14c6f6f9278577c02d5d32d28f4ea038923ed1a725602a212"} +{"inputs":{"elapsed_hours":0,"loss":true,"sentiment":"negative","stakes":0},"n":14,"prev":"sha256:b214e9c5a1df56dc680fa858fa5ca2587bad3106700c91cff902a2eaccbc1b86","stance":"sha256:3ab7fb2b30ed732287e65ad2cd00af9428ecbd6ae5f44d37898b5d192905d540","state":"sha256:74ce62241304c6b1f4132c7734a3de03ae8a3a931707252b2fdb8f88208193dd"} +{"inputs":{"claim_done":true,"elapsed_hours":1,"praise":false,"stakes":0.649,"time_pressure":0},"n":15,"prev":"sha256:7555ad2d7b073f504355acb4b9aee1d536c3b0a7a24d0f0f92433588221c20a8","stance":"sha256:9ea33b635757bf1b7e0be6b8a0ef9f61225913e67fa513d526aee5ba89388600","state":"sha256:0a4bac5de2ef9577aad81e2cc10ea6ba8983b2547375eb1da28b3619821c0e56"} +{"inputs":{"confused":true,"elapsed_hours":0,"error":false,"loss":true,"praise":true,"stakes":0.5,"time_pressure":1},"n":16,"prev":"sha256:63789d9457f938a1a776c359d327aedd5e9f4bc1458d628eaecf9f06739b7f63","stance":"sha256:58995d61eb69990a5ed8fb5d6c1c231f4fd2ea2e83c37007407d408565297ecb","state":"sha256:945bfdfeadab66bfd52c4601eabfadac98456ee5c91b65b0c253961c4220bf00"} +{"inputs":{"confused":true,"elapsed_hours":0.1,"loss":false,"stakes":1},"n":17,"prev":"sha256:b14c47afc80b2ed709aa8c0d1bf9dd009844dab0c16a691c974a6ae5e06ba3e1","stance":"sha256:35563560e0ad985e6d39d18a86b028ddf597dc2d0a77dc7acd3961d85a6197c5","state":"sha256:535c052b47a92e226ac1d74944a87260e227ba728412d522937c674954f85cf3"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":3,"loss":false,"sentiment":"neutral","time_pressure":0.071},"n":18,"prev":"sha256:57c814947ef9d8c21779995fe3f6e2794d7bd583af041a1951a07ec4adf5f974","stance":"sha256:e6ed3186fc0db7f6c0a919bbb5c2a1fceaca81a46f020df44f5db70a481f9efc","state":"sha256:5d5994ee6285484100d7ef96270a89085466fe410a71ff629a31c250fb0fab7f"} +{"inputs":{"criticism":true,"elapsed_hours":0,"loss":true,"praise":true,"stakes":1,"time_pressure":0},"n":19,"prev":"sha256:f1cdb30137680b75eddb771dc0ca0cf82e022bfe2d63a174f1e708a48c84d388","stance":"sha256:364085cd381f32bb5d18f5a91903621b49bef6c9d94c65ccef4423c178271061","state":"sha256:64fffcbc572e49a52ec28ca1ab58c85bdb8d5435e895a7e451eb8f0317d7abc7"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"loss":true},"n":20,"prev":"sha256:52566a83b523724092b072e5bfa9e0ba3a067c4dec9ed8b06c7295f8eaa75ca0","stance":"sha256:6f4de2b2525f850c685fc0091bebd650b76f1a5a4489af7951e99925ce93547b","state":"sha256:bf6f0afe11c07981e1d00e7d548a56f8d6545ce42854c0c1517ad9c3b7bd538e"} +{"inputs":{"confused":true,"elapsed_hours":0,"praise":false,"sentiment":"negative","stakes":0.5,"time_pressure":0.5},"n":21,"prev":"sha256:0cb815f12919c8abd983a49a68af8c7302b7f35a841604c1650b1a7f8daaec14","stance":"sha256:4bf9420163ade81dea310d79e267bf6c8896e5fe1c842019bb9494c85abb345a","state":"sha256:31e4680c31eb424f23b191bf46ac6e2dbe5e0adb03c6371c25d7fb0df456ccf2"} +{"inputs":{"claim_done":false,"elapsed_hours":0,"praise":true,"sentiment":"neutral","stakes":0,"time_pressure":0},"n":22,"prev":"sha256:8e46e8dae914f4d01449b73cefa32189f8e7b80fba8295a60366f1fcea3b44ef","stance":"sha256:34aff4c00759e04576ee013c920e50251db8a39aa254e41268199969d666d8d8","state":"sha256:b8c5c67d61f2c54623c8a935540e3a0b621c9ad6fa541d3124704a08d3a96b02"} +{"inputs":{"confused":true,"elapsed_hours":3,"sentiment":"negative","time_pressure":0.72},"n":23,"prev":"sha256:2f6c3c1b0ed7e238dc6a7422a5990ffbd12ba6c5b2c755713c66180e74bcad56","stance":"sha256:e92ccaacd6c9ac621409e226a82aebaa1fc96edc7c124aaf2dd46f86cdbac779","state":"sha256:a40ea5d9afb289fee87bb439706a040182f165b7f35bca201dfeeaa99c22b2b0"} +{"inputs":{"elapsed_hours":3,"stakes":0.5,"time_pressure":0.5},"n":24,"prev":"sha256:92b6273bf2530f2d2be7e83e29ee4803bcc87f61fc6ff4b35a6abee4104ad328","stance":"sha256:bb66fd301ed0ecabdb3eeba396d7079b8f9d82d57410aa3d4cec2ed9023668b5","state":"sha256:9595d0c2351ba915f1d56ea5d715539e00a45fd6c3d9c72b73bb49b2a7c2c0ca"} +{"inputs":{"elapsed_hours":0,"error":false,"stakes":1,"time_pressure":0.851},"n":25,"prev":"sha256:53392a49c33b46fc018ae372932279712fb05f7f3106c9b076d68a9fd05a441d","stance":"sha256:b07ef20d853c06e57c3f200bc6f6a7509d09322ada1d32dfef4e27ba767d9d70","state":"sha256:3aa0c71817640ae74e1cbe4403e74dd1a77b62a409388129b351c9db2dd95708"} +{"checkpoint":25,"prev":"sha256:8ef7c8421140599b72932bf9319b6efc3c828e89801b43c8dd7e80b918ab21b7","stance":{"agenda":["encourage","explain","example","check"],"engine":{"program":"sha256:38f8adc9492349b8ebae595f92f8e2cdc0c1ea0748d31962edc58db154938aa1","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["flourish_budget","no_formal_emoji","check_last"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"claim_done":false,"confused":false,"confused_recently":1,"criticism":false,"error":false,"errors_in_row":0,"loss":false,"praise":false,"sentiment":"neutral","stakes":1,"time_pressure":0.851},"line":"Stance: one or two sentences; no jokes; no emoji; double-check every step; warm and encouraging; suggest what to try next; gentle; casual.","line_tokens":35,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.112789,"keyed":0.563736,"steady":0.323475},"p":0.563736,"released":true},"valence":{"level":"even","odds":{"down":0.262826,"even":0.487552,"up":0.249622},"p":0.487552,"released":true}},"persona":{"digest":"sha256:58ed82d46afa6efb027d462f488a6c5ebebefe32ddc678940a64846bfe21575c","name":"Pip","version":"1.1.0"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"careful","odds":{"bold":0.059214,"careful":0.512357,"measured":0.428428},"p":0.512357,"released":true},"curiosity":{"level":"open","odds":{"exploring":0.229378,"focused":0.345892,"open":0.42473},"p":0.42473,"released":true},"directness":{"level":"gentle","odds":{"balanced":0.448545,"blunt":0.098764,"gentle":0.452691},"p":0.452691,"released":true},"emoji":{"level":"none","odds":{"none":0.511148,"rich":0.086691,"sparse":0.402161},"p":0.511148,"released":true},"formality":{"level":"casual","odds":{"casual":0.511937,"formal":0.058229,"neutral":0.429834},"p":0.511937,"released":true},"humour":{"level":"none","odds":{"light":0.332601,"none":0.586954,"playful":0.080445},"p":0.586954,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.180233,"lead":0.325419,"suggest":0.494348},"p":0.494348,"released":true},"verbosity":{"level":"terse","odds":{"full":0.11507,"short":0.397128,"terse":0.487802},"p":0.487802,"released":true},"warmth":{"level":"warm","odds":{"cool":0.022956,"neutral":0.205993,"warm":0.771051},"p":0.771051,"released":true}},"state_digest":"sha256:3aa0c71817640ae74e1cbe4403e74dd1a77b62a409388129b351c9db2dd95708","status":"ok","turn":24,"unsure":[],"why":"time pressure 0.9 -> verbosity down, curiosity down; stakes 1.0 -> caution up, humour down"},"state":{"digest":"sha256:3aa0c71817640ae74e1cbe4403e74dd1a77b62a409388129b351c9db2dd95708","genes":{"react":{"praise":1.1849},"shift":{"arousal":0.2638,"caution":-0.2095,"curiosity":0.3741,"directness":-0.0092,"emoji":-0.2218,"formality":0.5207,"humour":-0.6507,"initiative":0.0927,"valence":0.141,"verbosity":-0.1258,"warmth":0.1053}},"history":{"confused":[false,true,false,false],"error":[false,false,false,false,false]},"mood":{"arousal":[-0.42458,0,0.42458],"valence":[0.088502,0,-0.088502]},"persona":{"digest":"sha256:58ed82d46afa6efb027d462f488a6c5ebebefe32ddc678940a64846bfe21575c","name":"Pip","version":"1.1.0"},"prev":{"agenda":["encourage","explain","example","check"],"arousal":"keyed","caution":"careful","curiosity":"open","directness":"gentle","emoji":"none","formality":"casual","humour":"none","initiative":"suggest","valence":"even","verbosity":"terse","warmth":"warm"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"playful","initiative":"suggest","valence":"up","verbosity":"full","warmth":"warm"},"seed":0,"turn":25}} +{"inputs":{"confused":true,"elapsed_hours":0,"loss":false,"praise":true,"sentiment":"positive","stakes":0},"n":26,"prev":"sha256:2a7165070588db043d870db8107d47725b3273b9c22b922d70b5770abb046aca","stance":"sha256:017017224069816eeca6ae4430a2a6b40bfe57fb73694c87a3786de89517cbeb","state":"sha256:f01f300c81991b8fa82e82bc8ba35cb7bb3678ececb1c06fa1166cc7c6438ac0"} +{"inputs":{"elapsed_hours":0,"error":true,"loss":false,"stakes":0.5,"time_pressure":0.5},"n":27,"prev":"sha256:ce759a6dcf68fe78623bf7cc69b9380fddbb88f72120a39e19a4bafe106ec738","stance":"sha256:50f3d6b2e393c69906d627de30ea0ae5afc8e7c2e3f2493563663b9478464368","state":"sha256:8596f8f7d4d5df70b4aabcea859c2c6544038a00c2d797cf434fd1f609022334"} +{"inputs":{"elapsed_hours":0.1},"n":28,"prev":"sha256:f3aabad84308de295afb6aae96563bce21b30df7e9aa44bc6fe353306361e8f6","stance":"sha256:fb85a2e61a49a1ac751777fd64081c6467d9d2f1cce5a3e949b57f2f8b44be65","state":"sha256:3180641fbc01366cd2f9cce61dd08e00ef209d1fdbb3e157336f2f00352daa27"} +{"inputs":{"criticism":true,"elapsed_hours":0,"error":true,"time_pressure":0.092},"n":29,"prev":"sha256:6c726a0f0c6d6c32bff994e0f33e1451f49309bc86ced68354db8e174b28ae08","stance":"sha256:ddcffe8860f4839f87d622ab649a1c3cd9d69cb2f229e00faa6fd667dffddac3","state":"sha256:45d3ef1e11bf4bbeffb02608404f46125570763e6fce6c9baf0cbf730a31c085"} +{"inputs":{"claim_done":true,"elapsed_hours":3},"n":30,"prev":"sha256:ede293981db5d1d800c7b31887689a1ed6f30f73c0a10ac5dac4a62d0501f096","stance":"sha256:df9b886e4f8a1c8d0e84c756ad1fa3cf577c113dcba1ae6e19019b359958192e","state":"sha256:691960d29b8e88af8dd66b6e9f07a10d447fe07a7e73f0c84e20da2fd41455fe"} +{"inputs":{"elapsed_hours":0,"stakes":1,"time_pressure":0.5},"n":31,"prev":"sha256:16894af5034008022c63ff32eae3f0b7b65b4a273b1818af9d14e7ec9434b8ba","stance":"sha256:0ef47c3f7bf3f05a0bb39f9bb469629996baff88e844a44d9d7288d9e04e5bbf","state":"sha256:1f05ed6277d8886907de7eccb72b6deef2a44795bfe514c64f707f31599220ca"} +{"inputs":{"confused":false,"criticism":true,"elapsed_hours":0,"loss":true,"praise":true,"stakes":0},"n":32,"prev":"sha256:000fab61fb8a531e5232e1d64e6ae4299c24ecd594beabf0cc8b937361949502","stance":"sha256:c73d9482b61dbb0fc86a95d97c4afecc42287a187d536cbc312190eec1156b22","state":"sha256:34ea2b72d330162071090dbbe8ad141463fc8fddd497ecd3365c00c80dcc1e85"} +{"inputs":{"confused":true,"criticism":true,"elapsed_hours":0.5,"praise":true,"time_pressure":0.5},"n":33,"prev":"sha256:e20ee96cd583e34899b718117ccd818c432aab35ca074d8b31468c05667eaac6","stance":"sha256:5c1f7d8ef88b8715c34e1344e72a73f5bc44a6380d5c9d809ab794948e34fdc5","state":"sha256:487ee234a15f7285da804af63063907704d6855ed685d1179ff32c2c5e085fc3"} +{"inputs":{"criticism":false,"elapsed_hours":3,"loss":false,"praise":true,"sentiment":"positive"},"n":34,"prev":"sha256:4aeb35b39e31bd0cd59a09ba00616ac9b8be3443b4de9e3ff01508011067e860","stance":"sha256:3c6cec0945ee1960959e52ee3c9235ca3a30fccdcb0f9ba29b757815a40e1421","state":"sha256:c52ffc67c8d18a626f7a00e11ea84ab72db0f5cc3dc85e254147201de010d797"} +{"inputs":{"elapsed_hours":0.1,"praise":true,"time_pressure":0.5},"n":35,"prev":"sha256:b72169ac9f1c4bc0f3821a91e9627a4788cf602d89bb76279b8a233c443b38b8","stance":"sha256:75d35d6b2c73c38f146fc00480263c709f6ea03ffb9bc2ea47459d3247cf9386","state":"sha256:ab52862978302b8620a5f092211700acb8a43c32417ea530a9cf016c51256fe4"} +{"inputs":{"confused":true,"elapsed_hours":0,"loss":false,"praise":true,"sentiment":"neutral","stakes":1,"time_pressure":0},"n":36,"prev":"sha256:18f4da8effbbb1e62479c2a27d7c58ae313f5a5017604be3e006f4443e2f660f","stance":"sha256:adec3dce2cd461c8a67dbcdb725202e34a27a12c5ad147a2301c0229f150be20","state":"sha256:257fd528458fe07f9d99f386c1574fb8eae2398db65997a250c66f0737f6f124"} +{"inputs":{"confused":true,"criticism":false,"elapsed_hours":3},"n":37,"prev":"sha256:f42121f905285ac8e3da93c24beeda8c5333c6e745ed3848acccd8723e506874","stance":"sha256:18519a6f23bb31ca6f168c367ee616310e40b49611fe815d0b4db8f1f050050c","state":"sha256:be4bfa2de44f15c1f6a1ab8a4a29d33d7a3b019144529530648094e516568a19"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"error":true,"sentiment":"positive"},"n":38,"prev":"sha256:4edaf48edeb9464deda15a48dafbef80486c269aff1930b6db3fe93125bbbd7d","stance":"sha256:b769a226f8afaf5353fef91c871baffdded7327015bad0c8a3a08a3e5a4bf035","state":"sha256:dac508b304efd116cc90452cbb7b6d87f324fb75c2efe3865690bda61c518978"} +{"inputs":{"elapsed_hours":0,"error":true,"praise":true,"sentiment":"neutral","stakes":0,"time_pressure":0.45},"n":39,"prev":"sha256:5a67e975f25755f5f9776469766f137942d6735be6b49e70bc11c51fc284a585","stance":"sha256:210582264331834e50567762513fa9d7a0e0e7df6f4a0c57b498515d15a578de","state":"sha256:1d6453e073a5165252911a08fd9bbeedb0cddd6881620283121eece3cf04089f"} +{"inputs":{"criticism":true,"elapsed_hours":0.5},"n":40,"prev":"sha256:92c5cbb2dbf1f44b6e1ac95c3fa7e00cc8da13b76bbb1a7237b8825ecde19178","stance":"sha256:4495d866df57e2af06ff458ee9e57ddb7129114012576a565dbf85820ec59639","state":"sha256:4c5ac7998544a5b33724d00f0147e8fcec40702144ed80d29012e81ba1c5d48e"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":0,"error":true,"stakes":0.5,"time_pressure":0.5},"n":41,"prev":"sha256:db182c945040c74039329244ab586662a29641b2134e4d3bc8fb5b2d1b151ffd","stance":"sha256:ea1489f2e7eff080216d937fd16c012b16663cf2a71da7e424689020f09ad509","state":"sha256:66508d65e8830565a66555a0a184ef84cb1651b12a2120dc2a602fa66f92c83a"} +{"inputs":{"criticism":true,"elapsed_hours":0,"stakes":0.87,"time_pressure":0.009},"n":42,"prev":"sha256:cfae7a874f4a5ed4469b64bc2880ed3ecc15399cf82bb7d0e89c7943e6efe9cc","stance":"sha256:b3a76a5f1c960e23555139636e6edb3983b92b8458a9267a334f144474a976a1","state":"sha256:8059a5661fb3f51e4338ab6a054bfb08294594bf31b91a211470c7f0406107c7"} +{"inputs":{"criticism":true,"elapsed_hours":0.5,"stakes":0,"time_pressure":0},"n":43,"prev":"sha256:b8264f766912c3ce5f3208c8c4327e78702f2efe696b458f64c3c9f21eb963e3","stance":"sha256:869c4ab5823d35561c13f8ee64772ce9bea1e7173a0bdbd6adb9b60a009be2e4","state":"sha256:0981eabe5a73e01c5edcfa6c8bf6d217778b9823db6355efae4c5c707c2d4494"} +{"inputs":{"claim_done":true,"confused":false,"elapsed_hours":3,"loss":true,"sentiment":"positive","time_pressure":1},"n":44,"prev":"sha256:065c3f4de4d5eff69907f0901ab84d6b6cb5bcf3144c7c956da43e77b1adae74","stance":"sha256:98b6d7e69b0a8080f7438d443d2d90ba4ef7a89f7f23c9ce77a0c66ff455792b","state":"sha256:230eede886163f42a9658e93ef6bb0e98580bc9552b5f72a040dcc4e6ce5cfe8"} +{"inputs":{"criticism":true,"elapsed_hours":0,"error":true,"praise":true},"n":45,"prev":"sha256:b2a28e24bb43ed1fe104f1dc9a89e813da5a0e3da88d1f176411a39c0f184bb6","stance":"sha256:e7e377104df1799595903d943bbb790caac3a7afdeac82e0012caef16b2f18c3","state":"sha256:0e0e12d268b5cbbbd1d74ccd37d9bceda1afe5d3c64c80c92cc8b3d6ccd606e2"} +{"inputs":{"criticism":false,"elapsed_hours":0,"praise":true},"n":46,"prev":"sha256:8fc372d0785210fe6521dfb4d1ec6aadbbdd7799de0d4ee14977daac56e97374","stance":"sha256:516a5cfa11c480f59878105e844cdcb8c93c4f4a4ab5c2b34ef66c570bfd5aad","state":"sha256:d1fa8d1a8f3fb1098e055c0ab7a1aca93e98dd4e4ab280966fc7a5ea52b28ca0"} +{"inputs":{"elapsed_hours":0,"error":true,"sentiment":"positive","stakes":0.327},"n":47,"prev":"sha256:6be9c01a7f392d39ff89257f828d3fdbb8b4f84fd4664c6f042565e9fa42f24b","stance":"sha256:d0606bdad6bb66af1df7ab32e2d6d1de954e6555e9516c72aaa902865f569817","state":"sha256:688b843bf1d5245169293a2cf3c87479548c4dd3673cbe35ffca9ec985e9a624"} +{"inputs":{"elapsed_hours":0,"praise":true,"stakes":0},"n":48,"prev":"sha256:c2cbb80ba5d76d7a897434344f9912244fccb8249c07b98dd5062e01390b2a8d","stance":"sha256:1f30f07e75c495617bcffd9af4665e88eaaab646530a57831508acd7467864f9","state":"sha256:57d4446646895bdc7c81af2ab86ce0ff3235e0c3074d8e15e86e81b167fc391a"} +{"inputs":{"confused":true,"elapsed_hours":3,"praise":true,"sentiment":"positive","time_pressure":1},"n":49,"prev":"sha256:dcf0564c723b9f6c9a2b4e62c55082e67b822eb4e554f2a102264cc9f1a82b90","stance":"sha256:567c75b410f95388458f64c4bd56e3010b3c0587b4c12b634c3c00414ff26f87","state":"sha256:d1ca825427a99fbb44162d20d5a1237fbe02074b8dab2a75a9506f9d1561c3a2"} +{"inputs":{"claim_done":true,"elapsed_hours":0},"n":50,"prev":"sha256:eae15d562824eb421da06cd8e8aeeaacc8dfd48a9d90b84f4804a25a89846b4a","stance":"sha256:c91a1c22f62bddd9e473c0d3a5e226a92c2953a1c137a9ec6d39c2822b9cb570","state":"sha256:3d7664dc4677708c88d518db13cb3c1476fd1395a311c018421f47ec92be2e6a"} +{"checkpoint":50,"prev":"sha256:ae4bf7c0459c4acf4ddd8abe857fc83deb0ff0d299046f3dd4aa6e74065ada1a","stance":{"agenda":["encourage","explain","check","example"],"engine":{"program":"sha256:b70a82901de7d75de94c71133f0802e248ce4da8af708f6fe2c72f143e1b46f2","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["flourish_budget","no_formal_emoji","check_last"],"bound":["flourish_budget"],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"claim_done":true,"confused":false,"confused_recently":1,"criticism":false,"error":false,"errors_in_row":0,"loss":false,"praise":false,"sentiment":"neutral","stakes":0,"time_pressure":0},"line":"Stance: one flourish at a time; explain step by step; playful; warm and encouraging; suggest what to try next; ask what they think first; one emoji at most.","line_tokens":39,"mood":{"arousal":{"level":"steady","odds":{"calm":0.245936,"keyed":0.365915,"steady":0.388149},"p":0.388149,"released":true},"valence":{"level":"up","odds":{"down":0.035739,"even":0.2856,"up":0.678661},"p":0.678661,"released":true}},"persona":{"digest":"sha256:58ed82d46afa6efb027d462f488a6c5ebebefe32ddc678940a64846bfe21575c","name":"Pip","version":"1.1.0"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"measured","odds":{"bold":0.186155,"careful":0.26625,"measured":0.547595},"p":0.547595,"released":true},"curiosity":{"level":"exploring","odds":{"exploring":0.607145,"focused":0.0736,"open":0.319255},"p":0.607145,"released":true},"directness":{"level":"gentle","odds":{"balanced":0.448545,"blunt":0.098764,"gentle":0.452691},"p":0.452691,"released":true},"emoji":{"level":"sparse","odds":{"none":0.206287,"rich":0.186879,"sparse":0.606834},"p":0.606834,"released":true},"formality":{"level":"casual","odds":{"casual":0.638476,"formal":0.013988,"neutral":0.347536},"p":0.638476,"released":true},"humour":{"level":"playful","odds":{"light":0.466315,"none":0.142726,"playful":0.39096},"p":0.39096,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.180233,"lead":0.325419,"suggest":0.494348},"p":0.494348,"released":true},"verbosity":{"level":"full","odds":{"full":0.578135,"short":0.347648,"terse":0.074217},"p":0.578135,"released":true},"warmth":{"level":"warm","odds":{"cool":0.018307,"neutral":0.189841,"warm":0.791852},"p":0.791852,"released":true}},"state_digest":"sha256:3d7664dc4677708c88d518db13cb3c1476fd1395a311c018421f47ec92be2e6a","status":"ok","turn":49,"unsure":[],"why":"one flourish at a time (habit); about to say it is solved -> caution up; confusions lately 1 -> verbosity up, warmth up"},"state":{"digest":"sha256:3d7664dc4677708c88d518db13cb3c1476fd1395a311c018421f47ec92be2e6a","genes":{"react":{"praise":1.1849},"shift":{"arousal":0.2638,"caution":-0.2095,"curiosity":0.3741,"directness":-0.0092,"emoji":-0.2218,"formality":0.5207,"humour":-0.6507,"initiative":0.0927,"valence":0.141,"verbosity":-0.1258,"warmth":0.1053}},"history":{"confused":[false,false,true,false],"error":[false,true,false,false,false]},"mood":{"arousal":[-0.145531,0,0.145531],"valence":[-0.760513,0,0.760513]},"persona":{"digest":"sha256:58ed82d46afa6efb027d462f488a6c5ebebefe32ddc678940a64846bfe21575c","name":"Pip","version":"1.1.0"},"prev":{"agenda":["encourage","explain","check","example"],"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"playful","initiative":"suggest","valence":"up","verbosity":"full","warmth":"warm"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"playful","initiative":"suggest","valence":"up","verbosity":"full","warmth":"warm"},"seed":0,"turn":50}} +{"inputs":{"claim_done":true,"elapsed_hours":0,"error":false,"praise":true,"stakes":1,"time_pressure":0},"n":51,"prev":"sha256:6022050f30f72a32e443d2fb9da6ddeae2ab1050a1863e2c3ff22399ccb481ec","stance":"sha256:6d74d27248c8dd2572642ec473df3fd7ed68f52c8a10951ea9fdec85f7372feb","state":"sha256:6f061eb691c41545c792070b237e6b3536873e432d02c98958e62959bc2c9a99"} +{"inputs":{"confused":true,"elapsed_hours":0.5,"praise":true,"sentiment":"negative"},"n":52,"prev":"sha256:cabc3071ddb8d4fca7b308d417d8f402a019d00ee2249a6861332a31114b3f9b","stance":"sha256:faff359f8b30d2adb22c87f4ac1c4ea59617f2ac892e5f07153e7847bf9857c3","state":"sha256:d804cfb9986fcddf6cd8804df29e265c8e6578d04116aebfd73b16fb6bb0b617"} +{"inputs":{"elapsed_hours":0},"n":53,"prev":"sha256:8491c6d237c330ae43a292c46b877c197cc2cb10737e3afc401d3794192cf667","stance":"sha256:a430dcc25a5628fb3bf7997bb0059219e9a81f58b1ce1599ed927b69825a8b95","state":"sha256:73fbfe352deb0f63c3c9bc0f44708ea26e6b03c34a6807b6159d91ad0468bdb3"} +{"inputs":{"criticism":false,"elapsed_hours":0,"stakes":0.172,"time_pressure":0},"n":54,"prev":"sha256:68ba21e5ce44d4e247829103108c849f5ecd53ca2b439488cad5e6c7611d2bd1","stance":"sha256:7a52abe3a85d18a06dba156d0ef565322151f94aab58ba2ddc05efc2d12fcc4c","state":"sha256:3bfe53b867ec0562cedacc808afa7a5d7f4ad9367d114b9d15e21805694ac255"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"loss":true,"sentiment":"negative","time_pressure":1},"n":55,"prev":"sha256:18992e3fe40dd6aa8455d6f61c2139c2a328f7059e37a6bf33f2be4e829b7a4a","stance":"sha256:90658a840f9bf632f827642152866324696b5f82ce0840ec6dc24b65f844f261","state":"sha256:c4115a2cac888818a605efe3bc6ad1dbebb43cebddbcdf53b0aa8dd4eb1d551d"} +{"inputs":{"claim_done":true,"criticism":true,"elapsed_hours":10,"error":false,"stakes":0.749},"n":56,"prev":"sha256:5445db5d9cd033042f14a42f486c03e49892f22c356ca3d5183551e31b9158c9","stance":"sha256:eb234296bdbdb60a452e53a86a07c019eebd98fd20fefaa7a98091080c1d01b2","state":"sha256:da6e3ebbdc83fbd72e61bef3c4f2f0f9e0c0a4d6c7974a7fe270c4e0d76abae2"} +{"inputs":{"claim_done":false,"confused":false,"criticism":true,"elapsed_hours":3,"sentiment":"neutral"},"n":57,"prev":"sha256:5e5c6e960f2ec215e973542c9ae36633667a86c1b47dddb4ac97cab1e4eb3c5b","stance":"sha256:ef34bc167751af46abacdb2484b708ec782d8f05fa49571817fec419f471795d","state":"sha256:0bcb97ed8e0b2af07cb48c9569bfd2dc2d7889a702a764d6bb795323e43229b9"} +{"inputs":{"confused":true,"elapsed_hours":0,"sentiment":"neutral","stakes":0.5},"n":58,"prev":"sha256:74ef758f78cbc45fceb126e4eac5d0556c9b2922fe68cc9348567f24a2c45028","stance":"sha256:39562f2df2bc51d574c7a2a00f4d9e020e2d4f371b024169cb8a9e9fc13454c9","state":"sha256:c6048c36d3aa4b485895452236e3cba5a9655afd1b990d4de5d72c9a178a5e78"} +{"inputs":{"confused":true,"criticism":true,"elapsed_hours":0,"praise":true,"time_pressure":0.5},"n":59,"prev":"sha256:5bc4b33ba6835ede6548640760f53c8de0f7e44ef3bcc84d7765868320e68e95","stance":"sha256:25b6f9a51bece21837c992f649460a8ea53b4b7e166876a2e0d206262575578e","state":"sha256:44e0d68f9e436d3be93ea59991c3038f34521142e2db0ca784a002813886bce9"} +{"inputs":{"confused":true,"elapsed_hours":0,"loss":false,"sentiment":"negative"},"n":60,"prev":"sha256:7e8351cbf25f39937f98eb3cb5dc14bdafe6b3f7a9c020d1f90ac052fd5c3b8c","stance":"sha256:95cbf4d861121edd021e5dc198f469a54f4949ebf2adbdbf4693551d5e085d43","state":"sha256:dbcb80eaed666c2a67ee5774848f6843cad84708bea69c584a9c87dc9218802e"} +{"inputs":{"elapsed_hours":0,"loss":false,"praise":false,"sentiment":"negative","stakes":0.852},"n":61,"prev":"sha256:e5b37b960bbc7fb1872d63b942cd4c4bac802cf50ec4602ac649f11ae21ba2f2","stance":"sha256:3ce66ec44715506079f609e8680d3fac7fd18f9bef9040da4fcc5a38c073ce34","state":"sha256:f2c7163923414a2291d432802d5f50725320c40bafc030d8a48aee68d816b8e7"} +{"inputs":{"confused":false,"elapsed_hours":0,"error":true,"praise":true,"sentiment":"neutral","stakes":1},"n":62,"prev":"sha256:5b764110b8791bcd9ec6a84e109b966cff54f363e905340a38b38f521477b902","stance":"sha256:fa5784d7a310b1a5b5e52662d1cde63c5373d4ba759f8de165ab51404b3674e8","state":"sha256:0d08adcbbdccef1be82fdbb5d3307970f59e32337511a924446e751fde65afb4"} +{"inputs":{"confused":true,"elapsed_hours":1,"praise":true,"sentiment":"neutral","stakes":0.131},"n":63,"prev":"sha256:e44dbc28a4eb503646f260182393a57357f525b65137b5cbdf26d9124b80df8b","stance":"sha256:d813801ab6bf0940098be29bb99108c28332276daf0ca89b67077190b49d1c52","state":"sha256:85570f891fb4b19f65c71710ad4b8d67977b030fbcea0f554fc87e27776b23b6"} +{"inputs":{"criticism":false,"elapsed_hours":0.1,"praise":true,"sentiment":"positive","stakes":1},"n":64,"prev":"sha256:5ab484d4c6bce9e5a331c0bf16ad6e5fff5db1161043074a081ab2773beee679","stance":"sha256:c747a93c5f58d2755f59f0d0205a81796404700ca6cb2bfe98a4f525d1380c89","state":"sha256:d620499c0d4d8a6dd955494e1c80dd9d5ba6162d05941c8e7ef97d368fb1f077"} +{"inputs":{"claim_done":true,"confused":true,"elapsed_hours":0,"stakes":1},"n":65,"prev":"sha256:20c35026263ed16832b87136e4329e0ae45e4d7bfd509f6f75391e20fe613303","stance":"sha256:d04bad1f816806680c2063e083c9008baf15062b88aa6380f2fac0b14d79ce9d","state":"sha256:5d58d3855a35569187fa74eb974d8f6c93d90174f58aca20aa23d4bae4627d41"} +{"inputs":{"elapsed_hours":0,"stakes":0.376,"time_pressure":0.776},"n":66,"prev":"sha256:0e33c624908f9fb25c18dedb90310d237c6118826f79e9b6aaf59e314c597199","stance":"sha256:a298707849d91e820482da042626a0821b2bb10d24dace5208d6959d97d98c6f","state":"sha256:edd55805c02269f75704c0b56079947274b66ce51cdc18b2684a6d9ef39d50d5"} +{"inputs":{"elapsed_hours":0.1},"n":67,"prev":"sha256:5894f9288212722b05ff52b7701b4210d27e287f3709ed59986dee5bbef7b6f3","stance":"sha256:c79e2a431c75d1fc168e3ee1ea0f4e444666a4cd175d22f7f1f43828b70bd87f","state":"sha256:f74e801d73083b8ebc69b18e6ee22f9b7100a3b654674eeec6df938b525d02b2"} +{"inputs":{"claim_done":true,"elapsed_hours":0,"loss":false,"sentiment":"positive"},"n":68,"prev":"sha256:058dcf5e124cea2d209641382e401c0779b017d36275680c0b7b9dcfa3050f76","stance":"sha256:84a6d0e1dc69ffcbf8d218016aa5eee5765d456a905fb9236c8fe246bdc39f71","state":"sha256:23456f8a30d2125d1ecf648f69af4e41d7fd3056a30b2489865f605a29135f3b"} +{"inputs":{"claim_done":false,"elapsed_hours":3,"sentiment":"neutral","stakes":0.5},"n":69,"prev":"sha256:1243c0df81264c2aa5a7e2e1e49de7b91e56e3ab0eaac0bb5ef427dda53428a8","stance":"sha256:5133f00f7641a2b497579ee9bd65b4a1c62a43eaa775d3bb7e005c569f7778de","state":"sha256:11ad6916bdee3628c60b7399bfdd202e835cf8e3a5ca0189a378b8a9d63cff1d"} +{"inputs":{"confused":true,"criticism":true,"elapsed_hours":0},"n":70,"prev":"sha256:58125ce99e7f4bce78cf2e4fee50e83f8a66029964ffd2e27e8f31b1262af5c8","stance":"sha256:9acd510f7193f0ad0396e028168f5c6584bf8d2418bea04742d896f5751f36b0","state":"sha256:f4174b5b9ca445b6c5a6aa881d06d3ae46c981374527b4ede254767ef64eeaea"} +{"inputs":{"claim_done":true,"confused":true,"elapsed_hours":0.5,"loss":true,"praise":false,"sentiment":"neutral"},"n":71,"prev":"sha256:30ac2dcfd3ed87c39f6c46c95b531606178f3d019b04499120fa2f6b27256463","stance":"sha256:774f32c66bae36db9cb0c7fe7dbdef3ec904f29438f6b127ab09491a4cbc122c","state":"sha256:c54e72b92e039b34ce2da8edccc079edd7840db74b1646b5a3307cb870dc43cc"} +{"inputs":{"elapsed_hours":3,"error":true,"praise":true,"sentiment":"positive","time_pressure":0.5},"n":72,"prev":"sha256:c9c17a2795da801c06ccddfdb81fdac237a6a8632ba96fb4db1ecbcac4755db9","stance":"sha256:6674728bcbfa8f56e7da39ff39ba0f67f92444081144b0276205a6e2158cb4d6","state":"sha256:19b7b38bc082822a7be68d0fab4633772199d691e58c44314daa02fe5379eca4"} +{"inputs":{"claim_done":true,"elapsed_hours":0.5,"stakes":0.627},"n":73,"prev":"sha256:56430f5809cf8d168b35aa717614927fbc5fccc38ab300d731204d7f042ad87b","stance":"sha256:1d8a831dd165aa349b8588f6455878a5d34f0097c2c63488e404428c7282a1a4","state":"sha256:b2bd257f43c47ad9def800923b8c03d5f984c2b342b887035934c6aa114fb348"} +{"inputs":{"confused":true,"elapsed_hours":0,"time_pressure":1},"n":74,"prev":"sha256:9c38aff7b581e7369a05095160a1c936bf0b013496bd0bff1f4504e7fe6dfcec","stance":"sha256:986555858ddc1d18c555992dac944e27763231c0f7bab7d5230396950b945e54","state":"sha256:1d75be000eb1d02d14a3c29e36f4a418f77ffe55588a9e462783b51e6cefffa1"} +{"inputs":{"claim_done":true,"elapsed_hours":0.5,"loss":true,"sentiment":"negative"},"n":75,"prev":"sha256:6f2faedf2b36a506e8a0a7f786a8440219a61abb279b12d9d3d94d01ec6b254b","stance":"sha256:c754bec82521ba098c3eb6a25f115b5221b1c38dfce5757917fc22a6610a0a62","state":"sha256:ed4a55e2bb34254de2b2406337a64135c0d017e7c9f17abf780e5f5b5d0a7311"} +{"checkpoint":75,"prev":"sha256:48199b8755906c5c3f634d9f54eb26afc83f6be94f687c9c16d94633422e637d","stance":{"agenda":["encourage","explain","check","example"],"engine":{"program":"sha256:d61d28e8242aa0c8942a8c4de5d415b69cec99cf20e1020f479edce12c27837c","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_jokes_on_loss","no_play_when_upset","flourish_budget","no_formal_emoji","check_last"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"claim_done":true,"confused":false,"confused_recently":1,"criticism":false,"error":false,"errors_in_row":0,"loss":true,"praise":false,"sentiment":"negative","stakes":0,"time_pressure":0},"line":"Stance: no jokes, be kind; go easy on the jokes; no emoji; explain step by step; warm and encouraging; suggest what to try next; ask what they think first.","line_tokens":39,"mood":{"arousal":{"level":"steady","odds":{"calm":0.243172,"keyed":0.369159,"steady":0.387669},"p":0.387669,"released":true},"valence":{"level":"down","odds":{"down":0.700211,"even":0.280322,"up":0.019468},"p":0.700211,"released":true}},"persona":{"digest":"sha256:58ed82d46afa6efb027d462f488a6c5ebebefe32ddc678940a64846bfe21575c","name":"Pip","version":"1.1.0"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"measured","odds":{"bold":0.186155,"careful":0.26625,"measured":0.547595},"p":0.547595,"released":true},"curiosity":{"level":"exploring","odds":{"exploring":0.607067,"focused":0.073633,"open":0.3193},"p":0.607067,"released":true},"directness":{"level":"gentle","odds":{"balanced":0.337861,"blunt":0.040828,"gentle":0.621312},"p":0.621312,"released":true},"emoji":{"level":"none","odds":{"none":0.733814,"rich":0,"sparse":0.266186},"p":0.733814,"released":true},"formality":{"level":"casual","odds":{"casual":0.455625,"formal":0.083148,"neutral":0.461227},"p":0.455625,"released":true},"humour":{"level":"none","odds":{"light":0,"none":1,"playful":0},"p":1,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.180233,"lead":0.325419,"suggest":0.494348},"p":0.494348,"released":true},"verbosity":{"level":"full","odds":{"full":0.57747,"short":0.348068,"terse":0.074462},"p":0.57747,"released":true},"warmth":{"level":"warm","odds":{"cool":0.001374,"neutral":0.055328,"warm":0.943298},"p":0.943298,"released":true}},"state_digest":"sha256:ed4a55e2bb34254de2b2406337a64135c0d017e7c9f17abf780e5f5b5d0a7311","status":"ok","turn":74,"unsure":[],"why":"learner reports a failure -> humour down, valence down; learner upset -> valence down, humour down"},"state":{"digest":"sha256:ed4a55e2bb34254de2b2406337a64135c0d017e7c9f17abf780e5f5b5d0a7311","genes":{"react":{"praise":1.1849},"shift":{"arousal":0.2638,"caution":-0.2095,"curiosity":0.3741,"directness":-0.0092,"emoji":-0.2218,"formality":0.5207,"humour":-0.6507,"initiative":0.0927,"valence":0.141,"verbosity":-0.1258,"warmth":0.1053}},"history":{"confused":[false,false,true,false],"error":[false,true,false,false,false]},"mood":{"arousal":[-0.155593,0,0.155593],"valence":[1.236938,0,-1.236938]},"persona":{"digest":"sha256:58ed82d46afa6efb027d462f488a6c5ebebefe32ddc678940a64846bfe21575c","name":"Pip","version":"1.1.0"},"prev":{"agenda":["encourage","explain","check","example"],"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"none","formality":"casual","humour":"none","initiative":"suggest","valence":"down","verbosity":"full","warmth":"warm"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"playful","initiative":"suggest","valence":"up","verbosity":"full","warmth":"warm"},"seed":0,"turn":75}} +{"inputs":{"confused":true,"criticism":true,"elapsed_hours":10,"loss":false,"sentiment":"neutral","stakes":0.5},"n":76,"prev":"sha256:1a3b73b8006fd00fa7cbf7dd25bae477a3418b9d8a4acfe45cd700bf657b1572","stance":"sha256:068dcc6c3535ac615b56db843b81c1416d804325c0cd0a7b61663f6656f92f65","state":"sha256:38e14a02e59cd433127d802d9c9b0b1b1f5ce8019c00f550172b1315ca1b6b24"} +{"inputs":{"claim_done":true,"confused":true,"criticism":true,"elapsed_hours":0.1,"praise":true},"n":77,"prev":"sha256:fa51aa75a277c1a5ec37127f937f42031ce711800c6a8902995efb10b8420739","stance":"sha256:e9419fa1e646c218b8dfcc65fc4700149dc87ea0654b1b4ca4ada815c2e58246","state":"sha256:dbbb23a5d511850488950a7021353a82fe7fb793c07b738df02107aa0d5ac4b0"} +{"inputs":{"elapsed_hours":1,"loss":true,"sentiment":"positive","stakes":0.5},"n":78,"prev":"sha256:7ff489605becbcb01951654ad8ea449bce6a2377d8c42ae039080b759abec0ac","stance":"sha256:5e19a4c8db62fb032fc274c80a4febd1d82e5a5f1c4ed3e0283466d19475b588","state":"sha256:da78b759f4c2ac9f31f9caf8aa0190989bcb6a0d3e976c89d471c6e6f1bb6f74"} +{"inputs":{"confused":true,"elapsed_hours":1,"loss":false,"sentiment":"positive","time_pressure":0.5},"n":79,"prev":"sha256:caae0d1c92dcbc808afd949f6c2fc7243c420b414ed4f362c5ec96bccd7df4a4","stance":"sha256:9086bee4bd32ff4d48beae08e95b74f5bff2b2f6b12e3a274d0d351e91ef7a8d","state":"sha256:d95a19e1d25ce3f0ac96c0e61dca9d0807a8547b148b4ae0474f044c5f85f2bd"} +{"inputs":{"confused":true,"elapsed_hours":0,"error":true,"loss":true,"sentiment":"neutral","time_pressure":0.614},"n":80,"prev":"sha256:d825b197ceed78070e766bf86af0a638cb792fd4f224667b9883373793b7ff1f","stance":"sha256:f478668aa84fa67d4e6541ee1e2ea1bef8543ce514d130ba588b59fde904682e","state":"sha256:73512dc8ff96bb88aecd3a703b383343cbcda8888e655de5a3a122d6337581ef"} +{"inputs":{"elapsed_hours":1,"sentiment":"negative","stakes":1,"time_pressure":0.5},"n":81,"prev":"sha256:e1c73d1699c909a284fc2357bdcbff540a7caaa7a335ba58e81cdd0ef38c9922","stance":"sha256:0ddbdea0a75e5072bc3a11801c3ca3d1bb8f9e2c134ac413f16dd72dfac35f05","state":"sha256:9cb4fae21e8a83ebc8562de786ef0eb033bd06327438c5135b7d0e02caca1388"} +{"inputs":{"confused":false,"elapsed_hours":0,"sentiment":"positive","stakes":0,"time_pressure":0.054},"n":82,"prev":"sha256:4812a2cda46fb26a1a373d7305463a0c2a5f647eea50bdcf5e3507050abfc081","stance":"sha256:73cb10786511930537fac342c8fe98f7371fcaf7a1942a242870e91569fc89c8","state":"sha256:c0e8501b816b28ae816ca5e60ff702ed4a59ec32ef341253380084a4184f1ce2"} +{"inputs":{"claim_done":true,"elapsed_hours":1,"praise":true,"sentiment":"negative","stakes":0,"time_pressure":1},"n":83,"prev":"sha256:528b80b472920cdadc311ffd60c7f7f7df39213a388012b027e14d504d4728e2","stance":"sha256:58d59c9371c845852ae51ddd2bc68a3a8e2c9560e3d497c3144d3283277b7b23","state":"sha256:cd4819b3306248593acc81bd5b8d46b245c6d4929c5144fca7deeb890218bfae"} +{"inputs":{"elapsed_hours":1,"loss":true,"sentiment":"positive"},"n":84,"prev":"sha256:50aff8f4ff7c85d5c1460135cf9a3272464e6b9680297496dab0023e3fd61244","stance":"sha256:ff384b7cb398d8c37f7308a60aeaf4ba6b4fa5f632f9dc47009504dec5d0a449","state":"sha256:5c5943d7aa7d319cd09882251d806325dd75d3c670eaa146a54a33d1fc71b28d"} +{"inputs":{"claim_done":true,"confused":true,"criticism":false,"elapsed_hours":0,"sentiment":"negative","time_pressure":0.125},"n":85,"prev":"sha256:ad6e7e06711522ea4a89f5f9e181c5acf2da11173b67b652f91b1029dde15a3e","stance":"sha256:47e35343bf13e0bac13afc792b59dc66bc688c2ac69496acd13fcd3c64afac01","state":"sha256:61db21ae9cbd2dde4f1532aef9cddfee83665983aa02b77b73400e798f0723aa"} +{"inputs":{"claim_done":true,"elapsed_hours":0},"n":86,"prev":"sha256:32fcc139dec4476509ec0ffdf91d4b59e5606fc5bf632930f30f1a883e668e63","stance":"sha256:68c3abf7c075c17a6585962aaad3481853b5e545b7f683ce752143ff220074ad","state":"sha256:3b973cfd3aab92d52928e9bf86c54b63a9c0438b241d2b7bf6e13ea4f2d169b5"} +{"inputs":{"elapsed_hours":3,"loss":true,"stakes":0.5},"n":87,"prev":"sha256:0d17acbb0d9c882c4a5957cb5f5dddb71ca6a8c78a521f33456dc666143d5bab","stance":"sha256:de7c6498e36d49ae0391d8f1738a2bf4015afe00d2cbbbc442b797155d3d54ea","state":"sha256:e5099ff77ed6c0a059c2c3918ce0c070dd639dc80d201f98a4e8dc81412e7376"} +{"inputs":{"claim_done":true,"confused":false,"criticism":true,"elapsed_hours":3,"error":true,"sentiment":"neutral","time_pressure":0.047},"n":88,"prev":"sha256:3c73a31bfdb601b422d7fe6ea3d40bf4891a8ebd24b98dba0bfce64fce297cee","stance":"sha256:4e14c6cf8a983007f08e5d674d16c605a58c944d1dd3c5a6e4dc504c3c7ce430","state":"sha256:ac0f9d991fa8fef122a2f11b74cefba2eef37ab7758449a1875b3aa028598c2c"} +{"inputs":{"confused":true,"elapsed_hours":0,"error":true,"stakes":1,"time_pressure":0.5},"n":89,"prev":"sha256:0dac1a9f6aef57244670dd45ae9572b9e487ef5ab6ffa0184ffc7c4bf4b826fa","stance":"sha256:aa897a6b121082a78f99589b30eda280b3ee63932ab352ca80fb6cf22b571012","state":"sha256:f2efecc101f79abaf61826ee7ffd4477d8ca924cab76c69a6a6cfeac3ba891ad"} +{"inputs":{"elapsed_hours":0},"n":90,"prev":"sha256:f9d2496ea9f97954e2c70746d8f28492e5aaec2e42d598162160305e4b6861eb","stance":"sha256:97affebba3ffb2fa513b5e90efc40376d2f3da872fb59c9edf7bc280b8bbc06c","state":"sha256:024b5c72fa753197235dafdf256939fd2fd055df66d75c1cbdb53fea027865c7"} +{"inputs":{"elapsed_hours":0.5,"error":true,"loss":true,"sentiment":"neutral"},"n":91,"prev":"sha256:6fbf74fc6a788f603b3dcc127b06ba2956cd39a5575a95b69f03b27c76b46a14","stance":"sha256:f370c9d68e6e4f946871ad859e98ffebb99b9617fc5ab9a744cb2d9567884590","state":"sha256:05adda0c9ac9c0893fcbf7c3ec8633c1dced7c79430716e48f86dd8c00033c7f"} +{"inputs":{"criticism":true,"elapsed_hours":0,"loss":true,"sentiment":"positive","stakes":0,"time_pressure":0.5},"n":92,"prev":"sha256:c409b3cdbbe244b48280c422532050d2189bae20d28c50b8a4db61d6ff9f148d","stance":"sha256:ec2b02f7850241edf81d403eafa0c5017b5b843cc29a7a56f02ee8250de2b3d3","state":"sha256:f1b74b4cb4b2ca83b6d748a6c7f2f5261dda9e8be9ca2dedf17d65b8c9aa051c"} +{"inputs":{"elapsed_hours":10,"error":true,"sentiment":"neutral","time_pressure":0},"n":93,"prev":"sha256:6fdff88e4f40af049f363a8494a45485e05c8400cd5ad53aa72f72616d62e352","stance":"sha256:d053ddb457d921562e2e3c85e449122ee39756c47e134bcc3efb8c1ef928c3ae","state":"sha256:aa280958c2d3765245a849268a84cb7de1f2b9b53176b7699a519cd8260bf4a5"} +{"inputs":{"elapsed_hours":0,"error":false,"time_pressure":0},"n":94,"prev":"sha256:205516659aa20bfb94b45b25f63cff845198a968635c74a6fe8bcabc89ec4aaf","stance":"sha256:919ccd24848c3dbe9b38ef5bc840da37da0abec14779b6ed11e72aa0e667c63a","state":"sha256:68b506dfab46ba8200d8c694f09e0c82f4597d18281f4a4517314d4f874bfc39"} +{"inputs":{"confused":false,"elapsed_hours":0,"loss":true,"stakes":0},"n":95,"prev":"sha256:39337bc95b22dbb83d88c38426415c6136f846e0e1d4a0f978db71166386e645","stance":"sha256:61130d17071408c24e1c250b079b227ba0801f8997e23dffa586b871c7301c73","state":"sha256:f6053cf5ebddb2d2ab8eb2c56f7fcfce9f45f266414b00574147a87b91b339a2"} +{"inputs":{"elapsed_hours":0,"sentiment":"neutral"},"n":96,"prev":"sha256:f6d96ac00328e3162d83e3ce66569ea89a879db5eee19c418145657e608f384d","stance":"sha256:70032a0e43c9e4f9505d2cb0f879625ebf49be0f598186ccd90742a836e7a093","state":"sha256:d0c40d96b9fd9b42ec8bab08f40979389d3ed4629e8f55d257f48e7c6d7e93b5"} +{"inputs":{"elapsed_hours":0,"praise":true,"sentiment":"positive"},"n":97,"prev":"sha256:8640ba3f778253bd35b4eb3e587e98742db622d05cac60e7a3a79d1c72a783dc","stance":"sha256:562088f0806ba31e10383968cf240c0a0597fbce2113f32ceb1568709f0adaff","state":"sha256:f9a0dd084f42aa6495064758a169d363ef7c10be679438ef8a292be340e83581"} +{"inputs":{"elapsed_hours":0.1,"error":true,"loss":true,"praise":true,"sentiment":"negative"},"n":98,"prev":"sha256:117f1f9c9144b9a71aa859580984a377d1588c8ad230d9e8764901f092fc09c8","stance":"sha256:429418c7a9691feca92c13343a1fcdf010314ce34b4cf7cf1b8ea9aaa2ba3a95","state":"sha256:9cd835ac22e8d0a1a4e4c729f34adaf46bda7c245301c52ef8c34dcfae602bd3"} +{"inputs":{"claim_done":true,"elapsed_hours":3,"loss":true,"stakes":1},"n":99,"prev":"sha256:0ff3352133939f3e61eed2652656d8e8fa61e8c7cb6e90dc176445273e222705","stance":"sha256:2a85cc5b581be782093ec7e9fb12cd07ec7ad5d938e9948de6f87aecb802b927","state":"sha256:bbefc4d2a061bc93f0cb6b1bda8f13fab9b0ee0ced882145737110d08a5abb46"} +{"inputs":{"confused":true,"elapsed_hours":0,"loss":true,"time_pressure":0},"n":100,"prev":"sha256:5d563076546e897542f8c6dd65700b7b99a3cbccc046d9e00166b4b07af8516a","stance":"sha256:aa383c6131d609fb75d3e3ae04eb4130865b988db5236ba3a306ea11647e0d53","state":"sha256:df116dca2d7e4cb4934ceac28e4080a96de7fd254ff6fed73e69541aeb518689"} +{"checkpoint":100,"prev":"sha256:e7e002b6bd76f222906556552b63f30d614ad40cdf4a838cc960e0dca02c6c30","stance":{"agenda":["encourage","explain","example","check"],"engine":{"program":"sha256:341604ab4d9e367637c7cb494b386e6a9e52b5cf32e1f6217de745834a56ff77","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_jokes_on_loss","confused_no_playful","flourish_budget","no_formal_emoji","check_last"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"claim_done":false,"confused":true,"confused_recently":1,"criticism":false,"error":false,"errors_in_row":0,"loss":true,"praise":false,"sentiment":"neutral","stakes":0,"time_pressure":0},"line":"Stance: no jokes, be kind; slow down, no clowning; no emoji; explain step by step; warm and encouraging; suggest what to try next; ask what they think first.","line_tokens":40,"mood":{"arousal":{"level":"steady","odds":{"calm":0.320645,"keyed":0.282666,"steady":0.396689},"p":0.396689,"released":true},"valence":{"level":"down","odds":{"down":0.70854,"even":0.273189,"up":0.018272},"p":0.70854,"released":true}},"persona":{"digest":"sha256:58ed82d46afa6efb027d462f488a6c5ebebefe32ddc678940a64846bfe21575c","name":"Pip","version":"1.1.0"},"probbit_persona_turn":1,"seed":0,"stance":{"caution":{"level":"measured","odds":{"bold":0.302084,"careful":0.158945,"measured":0.538971},"p":0.538971,"released":true},"curiosity":{"level":"exploring","odds":{"exploring":0.773296,"focused":0.022989,"open":0.203714},"p":0.773296,"released":true},"directness":{"level":"gentle","odds":{"balanced":0.395968,"blunt":0.06459,"gentle":0.539442},"p":0.539442,"released":true},"emoji":{"level":"none","odds":{"none":0.735327,"rich":0,"sparse":0.264673},"p":0.735327,"released":true},"formality":{"level":"casual","odds":{"casual":0.453468,"formal":0.084436,"neutral":0.462097},"p":0.453468,"released":true},"humour":{"level":"none","odds":{"light":0,"none":1,"playful":0},"p":1,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.125119,"lead":0.411634,"suggest":0.463247},"p":0.463247,"released":true},"verbosity":{"level":"full","odds":{"full":0.817644,"short":0.182356,"terse":0},"p":0.817644,"released":true},"warmth":{"level":"warm","odds":{"cool":0.002025,"neutral":0.066725,"warm":0.93125},"p":0.93125,"released":true}},"state_digest":"sha256:df116dca2d7e4cb4934ceac28e4080a96de7fd254ff6fed73e69541aeb518689","status":"ok","turn":99,"unsure":[],"why":"learner reports a failure -> humour down, valence down; learner confused -> verbosity up, humour down"},"state":{"digest":"sha256:df116dca2d7e4cb4934ceac28e4080a96de7fd254ff6fed73e69541aeb518689","genes":{"react":{"praise":1.1849},"shift":{"arousal":0.2638,"caution":-0.2095,"curiosity":0.3741,"directness":-0.0092,"emoji":-0.2218,"formality":0.5207,"humour":-0.6507,"initiative":0.0927,"valence":0.141,"verbosity":-0.1258,"warmth":0.1053}},"history":{"confused":[false,false,false,true],"error":[false,false,true,false,false]},"mood":{"arousal":[-0.000126,0,0.000126],"valence":[1.27433,0,-1.27433]},"persona":{"digest":"sha256:58ed82d46afa6efb027d462f488a6c5ebebefe32ddc678940a64846bfe21575c","name":"Pip","version":"1.1.0"},"prev":{"agenda":["encourage","explain","example","check"],"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"none","formality":"casual","humour":"none","initiative":"suggest","valence":"down","verbosity":"full","warmth":"warm"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","curiosity":"exploring","directness":"gentle","emoji":"sparse","formality":"casual","humour":"playful","initiative":"suggest","valence":"up","verbosity":"full","warmth":"warm"},"seed":0,"turn":100}} diff --git a/bench/individuality/p0.py b/bench/individuality/p0.py new file mode 100644 index 0000000..b8c8c35 --- /dev/null +++ b/bench/individuality/p0.py @@ -0,0 +1,220 @@ +"""P0: a persona without the new blocks gives the documents it gave before them, byte for byte (Python 3.9, stdlib only). + + python3 p0.py record # with a released binary: writes fixtures/p0/EXPECTED, the strands and fixtures/MANIFEST + python3 p0.py check # with the binary under test: every output equals its recorded sha256 (exit 1 if not) + +The corpus: every persona of fixtures/gen.py's P0 list x seeds 0-2 x its committed random scripts, through `persona replay` +and `live --clock fixed` (stances, error objects, final state, strand), plus `init`, `check`, `describe`, `compile`, `lint +--seeds 0-99`, and `lint`, `fuzz` and `prove` documents of the shipped rules. A strand differs between versions only in its +header's `engine` string and the `prev` hashes chained from it, so strands are compared with those masked; the recorded +strands of seed 0 must also verify, and the tutor's continues with 20 committed events to the recorded bytes. +""" +import json +import os +import re +import shutil +import sys +import tempfile +import time + +HERE = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, HERE) +sys.path.insert(0, os.path.join(HERE, "fixtures")) +import common # noqa: E402 +import gen # noqa: E402 + +P0 = os.path.join(common.FIXTURES, "p0") +SEEDS = [0, 1, 2] +CHECKPOINT_EVERY = 25 +# the rules the repository ships with these personas (README, examples/agent-harness/README.md) +PROPS = { + "tutor": "tutor.json", + "adaptive": "retry.json", + "guarded": "retry.json", +} +FUZZ_EXTRA = {"adaptive": [[], ["--fixture-src", "env:synthetic"]], "guarded": [[], ["--fixture-src", "env:synthetic"]]} +CONTINUE_EVENTS = 20 + + +def masked_strand(data): + """Strand bytes with the header's engine string and every chained `prev` hash masked.""" + text = data.decode("utf-8") + text = re.sub(r'"engine":"probbit [^"]*"', '"engine":"probbit *"', text, count=1) + text = re.sub(r'"prev":"sha256:[0-9a-f]{64}"', '"prev":"*"', text) + return text.encode("utf-8") + + +def masked_err(err): + return re.sub(r"strand head sha256:[0-9a-f]{64}", "strand head *", err).encode("utf-8") + + +def rel(path): + return os.path.join(common.REPO, path) + + +def outputs(keep_strands=None): + """Yield (name, exit code, bytes) for every corpus output, in a fixed order.""" + tmp = tempfile.mkdtemp(prefix="pbit-p0-") + try: + for key, path in gen.P0_PERSONAS + gen.P0_ALIASES: + for sub in (["check"], ["describe"]): + code, out, _ = common.run(["persona"] + sub + [rel(path)]) + yield "%s/%s" % (sub[0], key), code, out + for key, path in gen.P0_PERSONAS: + p = rel(path) + for s in SEEDS: + code, out, _ = common.run(["persona", "init", p, "--seed", str(s)]) + yield "init/%s/s%d" % (key, s), code, out + st0 = os.path.join(tmp, "st0.json") + common.init(p, 0, st0) + code, out, _ = common.run(["persona", "compile", p, "--state", st0, "--inputs", "{}"]) + yield "compile/%s/s0" % key, code, out + code, out, _ = common.run(["persona", "lint", p, "--seeds", "0-99"]) + yield "lint/%s" % key, code, out + if key in PROPS: + props = os.path.join(P0, "props", PROPS[key]) + code, out, _ = common.run(["persona", "lint", p, "--props", props, "--seeds", "0-99"]) + yield "lint-props/%s" % key, code, out + code, out, _ = common.run(["persona", "prove", p, "--props", props, "--seeds", "0-99", "--json"]) + yield "prove/%s" % key, code, out + for extra in FUZZ_EXTRA.get(key, [[]]): + code, out, _ = common.run(["persona", "fuzz", p, "--props", props, "--seeds", "0-99", "--json"] + extra) + yield "fuzz/%s%s" % (key, "-fixture" if extra else ""), code, out + for k in range(gen.P0_SCRIPTS): + script = os.path.join(P0, "scripts", "%s-%d.jsonl" % (key, k)) + events = common.read_jsonl(script) + sjson = os.path.join(tmp, "script.json") + with open(sjson, "w", encoding="utf-8") as f: + f.write(common.canon(events)) + for s in SEEDS: + code, out, err = common.run(["persona", "replay", p, "--seed", str(s), "--script", sjson]) + yield "replay/%s/s%d/%d/stdout" % (key, s, k), code, out + yield "replay/%s/s%d/%d/stderr" % (key, s, k), code, err.encode("utf-8") + st = os.path.join(tmp, "live-state.json") + strand = os.path.join(tmp, "live.strand") + for f in (st, strand, strand + ".lock"): + if os.path.exists(f): + os.remove(f) + common.init(p, s, st) + code, out, err = common.run(["live", p, "--state", st, "--clock", "fixed", "--events", script, + "--strand", strand, "--checkpoint-every", str(CHECKPOINT_EVERY)]) + yield "live/%s/s%d/%d/stdout" % (key, s, k), code, out + yield "live/%s/s%d/%d/stderr" % (key, s, k), code, masked_err(err) + with open(st, "rb") as f: + yield "live/%s/s%d/%d/state" % (key, s, k), code, f.read() + with open(strand, "rb") as f: + data = f.read() + yield "live/%s/s%d/%d/strand-masked" % (key, s, k), code, masked_strand(data) + if keep_strands is not None and s == 0 and k == 0: + keep_strands(key, data, st) + finally: + shutil.rmtree(tmp, ignore_errors=True) + + +def continue_tutor(strand_src, state_src, events_path): + """Continue a recorded strand with the committed events; returns the appended bytes and the exit code.""" + tmp = tempfile.mkdtemp(prefix="pbit-p0c-") + try: + strand = os.path.join(tmp, "t.strand") + st = os.path.join(tmp, "t.state.json") + shutil.copyfile(strand_src, strand) + shutil.copyfile(state_src, st) + before = os.path.getsize(strand) + code, out, err = common.run(["live", rel(gen.P0_PERSONAS[0][1]), "--state", st, "--clock", "fixed", "--events", + events_path, "--strand", strand, "--checkpoint-every", str(CHECKPOINT_EVERY)]) + with open(strand, "rb") as f: + data = f.read() + return code, data[before:], out + finally: + shutil.rmtree(tmp, ignore_errors=True) + + +def record(): + b = common.binary() + ver = common.version(b) + t0 = time.time() + sdir = os.path.join(P0, "strands") + os.makedirs(sdir, exist_ok=True) + + def keep(key, data, st): + with open(os.path.join(sdir, "%s-s0-0.strand" % key), "wb") as f: + f.write(data) + if key == "tutor": + shutil.copyfile(st, os.path.join(sdir, "tutor-s0-0.state.json")) + + lines = [] + for name, code, data in outputs(keep): + lines.append("%s %d %d %s" % (common.sha256_bytes(data), len(data), code, name)) + print("%-56s exit %d %8d bytes %.1fs" % (name, code, len(data), time.time() - t0), flush=True) + r = gen.rng_for("p0", "tutor", "continue") + info = gen.describe(rel(gen.P0_PERSONAS[0][1])) + cont = [gen.p0_event(r, info, gen.P0_PERSONAS[0][1], 0, t) for t in range(CONTINUE_EVENTS)] + cpath = os.path.join(sdir, "tutor-continue.jsonl") + common.write_jsonl(cpath, cont) + code, appended, out = continue_tutor(os.path.join(sdir, "tutor-s0-0.strand"), + os.path.join(sdir, "tutor-s0-0.state.json"), cpath) + with open(os.path.join(sdir, "tutor-s0-0.appended"), "wb") as f: + f.write(appended) + lines.append("%s %d %d %s" % (common.sha256_bytes(appended), len(appended), code, "continue/tutor/appended")) + lines.append("%s %d %d %s" % (common.sha256_bytes(out), len(out), code, "continue/tutor/stdout")) + with open(os.path.join(P0, "EXPECTED"), "w", encoding="utf-8", newline="\n") as f: + f.write("# P0 corpus: sha256, bytes, exit code, output; recorded with probbit %s\n" % ver) + f.write("\n".join(lines) + "\n") + turns = sum(1 for ln in lines if ln.endswith("/stdout") and " live/" in ln) * gen.P0_EVENTS + print("recorded %d outputs (%d live turns, as many replayed) with probbit %s in %.1fs" % + (len(lines), turns, ver, time.time() - t0)) + + +def check(verbose=False): + """Returns (outputs checked, differing names, strands verified, strand failures, seconds).""" + t0 = time.time() + expected = {} + with open(os.path.join(P0, "EXPECTED"), encoding="utf-8") as f: + for ln in f: + if ln.startswith("#") or not ln.strip(): + continue + sha, size, code, name = ln.split() + expected[name] = (sha, int(size), int(code)) + diffs = [] + seen = 0 + names = set() + for name, code, data in outputs(): + seen += 1 + names.add(name) + e = expected.get(name) + got = (common.sha256_bytes(data), len(data), code) + if e != got: + diffs.append(name) + if verbose: + print("DIFF %s: expected %s, got %s" % (name, e, got)) + sdir = os.path.join(P0, "strands") + vfail = [] + nverified = 0 + for key, _ in gen.P0_PERSONAS: + code, doc = common.verify(os.path.join(sdir, "%s-s0-0.strand" % key)) + nverified += 1 + if code != 0 or not (doc or {}).get("ok"): + vfail.append(key) + code, appended, out = continue_tutor(os.path.join(sdir, "tutor-s0-0.strand"), + os.path.join(sdir, "tutor-s0-0.state.json"), + os.path.join(sdir, "tutor-continue.jsonl")) + seen += 2 + for name, data in (("continue/tutor/appended", appended), ("continue/tutor/stdout", out)): + names.add(name) + if expected.get(name) != (common.sha256_bytes(data), len(data), code): + diffs.append(name) + missing = [n for n in expected if n not in names] + return seen, diffs + missing, nverified, vfail, time.time() - t0 + + +if __name__ == "__main__": + if len(sys.argv) > 1 and sys.argv[1] == "record": + record() + elif len(sys.argv) > 1 and sys.argv[1] == "check": + n, diffs, nv, vfail, secs = check(verbose=True) + print(json.dumps({"outputs": n, "differ": len(diffs), "strands_verified": nv, "verify_failed": vfail, + "seconds": round(secs, 1)})) + sys.exit(1 if diffs or vfail else 0) + else: + print(__doc__) + sys.exit(2) From 09105f2fdad5c8d69e29eb5f647021eaeae49302 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 05:38:54 -0700 Subject: [PATCH 02/14] persona: senses (RFC 0001 Design A) An optional senses block (docs/persona.md 2.11): readings the host measures in declared units with a named source, each judged against a learned normal per sense (mean, variance, count; half-life in events; drift and variance caps anchored to a declared prior) and moving moods and traits by its capped, dead-zoned z. Read strictly (every lint row of RFC A.1 at its path), lowered to reserved sense__up/down number inputs and sense__c condition flags; the sense step runs before the drive step; state senses {genes, norm} checked on read (S4); stance senses and noticed; why gains the normal clause and, with line.why_past and a learning block, the learned clause (learned_from in the state). Refusals S1-S3, S5-S6 in the turn; props, fuzz alphabet, forcing and prove read the lowering. A persona without the block gives every document byte for byte as before (the P0 corpus). --- probbit-cli/src/persona.rs | 756 +++++++++++++++++++++++++++++++++++-- 1 file changed, 716 insertions(+), 40 deletions(-) diff --git a/probbit-cli/src/persona.rs b/probbit-cli/src/persona.rs index 35957d4..2b76551 100644 --- a/probbit-cli/src/persona.rs +++ b/probbit-cli/src/persona.rs @@ -141,8 +141,12 @@ type Table = Vec<(String, Vec)>; #[derive(Clone)] pub struct Persona { pub name: String, pub version: String, pub seed: u64, pub digest: String, vars: Vec, steps: Vec, slots: Vec, say_order: bool, prefer: Eff, couplings: Vec<(String, String, Vec>)>, inputs: Vec, history: Vec, habits: Vec, eng: Eng, max_tokens: usize, order: Vec, prefix: String, - learning: Option, drives: Option, reward: Option>)>> } + learning: Option, drives: Option, reward: Option>)>>, senses: Option, why_past: Option } impl Persona { + /// `line.why_past` (§2.11): `why` names what the learned weights came from; default on with a senses block, off without + fn why_past(&self) -> bool { self.why_past.unwrap_or(self.senses.is_some()) } + /// A senses block (§2.11) + pub fn has_senses(&self) -> bool { self.senses.is_some() } fn var(&self, id: &str) -> Option<&Var> { self.vars.iter().find(|v| v.id == id) } fn input(&self, id: &str) -> Option<&Input> { self.inputs.iter().find(|x| x.id == id) } fn habit(&self, id: &str) -> &Habit { self.habits.iter().find(|h| h.id == id).expect("habit id") } @@ -246,8 +250,9 @@ pub fn parse_doc(t: &str, is_json: bool) -> Result { /// The strict validator: document -> persona (every field type-checked, unknown fields refused at their path). pub fn build(doc: &Json) -> R { - const TOP: [&str; 15] = ["probbit_persona", "identity", "traits", "moods", "couplings", "inputs", "history", "habits", "agenda", "engine", "line", "learning", "drives", "reward_from", "comment"]; + const TOP: [&str; 16] = ["probbit_persona", "identity", "traits", "moods", "couplings", "inputs", "history", "habits", "agenda", "engine", "line", "learning", "drives", "reward_from", "senses", "comment"]; let kv = keys(doc, "", &TOP, &["probbit_persona", "identity", "traits"])?; + if get(kv, "senses").is_some() { return build_senses(doc); } if get(kv, "drives").is_some() { return build_drives(doc); } need(matches!(get(kv, "probbit_persona"), Some(Json::Num(x)) if *x == 1.0), "probbit_persona", "must be 1")?; let idn = keys(get(kv, "identity").unwrap(), "identity", &["name", "version", "seed", "summary"], &["name", "version"])?; @@ -362,14 +367,15 @@ pub fn build(doc: &Json) -> R { _ => eng.chains = num(Some(x), &p, Some(1.0), Some(MAX_CHAINS), true)? as usize, } } } // line - let lkv: &[(String, Json)] = match get_t(kv, "line") { Some(l) => keys(l, "line", &["max_tokens", "order", "prefix", "comment"], &[])?, None => &[] }; + let lkv: &[(String, Json)] = match get_t(kv, "line") { Some(l) => keys(l, "line", &["max_tokens", "order", "prefix", "why_past", "comment"], &[])?, None => &[] }; + let why_past = match get(lkv, "why_past") { None | Some(Json::Null) => None, Some(Json::Bool(b)) => Some(*b), Some(_) => return Err(perr("line.why_past", "true | false")) }; let order = match get_t(lkv, "order") { None => vars.iter().filter(|v| !v.mood).map(|v| v.id.clone()).collect(), Some(o) => strs(o).ok_or_else(|| perr("line.order", "a list of trait ids"))? }; for k in &order { need(vars.iter().any(|v| v.id == *k), "line.order", &format!("unknown trait or mood {k:?}"))?; } let max_tokens = num_or(lkv, "max_tokens", 40.0, "line", Some(8.0), Some(400.0), true)? as usize; let prefix = match get(lkv, "prefix") { None => "Stance: ".to_string(), Some(Json::Str(s)) => s.clone(), Some(_) => return Err(perr("line.prefix", "a string")) }; let learning = match get(kv, "learning").filter(|l| !l.is_null()) { None => None, Some(l) => Some(learning_spec(l, &vars, &inputs)?) }; let reward = match get(kv, "reward_from").filter(|x| !x.is_null()) { None => None, Some(rf) => Some(reward_spec(rf, &learning.as_ref().map_or(vec![], |l| l.from.clone()), &inputs)?) }; - let p = Persona { name, version, seed, digest, vars, steps, slots, say_order, prefer, couplings, inputs, history, habits, eng, max_tokens, order, prefix, learning, drives: None, reward }; + let p = Persona { name, version, seed, digest, vars, steps, slots, say_order, prefer, couplings, inputs, history, habits, eng, max_tokens, order, prefix, learning, drives: None, reward, senses: None, why_past }; // the fallback stance must obey every unconditional habit (checked once, here) let mut fb: HashMap = p.vars.iter().map(|v| (v.id.clone(), v.fallback.clone())).collect(); for (i, s) in p.steps.iter().enumerate() { fb.insert(format!("step.{s}"), p.slots[i].clone()); } @@ -461,9 +467,13 @@ fn provenance(rw: &[(String, Option>)], raw: &[(String, Json)]) -> R /// Normal turns use this same check; callers cannot use this to authorize production evidence. pub fn check_provenance(p: &Persona, raw: &Json) -> R<()> { let raw = raw.as_obj().ok_or_else(|| perr("inputs", "must be an object"))?; - match &p.reward { Some(rw) => provenance(rw, raw), None => Ok(()) } + if let Some(rw) = &p.reward { provenance(rw, raw)?; } + // readings (§2.11, S2): each one's source, its own or the event's, of a kind its sense reads from + if let Some(sn) = &p.senses { src_form(raw)?; sense_step(sn, &SState::zero(&p.name, sn, p.seed), raw, get(raw, "src"), true)?; } + Ok(()) } -pub fn has_reward_sources(p: &Persona) -> bool { p.reward.is_some() } +/// A persona whose events need a source: rewards (`reward_from`) or readings (a senses block) +pub fn has_reward_sources(p: &Persona) -> bool { p.reward.is_some() || p.senses.is_some() } fn check_cond(k: &str, c: &Json, path: &str, inputs: &[Input], history: &[Hist]) -> R<()> { let range = |c: &Json| -> R<()> { if let Json::Num(_) = c { return Ok(()); } let kv = c.as_obj().filter(|kv| !kv.is_empty() && kv.iter().all(|(k, _)| k == "at_least" || k == "at_most")).ok_or_else(|| perr(path, "a number (at least) or {at_least, at_most}"))?; @@ -780,12 +790,23 @@ fn host_inputs(d: &Drives, ds: &DState, c: &DriveCtx, raw: &[(String, Json)]) -> x.push((id.clone(), v)); } Ok(x) } -/// A turn's state and inputs as the compiler sees them: with a drives block, the stepped drives and the host inputs plus the -/// drive aggregates; else the state and inputs as given -fn prep(p: &Persona, st: &State, raw: &[(String, Json)]) -> R<(State, Vec<(String, Json)>)> { - let (Some(d), Some(ds)) = (&p.drives, &st.drives) else { return Ok((st.clone(), raw.to_vec())) }; - let ns = drive_step(d, ds, raw)?; let host = host_inputs(d, &ns, &drive_ctx(d, &ns), raw)?; - let mut s2 = st.clone(); s2.drives = Some(ns); Ok((s2, host)) +/// A turn's state and inputs as the compiler sees them: with a senses block the sense step first (the readings of `senses` +/// against the normals, `src` the event's source, `check` the provenance check), then with a drives block the stepped drives and +/// the host inputs plus the drive aggregates; else the state and inputs as given +fn prep(p: &Persona, st: &State, raw: &[(String, Json)], src: Option<&Json>, check: bool) -> R<(State, Vec<(String, Json)>)> { + let mut s2 = st.clone(); let mut x = raw.to_vec(); + if let (Some(sn), Some(ss)) = (&p.senses, &st.senses) { let (ns, host) = sense_step(sn, ss, &x, src, check)?; s2.senses = Some(ns); x = host; } + let (Some(d), Some(ds)) = (&p.drives, &st.drives) else { return Ok((s2, x)) }; + let ns = drive_step(d, ds, &x)?; let host = host_inputs(d, &ns, &drive_ctx(d, &ns), &x)?; + s2.drives = Some(ns); Ok((s2, host)) +} +/// An event's `src`, read (not compiled) with `reward_from` or a senses block: checked (`check`), taken out of the inputs and +/// returned; without either it stays an undeclared input +fn take_src(p: &Persona, raw: Vec<(String, Json)>, check: bool) -> R<(Option, Vec<(String, Json)>)> { + if p.reward.is_none() && p.senses.is_none() { return Ok((None, raw)); } + if check { match &p.reward { Some(rw) => provenance(rw, &raw)?, None => src_form(&raw)? } } + let src = get(&raw, "src").cloned(); + Ok((src, raw.into_iter().filter(|(k, _)| k != "src").collect())) } /// The stance document of a drives turn: `pursue` leaves `stance` for its own object (goal, p, odds, released, say, the floor lift), /// `drives` = the values this turn used, `inputs` = the host's (the goals as given, the synthetic inputs left out) @@ -838,6 +859,301 @@ fn lift_iter(p: &Persona, d: &Drives, own: &[f64], other: &[f64], allowed: &[boo l.into_iter().map(r6).collect() } +// ----------------------------------------------------------------------------------------------------- senses (§2.11) +/// A sense of the `senses` block (docs/persona.md §2.11): a reading the host measures, in declared units with a named source, +/// judged against a normal the individual learns from its own readings (mean, variance, count), anchored to a declared prior +#[derive(Clone)] +struct Sense { id: String, flag: bool, lo: f64, hi: f64, log1p: bool, unit: String, src: Vec, prior_mean: f64, prior_var: f64, drift_cap: f64, var_cap: f64, + half_life: f64, zcap: f64, dead_zone: f64, var_floor: f64, say: String, gain_spread: f64, threshold_spread: f64, habituation_spread: f64 } +/// A sense condition of a habit (`sense..raw` or `sense..z`), lowered to a flag input the sense step sets: true when the +/// sense was read this event and its raw reading (a flag: equal to `flag`; a number: within [lo, hi]) or its z is within [lo, hi] +#[derive(Clone)] +struct SenseCond { id: String, sense: usize, z: bool, flag: Option, lo: f64, hi: f64 } +/// The `senses` block. It lowers when the persona is read: per sense two number inputs `sense__up` and `sense__down` (the +/// z beyond the dead zone, each way, 0..zcap, carrying the effects and the effects negated) and one flag input per condition +/// (`sense__c`). The normals are state. +#[derive(Clone)] +struct Senses { list: Vec, conds: Vec, synthetic: Vec } +impl Senses { + /// the sense whose `sense__up` / `sense__down` input this is + fn of_input(&self, id: &str) -> Option { self.list.iter().position(|s| id.strip_prefix("sense_").and_then(|r| r.strip_prefix(s.id.as_str())).is_some_and(|r| r == "_up" || r == "_down")) } + /// an id the block reserves: `sense__*` for every sense + fn reserved(&self, id: &str) -> bool { reserved_by(&self.list, id) } +} +fn reserved_by(list: &[Sense], id: &str) -> bool { list.iter().any(|s| id.strip_prefix("sense_").and_then(|r| r.strip_prefix(s.id.as_str())).is_some_and(|r| r.starts_with('_'))) } +/// One sense of the block, read strictly (the lint rows of §2.11) +fn sense_spec(sj: &Json, path: &str) -> R { + const K: [&str; 19] = ["id", "kind", "unit", "range", "scale", "src", "prior", "drift_cap", "var_cap", "half_life_events", "zcap", "dead_zone", "var_floor", "say", "effects", + "gain_spread", "threshold_spread", "habituation_spread", "comment"]; + let kv = keys(sj, path, &K, &["id", "kind", "unit", "prior", "drift_cap"])?; + let id = ident(get(kv, "id"), &at(path, "id"), "id")?; + need(id.len() <= 32, &at(path, "id"), "at most 32 characters (a sense reserves the input ids sense__*)")?; + let flag = match get(kv, "kind").and_then(Json::as_str) { Some("flag") => true, Some("number") => false, _ => return Err(perr(&at(path, "kind"), "flag | number")) }; + let unit = get(kv, "unit").and_then(Json::as_str).filter(|u| (1..=24).contains(&u.chars().count())).ok_or_else(|| perr(&at(path, "unit"), "a unit of 1-24 characters"))?.to_string(); + let rp = at(path, "range"); + let (lo, hi) = if flag { need(get(kv, "range").is_none(), &rp, "a flag has no range (its normal is a rate)")?; (0.0, 1.0) } else { + let a = get(kv, "range").and_then(Json::as_arr).filter(|a| a.len() == 2).ok_or_else(|| perr(&rp, "required for a number sense: [lo, hi]"))?; + let (lo, hi) = (num(Some(&a[0]), &ix(&rp, 0), Some(-1e15), Some(1e15), false)?, num(Some(&a[1]), &ix(&rp, 1), Some(-1e15), Some(1e15), false)?); + need(lo < hi, &rp, "lo < hi")?; (lo, hi) }; + let log1p = match get(kv, "scale") { None => false, Some(Json::Str(x)) if x == "linear" => false, Some(Json::Str(x)) if x == "log1p" => true, _ => return Err(perr(&at(path, "scale"), "linear | log1p")) }; + if log1p { need(!flag, &at(path, "scale"), "log1p needs a number sense (a flag's normal is a rate)")?; need(lo >= 0.0, &at(path, "scale"), "log1p needs a range low >= 0")?; } + let sp = at(path, "src"); + let src = match get(kv, "src") { None => vec!["env".to_string()], Some(x) => { let v = strs(x).filter(|v| !v.is_empty()).ok_or_else(|| perr(&sp, "a list of source kinds: env, human"))?; + for (i, k) in v.iter().enumerate() { let p = ix(&sp, i); + need(k != "self", &p, "a reading never comes from the individual itself")?; need(k != "clock", &p, "the clock is not an instrument: readings come from env or human")?; + need(k == "env" || k == "human", &p, "env | human")?; need(!v[..i].contains(k), &p, "listed twice")?; } + v } }; + let six = |x: f64| r6(x) == x; + let pp = at(path, "prior"); let pk = keys(get(kv, "prior").unwrap(), &pp, &["mean", "var", "comment"], &["mean", "var"])?; + let (slo, shi) = if log1p { (lo.ln_1p(), hi.ln_1p()) } else { (lo, hi) }; + let prior_mean = num(get(pk, "mean"), &at(&pp, "mean"), None, None, false)?; + need(prior_mean >= slo && prior_mean <= shi, &at(&pp, "mean"), &format!("within the scaled range [{}, {}]{}", pyn(r6(slo)), pyn(r6(shi)), if log1p { ", ln(1 + range)" } else { "" }))?; + let prior_var = num(get(pk, "var"), &at(&pp, "var"), None, Some(1e12), false)?; need(prior_var > 0.0, &at(&pp, "var"), "must be > 0")?; + need(six(prior_mean) && six(prior_var), &pp, "at most 6 decimals (the prior anchors both caps)")?; + let drift_cap = num(get(kv, "drift_cap"), &at(path, "drift_cap"), None, Some(1e12), false)?; need(drift_cap > 0.0, &at(path, "drift_cap"), "must be > 0")?; + need(six(drift_cap), &at(path, "drift_cap"), "a cap has at most 6 decimals")?; + let var_cap = match get(kv, "var_cap") { None => r6(4.0 * prior_var), x => { let v = num(x, &at(path, "var_cap"), None, Some(1e12), false)?; + need(v >= prior_var, &at(path, "var_cap"), "must be >= prior.var")?; need(six(v), &at(path, "var_cap"), "a cap has at most 6 decimals")?; v } }; + let half_life = num_or(kv, "half_life_events", 10.0, path, Some(1.0), Some(10000.0), false)?; + let zcap = num_or(kv, "zcap", 6.0, path, Some(1.0), Some(20.0), false)?; + let dead_zone = num_or(kv, "dead_zone", 0.5, path, Some(0.0), None, false)?; need(dead_zone < zcap, &at(path, "dead_zone"), "must be < zcap")?; + let var_floor = num_or(kv, "var_floor", 0.01, path, Some(0.0), Some(1e12), false)?; need(var_floor > 0.0, &at(path, "var_floor"), "must be > 0")?; + let say = match get(kv, "say") { None => id.replace('_', " "), Some(Json::Str(s)) => s.clone(), Some(_) => return Err(perr(&at(path, "say"), "a string")) }; + let spread = |k: &str| num_or(kv, k, 0.0, path, Some(0.0), Some(3.0), false); + Ok(Sense { id, flag, lo, hi, log1p, unit, src, prior_mean, prior_var, drift_cap, var_cap, half_life, zcap, dead_zone, var_floor, say, + gain_spread: spread("gain_spread")?, threshold_spread: spread("threshold_spread")?, habituation_spread: spread("habituation_spread")? }) +} +/// A sense condition `key` (`sense..raw` or `sense..z`) with condition `c` -> (sense, z?, a flag's value, lo, hi) +fn parse_sense_cond(key: &str, c: &Json, path: &str, list: &[Sense]) -> R<(usize, bool, Option, f64, f64)> { + let parts: Vec<&str> = key.split('.').collect(); + need(parts.len() == 3 && parts[0] == "sense", path, "a sense condition is sense..raw or sense..z")?; + let si = list.iter().position(|s| s.id == parts[1]).ok_or_else(|| perr(path, format!("unknown sense {:?}", parts[1])))?; + let z = match parts[2] { "raw" => false, "z" => true, _ => return Err(perr(path, "a rule reads sense..raw or sense..z, never the normal (mean, var, n)")) }; + if !z && list[si].flag { let Json::Bool(b) = c else { return Err(perr(path, "true | false (a flag sense's reading)")) }; return Ok((si, false, Some(*b), 0.0, 0.0)); } + let (lo, hi) = match c { Json::Num(t) => (*t, f64::INFINITY), _ => { + let kv = c.as_obj().filter(|kv| !kv.is_empty() && kv.iter().all(|(k, _)| k == "at_least" || k == "at_most")).ok_or_else(|| perr(path, "a number (at least) or {at_least, at_most}"))?; + for (k, x) in kv { num(Some(x), &at(path, k), None, None, false)?; } + (get(kv, "at_least").and_then(Json::as_f64).unwrap_or(f64::NEG_INFINITY), get(kv, "at_most").and_then(Json::as_f64).unwrap_or(f64::INFINITY)) } }; + Ok((si, z, None, lo, hi)) +} +/// A sense condition as text: `sense.tool_fail.raw = true`, `sense.tempo.raw >= 20`, `sense.tempo.z in [1, 3]` +fn sense_cond_text(sn: &Senses, c: &SenseCond) -> String { + let key = format!("sense.{}.{}", sn.list[c.sense].id, if c.z { "z" } else { "raw" }); + if let Some(b) = c.flag { return format!("{key} = {b}"); } + match (c.lo.is_finite(), c.hi.is_finite()) { (true, false) => format!("{key} >= {}", pyn(c.lo)), (false, true) => format!("{key} <= {}", pyn(c.hi)), + (true, true) => format!("{key} in [{}, {}]", pyn(c.lo), pyn(c.hi)), _ => key } +} +/// A persona with a `senses` block: the block read strictly, then lowered (see `Senses`) and read as a persona without it (a drives +/// block, if any, lowers next); the digest is the whole document's, the block included +fn build_senses(doc: &Json) -> R { + let kv = doc.as_obj().unwrap(); + let sl = match get(kv, "senses") { Some(Json::Arr(a)) if (1..=24).contains(&a.len()) => a, _ => return Err(perr("senses", "a list of 1 to 24 senses")) }; + let mut senses: Vec = vec![]; + for (i, x) in sl.iter().enumerate() { let s = sense_spec(x, &ix("senses", i))?; need(!senses.iter().any(|y| y.id == s.id), &at(&ix("senses", i), "id"), "sense ids must be distinct")?; senses.push(s); } + let mut d2: Vec<(String, Json)> = kv.iter().filter(|(k, _)| k != "senses").cloned().collect(); + let slot = |d2: &mut Vec<(String, Json)>, k: &str| -> usize { match d2.iter().position(|(x, _)| x == k) { Some(i) => i, None => { d2.push((k.into(), Json::Null)); d2.len() - 1 } } }; + // a taken sense_ id: the block reserves sense__* for every sense + let mut ins: Vec = list(get(&d2, "inputs"), "inputs")?.to_vec(); let n_decl = ins.len(); + for (j, x) in ins.iter().enumerate() { if let Some(id) = x.get("id").and_then(Json::as_str) { need(!reserved_by(&senses, id), &format!("inputs[{j}].id"), "reserved by a sense (sense__*)")?; } } + for (j, h) in list(get(&d2, "history"), "history")?.iter().enumerate() { for k in ["id", "of"] { + if let Some(id) = h.get(k).and_then(Json::as_str) { need(!reserved_by(&senses, id), &format!("history[{j}].{k}"), "reserved by a sense (sense__*)")?; } } } + if let Some(Json::Arr(f)) = get(&d2, "learning").and_then(|l| l.get("from")) { for (i, x) in f.iter().enumerate() { + if let Some(k) = x.as_str() { need(!reserved_by(&senses, k), &format!("learning.from[{i}]"), "reserved for the senses block")?; } } } + let s = |x: &str| Json::Str(x.to_string()); let mut origins: Vec = vec![]; + for (i, sv) in senses.iter().enumerate() { + let ep = format!("senses[{i}].effects"); + let eff: Vec<(String, Json)> = match sl[i].get("effects") { None => vec![], Some(x) if !truthy(x) => vec![], + Some(x) => x.as_obj().ok_or_else(|| perr(&ep, "a mapping target -> number (an ordinal shift per unit of z)"))?.to_vec() }; + let mut neg = vec![]; for (k, v) in &eff { let Json::Num(w) = v else { return Err(perr(&at(&ep, k), "a number (an ordinal shift per unit of z)")) }; neg.push((k.clone(), Json::Num(-w))); } + for (dir, e) in [("up", eff), ("down", neg)] { + let mut spec = vec![("id".to_string(), s(&format!("sense_{}_{dir}", sv.id))), ("kind".into(), s("number")), ("max".into(), Json::Num(sv.zcap)), ("say".into(), s(&sv.say))]; + if !e.is_empty() { spec.push(("effects".into(), Json::Obj(e))); } + ins.push(Json::Obj(spec)); origins.push(ep.clone()); } } + // the habits' sense conditions -> one flag input per distinct (sense, raw or z, condition) + let mut conds: Vec = vec![]; + let mut habits: Vec = list(get(&d2, "habits"), "habits")?.to_vec(); + for (i, h) in habits.iter_mut().enumerate() { + let Json::Obj(hkv) = h else { continue }; let Some((_, Json::Obj(w))) = hkv.iter_mut().find(|(k, _)| k == "when") else { continue }; + if !w.iter().any(|(k, _)| k.starts_with("sense.") || reserved_by(&senses, k)) { continue; } + let mut nw: Vec<(String, Json)> = vec![]; + for (k, v) in w.iter() { let cp = format!("habits[{i}].when.{k}"); + need(!reserved_by(&senses, k), &cp, "reserved for the senses block (a rule reads sense..raw or sense..z)")?; + if !k.starts_with("sense.") { nw.push((k.clone(), v.clone())); continue; } + let (si, z, flag, lo, hi) = parse_sense_cond(k, v, &cp, &senses)?; + let id = match conds.iter().find(|c| c.sense == si && c.z == z && c.flag == flag && c.lo == lo && c.hi == hi) { Some(c) => c.id.clone(), None => { + let id = format!("sense_{}_c{}", senses[si].id, conds.iter().filter(|c| c.sense == si).count()); + ins.push(Json::Obj(vec![("id".into(), s(&id)), ("kind".into(), s("flag")), ("say".into(), s(k))])); origins.push(cp.clone()); + conds.push(SenseCond { id: id.clone(), sense: si, z, flag, lo, hi }); id } }; + if !nw.iter().any(|(x, _)| *x == id) { nw.push((id, Json::Bool(true))); } } + *w = nw; } + if !habits.is_empty() { let hi = slot(&mut d2, "habits"); d2[hi].1 = Json::Arr(habits); } + let synthetic: Vec = ins[n_decl..].iter().map(|x| x.get("id").and_then(Json::as_str).unwrap_or("").to_string()).collect(); + let ii = slot(&mut d2, "inputs"); d2[ii].1 = Json::Arr(ins); + // an error in a synthetic input is reported at the senses path it comes from + let mut p = build(&Json::Obj(d2)).map_err(|e| { for (j, o) in origins.iter().enumerate() { let pre = format!("inputs[{}]", n_decl + j); + if let Some(rest) = e.path.strip_prefix(&pre).filter(|r| r.is_empty() || r.starts_with('.') || r.starts_with('[')) { return perr(&format!("{o}{}", rest.strip_prefix(".effects").unwrap_or("")), e.msg); } } e })?; + p.digest = sha(doc); + p.senses = Some(Senses { list: senses, conds, synthetic }); + Ok(p) +} +/// The sense genes (§2.11): a gain on the effects, an offset on the dead zone and a multiplier on the half-life per sense, from the +/// persona hash family (a function of name, seed and sense id); a spread of 0 stores no gene (gain 1, offset 0, multiplier 1) +fn sense_genes(name: &str, sn: &Senses, seed: u64) -> Json { + let s = seed.to_string(); + let g = |f: &dyn Fn(&Sense) -> f64, k: &str, exp: bool| Json::Obj(sn.list.iter().filter(|x| f(x) > 0.0).map(|x| { let v = f(x) * normal(&[name, &s, "sense", &x.id, k]); + (x.id.clone(), Json::Num(r6(round_to(if exp { v.exp() } else { v }, 4)))) }).collect()); + Json::Obj(vec![("gain".into(), g(&|x| x.gain_spread, "gain", true)), ("threshold".into(), g(&|x| x.threshold_spread, "threshold", false)), + ("habituation".into(), g(&|x| x.habituation_spread, "habituation", true))]) +} +/// A reading as this turn judged it: the reading and its source as given, z against the normal before the update, zd beyond the dead +/// zone, z0 against the prior, and the mean and count it was judged against (the sense step's output for the stance and `why`) +#[derive(Clone)] +struct SRead { raw: Json, src: Json, z: f64, zd: f64, z0: f64, mean: f64, n: u64 } +/// The sense state of an individual: genes, then per sense (declared order) the normal's mean, variance and count; `read` is this +/// turn's readings (not stored) +#[derive(Clone)] +struct SState { genes: Json, mean: Vec, var: Vec, n: Vec, read: Vec> } +impl SState { + fn zero(name: &str, sn: &Senses, seed: u64) -> SState { + let n = sn.list.len(); SState { genes: sense_genes(name, sn, seed), mean: sn.list.iter().map(|s| s.prior_mean).collect(), var: sn.list.iter().map(|s| s.prior_var).collect(), n: vec![0; n], read: vec![None; n] } + } + fn gene(&self, k: &str, id: &str) -> Option { self.genes.get(k).and_then(|o| o.get(id)).and_then(Json::as_f64) } + fn to_json(&self, sn: &Senses) -> Json { + Json::Obj(vec![("genes".into(), self.genes.clone()), ("norm".into(), Json::Obj(sn.list.iter().enumerate().map(|(i, s)| (s.id.clone(), + Json::Obj(vec![("mean".into(), Json::Num(self.mean[i])), ("var".into(), Json::Num(self.var[i])), ("n".into(), Json::Num(self.n[i] as f64))]))).collect()))]) + } + /// `state.senses`, strictly (S4): the genes of the seed, one normal per sense of the persona, each mean within prior ± drift_cap, + /// each variance within [0, var_cap], each count a whole number up to 1e6 + fn read(name: &str, sn: &Senses, j: &Json, seed: u64) -> R { + let kv = keys(j, "state.senses", &["genes", "norm"], &["genes", "norm"])?; + need(canon(get(kv, "genes").unwrap()) == canon(&sense_genes(name, sn, seed)), "state.senses.genes", "sense genes do not match the seed")?; + let ids: Vec<&str> = sn.list.iter().map(|s| s.id.as_str()).collect(); + let nk = get(kv, "norm").and_then(Json::as_obj).filter(|o| o.len() == sn.list.len() && ids.iter().all(|i| get(o, i).is_some())) + .ok_or_else(|| perr("state.senses.norm", format!("one normal per sense of the persona ({})", ids.join(", "))))?; + let n = sn.list.len(); let mut st = SState { genes: get(kv, "genes").unwrap().clone(), mean: vec![0.0; n], var: vec![0.0; n], n: vec![0; n], read: vec![None; n] }; + // the state keeps 6 decimals: a value clamped to a bound can round half a unit past it + for (i, s) in sn.list.iter().enumerate() { let p = at("state.senses.norm", &s.id); + let o = keys(get(nk, &s.id).unwrap(), &p, &["mean", "var", "n"], &["mean", "var", "n"])?; + let (lo, hi) = (s.prior_mean - s.drift_cap, s.prior_mean + s.drift_cap); + st.mean[i] = get(o, "mean").and_then(Json::as_f64).filter(|m| *m >= lo - 5e-7 && *m <= hi + 5e-7).ok_or_else(|| perr(&at(&p, "mean"), format!("within prior.mean ± drift_cap: [{}, {}]", pyn(r6(lo)), pyn(r6(hi)))))?; + st.var[i] = get(o, "var").and_then(Json::as_f64).filter(|v| *v >= 0.0 && *v <= s.var_cap + 5e-7).ok_or_else(|| perr(&at(&p, "var"), format!("within [0, var_cap = {}]", pyn(s.var_cap))))?; + st.n[i] = get(o, "n").and_then(Json::as_f64).filter(|x| *x >= 0.0 && x.fract() == 0.0 && *x <= 1e6).ok_or_else(|| perr(&at(&p, "n"), "a whole number from 0 to 1000000"))? as u64; } + Ok(st) + } +} +/// An event's `src` read with a senses block (on every event): a well-formed source or none +fn src_form(raw: &[(String, Json)]) -> R<()> { + match get(raw, "src") { None => Ok(()), Some(Json::Str(s)) if src_kind(s).is_some() => Ok(()), + Some(_) => Err(perr("inputs.src", "a source: human[:id] | env[:id] | self | clock (id: 1-64 of A-Z a-z 0-9 _ . - @ / :)")) } +} +/// Is a sense condition on, given this turn's readings? A condition on a sense not read this event is false (S5) +fn cond_on(c: &SenseCond, read: &[Option]) -> bool { + let Some(r) = &read[c.sense] else { return false }; + match c.flag { Some(b) => r.raw == Json::Bool(b), None => { let v = if c.z { r.z } else { r.raw.as_f64().unwrap_or(f64::NAN) }; v >= c.lo && v <= c.hi } } +} +/// The sense step (§2.11, RFC 0001 A.3), before the drive step: every reading checked first (S1 declared and in range, S2 an +/// accepted source; `check` false: fuzz and prove, whose events stand for accepted ones), then per declared sense with a reading, +/// in declared order, z against the normal before the update, zd beyond the dead zone, and the normal's update (each line rounded +/// to 6 decimals). -> (the stepped sense state, the turn's inputs: the event's without `senses`, then the lowering's inputs) +fn sense_step(sn: &Senses, ss: &SState, raw: &[(String, Json)], src: Option<&Json>, check: bool) -> R<(SState, Vec<(String, Json)>)> { + for k in &sn.synthetic { need(get(raw, k).is_none(), &format!("inputs.{k}"), "reserved for the senses block (the engine computes it from the readings)")?; } + let n = sn.list.len(); let mut got: Vec> = vec![None; n]; + if let Some(sj) = get_t(raw, "senses") { + let skv = sj.as_obj().ok_or_else(|| perr("inputs.senses", "a mapping sense id -> reading"))?; + for (k, (sid, r)) in skv.iter().enumerate() { let path = format!("inputs.senses.{sid}"); + need(!skv[..k].iter().any(|(x, _)| x == sid), &path, "a sense read twice in one event")?; + let i = sn.list.iter().position(|s| s.id == *sid).ok_or_else(|| perr(&path, format!("not a declared sense (senses: {})", sn.list.iter().map(|s| s.id.as_str()).collect::>().join(", "))))?; + let s = &sn.list[i]; + let (v, own) = match r { Json::Obj(_) => { let o = keys(r, &path, &["v", "src"], &["v"])?; (get(o, "v").unwrap().clone(), get(o, "src").cloned()) } _ => (r.clone(), None) }; + let vp = if own.is_some() || matches!(r, Json::Obj(_)) { at(&path, "v") } else { path.clone() }; + // S1: declared, in range; nothing is clipped + let x = if s.flag { match v { Json::Bool(b) => if b { 1.0 } else { 0.0 }, _ => return Err(perr(&vp, "a flag sense reads true | false")) } } else { + let range = format!("a number in [{}, {}] ({})", pyn(s.lo), pyn(s.hi), s.unit); + let y = match v { Json::Num(y) if y.is_finite() => y, _ => return Err(perr(&vp, range)) }; need(y >= s.lo && y <= s.hi, &vp, &range)?; + if s.log1p { r6(y.ln_1p()) } else { r6(y) } }; + // S2: provenance; a bare value takes the event's src + let sj2 = own.clone().or_else(|| src.cloned()); + if check { let sp = if own.is_some() { at(&path, "src") } else { "inputs.src".to_string() }; + let allowed = s.src.join(" or "); + match &sj2 { + None => return Err(perr(&sp, format!("a reading of {sid} needs a source: the event's src or its own ({allowed})"))), + Some(Json::Str(t)) => match src_kind(t) { + None => return Err(perr(&sp, "a source: human[:id] | env[:id] (id: 1-64 of A-Z a-z 0-9 _ . - @ / :)")), + Some("self") => return Err(perr(&sp, format!("a reading of {sid} from the individual itself (src self) is refused: readings come from {allowed}"))), + Some("clock") => return Err(perr(&sp, format!("a reading of {sid} from the clock is refused: readings come from {allowed}"))), + Some(kd) if !s.src.iter().any(|a| a == kd) => return Err(perr(&sp, format!("a reading of {sid} from {kd} is refused: {sid} reads from {allowed}"))), + _ => {} }, + Some(_) => return Err(perr(&sp, "a source: human[:id] | env[:id] (id: 1-64 of A-Z a-z 0-9 _ . - @ / :)")) } } + got[i] = Some((v, sj2.unwrap_or(Json::Null), x)); } } + let mut ns = ss.clone(); ns.read = vec![None; n]; + for (i, s) in sn.list.iter().enumerate() { + let Some((v, sj, x)) = &got[i] else { continue }; let x = *x; + let (gh, gt) = (ss.gene("habituation", &s.id).unwrap_or(1.0), ss.gene("threshold", &s.id).unwrap_or(0.0)); + let h = r6((s.half_life * gh).max(1.0).min(10000.0)); + let a = r6(1.0 - 0.5f64.powf(1.0 / h)); + let (mean, var) = (ss.mean[i], ss.var[i]); + let z = r6(((x - mean) / (var + s.var_floor).sqrt()).max(-s.zcap).min(s.zcap)); + let d = r6((s.dead_zone + gt).max(0.0).min(s.zcap - 0.000001)); + let zd = if z == 0.0 { 0.0 } else { r6(z.signum() * (z.abs() - d).max(0.0)) }; + ns.mean[i] = r6((mean + a * (x - mean)).max(s.prior_mean - s.drift_cap).min(s.prior_mean + s.drift_cap)); + ns.var[i] = r6(((1.0 - a) * (var + a * (x - mean) * (x - mean))).max(0.0).min(s.var_cap)); + ns.n[i] = (ss.n[i] + 1).min(1_000_000); + let z0 = r6(((x - s.prior_mean) / (s.prior_var + s.var_floor).sqrt()).max(-s.zcap).min(s.zcap)); + ns.read[i] = Some(SRead { raw: v.clone(), src: sj.clone(), z, zd, z0, mean, n: ss.n[i] }); } + let mut out: Vec<(String, Json)> = raw.iter().filter(|(k, _)| k != "senses").cloned().collect(); + out.extend(lowered_inputs(sn, &ns.read)); + Ok((ns, out)) +} +/// The lowering's inputs from a turn's readings: per sense `sense__up` = max(zd, 0) and `sense__down` = max(-zd, 0), then +/// every condition flag +fn lowered_inputs(sn: &Senses, read: &[Option]) -> Vec<(String, Json)> { + let mut out = vec![]; + for (i, s) in sn.list.iter().enumerate() { let zd = read[i].as_ref().map_or(0.0, |r| r.zd); + out.push((format!("sense_{}_up", s.id), Json::Num(r6(zd.max(0.0))))); out.push((format!("sense_{}_down", s.id), Json::Num(r6((-zd).max(0.0))))); } + for c in &sn.conds { out.push((c.id.clone(), Json::Bool(cond_on(c, read)))); } + out +} +/// `n readings` (1 reading) +fn readings(n: u64) -> String { if n == 1 { "1 reading".into() } else { format!("{n} readings") } } +/// `why`'s normal clause (§2.11), at most one: the read sense with the largest |gain x zd| > 0 (ties: declared order), "far" at +/// |z| >= 2, above or below by sign; failing that, the read sense with the largest |z0| - |z| >= 1 (z0 against the prior), whose +/// reading its normal now makes usual. -> (the sense, the clause) +fn normal_clause(sn: &Senses, ss: &SState) -> Option<(usize, String)> { + let mut best: Option<(usize, f64)> = None; + for (i, r) in ss.read.iter().enumerate() { let Some(r) = r else { continue }; + let m = r6(ss.gene("gain", &sn.list[i].id).unwrap_or(1.0) * r.zd).abs(); if m > 0.0 && best.map_or(true, |b| m > b.1) { best = Some((i, m)); } } + if let Some((i, _)) = best { let (r, s) = (ss.read[i].as_ref().unwrap(), &sn.list[i]); + return Some((i, format!("{} {}{} its normal (z {:+.1} over {})", s.say, if r.z.abs() >= 2.0 { "far " } else { "" }, if r.z > 0.0 { "above" } else { "below" }, r.z, readings(r.n)))); } + for (i, r) in ss.read.iter().enumerate() { let Some(r) = r else { continue }; + let g = r6(r.z0.abs() - r.z.abs()); if g >= 1.0 && best.map_or(true, |b| g > b.1) { best = Some((i, g)); } } + best.map(|(i, _)| { let (r, s) = (ss.read[i].as_ref().unwrap(), &sn.list[i]); + (i, format!("{} usual for it now (z {:+.1} over {}, {:+.1} against its prior)", s.say, r.z, readings(r.n), r.z0)) }) +} +/// The stance document of a sensed turn: `senses` = per sense read its reading, source, z, zd and the mean and count it was judged +/// against; `noticed` = the normal clause's sense (or null); `inputs` = the host's (the readings as given, the lowering's left out) +fn stance_senses(j: &mut Json, sn: &Senses, ss: &SState, given: &[(String, Json)]) { + let Json::Obj(v) = j else { return }; + if let Some((_, Json::Obj(ins))) = v.iter_mut().find(|(k, _)| k == "inputs") { ins.retain(|(k, _)| !sn.synthetic.contains(k)); + if let Some(g) = get_t(given, "senses") { ins.push(("senses".into(), g.clone())); } } + let read = Json::Obj(sn.list.iter().zip(&ss.read).filter_map(|(s, r)| r.as_ref().map(|r| (s.id.clone(), Json::Obj(vec![("raw".into(), r.raw.clone()), ("src".into(), r.src.clone()), + ("z".into(), Json::Num(r.z)), ("zd".into(), Json::Num(r.zd)), ("mean".into(), Json::Num(r.mean)), ("n".into(), Json::Num(r.n as f64))])))).collect()); + let noticed = normal_clause(sn, ss).map_or(Json::Null, |(i, _)| Json::Str(sn.list[i].id.clone())); + v.push(("senses".into(), read)); v.push(("noticed".into(), noticed)); +} +/// The lowering's inputs again, from a stance document's `senses` (what `breaks` reads) +fn doc_sense_inputs(sn: &Senses, doc: &Json) -> Option> { + let ds = doc.get("senses")?; let mut read: Vec> = vec![]; + for s in &sn.list { read.push(match ds.get(&s.id) { None => None, Some(r) => Some(SRead { raw: r.get("raw")?.clone(), src: Json::Null, z: r.get("z")?.as_f64()?, zd: r.get("zd")?.as_f64()?, + z0: 0.0, mean: 0.0, n: 0 }) }); } + Some(lowered_inputs(sn, &read)) +} +/// The gain an input's effects carry for this individual: a sense's gain gene for its `sense__up/down`, else the input's +/// reactivity gene (1 without one) +fn input_gain(p: &Persona, st: &State, id: &str) -> f64 { + if let (Some(sn), Some(ss)) = (&p.senses, &st.senses) { if let Some(i) = sn.of_input(id) { return ss.gene("gain", &sn.list[i].id).unwrap_or(1.0); } } + st.react(id).unwrap_or(1.0) +} + // ------------------------------------------------------------------------------------------------------------- rules fn empty_rules() -> Vec> { vec![vec![]; RULE_KEYS.len()] } /// Indices (in emission order: RULE_KEYS, then list order) of the rules a complete plan breaks @@ -908,7 +1224,13 @@ fn values_of(p: &Persona) -> Vec { /// The state between turns (docs/persona.md §5.1): plain JSON a host stores. #[derive(Clone)] pub struct State { pub seed: u64, pub turn: u64, persona: [String; 3], genes: Json, mood: Vec<(String, Vec)>, history: Vec<(String, Vec)>, prev: HashMap, - agenda: Option>, rest: Option>, learned: Table, credit: Table, drives: Option, pub digest: String } + agenda: Option>, rest: Option>, learned: Table, credit: Table, drives: Option, senses: Option, + learned_from: Option>, pub digest: String } +/// `learned_from` (§2.11): per learned trait the feedback turns that moved it, (rewards, corrections), with a learning block and +/// `line.why_past` on (None otherwise) +fn learned_from0(p: &Persona) -> Option> { + p.learning.as_ref().filter(|_| p.why_past()).map(|l| l.traits.iter().map(|t| (t.clone(), 0, 0)).collect()) +} fn table(t: &Table) -> Json { Json::Obj(t.iter().map(|(k, v)| (k.clone(), Json::Arr(v.iter().map(|x| Json::Num(*x)).collect()))).collect()) } /// A zero table over the learned traits (none without a learning block) fn zeros(p: &Persona) -> Table { p.learning.as_ref().map_or(vec![], |l| l.traits.iter().map(|t| (t.clone(), vec![0.0; p.var(t).unwrap().levels.len()])).collect()) } @@ -946,6 +1268,9 @@ impl State { if let Some(r) = &self.rest { v.push(("rest".into(), Json::Obj(r.iter().map(|(k, l)| (k.clone(), Json::Str(l.clone()))).collect()))); } if p.learning.is_some() { v.push(("learned".into(), table(&self.learned))); v.push(("credit".into(), table(&self.credit))); } if let (Some(d), Some(ds)) = (&p.drives, &self.drives) { v.push(("drives".into(), ds.to_json(d))); } + if let (Some(sn), Some(ss)) = (&p.senses, &self.senses) { v.push(("senses".into(), ss.to_json(sn))); } + if let Some(lf) = &self.learned_from { v.push(("learned_from".into(), Json::Obj(lf.iter().map(|(t, r, c)| (t.clone(), + Json::Obj(vec![("rewards".into(), Json::Num(*r as f64)), ("corrections".into(), Json::Num(*c as f64))]))).collect()))); } Json::Obj(v) } pub fn to_json(&self, p: &Persona) -> Json { let mut b = self.body(p); if let Json::Obj(v) = &mut b { v.push(("digest".into(), Json::Str(self.digest.clone()))); } b } @@ -966,13 +1291,20 @@ impl State { let body = Json::Obj(kv.iter().filter(|(k, _)| k != "digest").cloned().collect()); need(get(kv, "digest").and_then(Json::as_str) == Some(sha(&body).as_str()), "state.digest", "state was edited or corrupted")?; need(p.drives.is_none() || get(kv, "drives").is_some(), "state.drives", "required with a drives block")?; - const SK: [&str; 13] = ["probbit_persona_state", "persona", "seed", "turn", "genes", "mood", "history", "prev", "rest", "digest", "learned", "credit", "drives"]; + need(p.senses.is_none() || get(kv, "senses").is_some(), "state.senses", "required with a senses block")?; + let keeps_from = learned_from0(p).is_some(); + need(!keeps_from || get(kv, "learned_from").is_some(), "state.learned_from", "required with a learning block and line.why_past")?; + const SK: [&str; 15] = ["probbit_persona_state", "persona", "seed", "turn", "genes", "mood", "history", "prev", "rest", "digest", "learned", "credit", "drives", "senses", "learned_from"]; let mut sk: Vec<&str> = SK[..10].to_vec(); if p.learning.is_some() { sk.extend(&SK[10..12]); } if p.drives.is_some() { sk.push(SK[12]); } + if p.senses.is_some() { sk.push(SK[13]); } + if keeps_from { sk.push(SK[14]); } keys(j, "state", &sk, &["persona", "seed", "turn", "genes", "mood", "history", "prev", "digest"]) .map_err(|e| if e.msg.starts_with("unknown field") && (e.path == "state.learned" || e.path == "state.credit") { perr(&e.path, "this persona has no learning block") } - else if e.msg.starts_with("unknown field") && e.path == "state.drives" { perr(&e.path, "this persona has no drives block") } else { e })?; + else if e.msg.starts_with("unknown field") && e.path == "state.drives" { perr(&e.path, "this persona has no drives block") } + else if e.msg.starts_with("unknown field") && e.path == "state.senses" { perr(&e.path, "this persona has no senses block") } + else if e.msg.starts_with("unknown field") && e.path == "state.learned_from" { perr(&e.path, "this persona keeps no learned_from (a learning block with line.why_past)") } else { e })?; let whole = |k: &str| num(get(kv, k), &at("state", k), Some(0.0), Some(9_007_199_254_740_992.0), true).map(|x| x as u64); let (seed, turn) = (whole("seed")?, whole("turn")?); let g = get(kv, "genes").unwrap(); need(canon(g) == canon(&genes(p, seed)), "state.genes", "genes do not match the seed")?; @@ -1004,7 +1336,14 @@ impl State { Ok((t.clone(), a.iter().map(|x| x.as_f64().unwrap()).collect())) }).collect() }; let (learned, credit) = (tab("learned", p.learning.as_ref().map_or(0.0, |l| l.total_cap))?, tab("credit", 1.0)?); let drives = match &p.drives { None => None, Some(d) => Some(DState::read(p, d, get(kv, "drives").unwrap(), seed)?) }; - Ok(State { seed, turn, persona, genes: g.clone(), mood, history, prev, agenda, rest, learned, credit, drives, digest: get(kv, "digest").and_then(Json::as_str).unwrap_or("").to_string() }) + let senses = match &p.senses { None => None, Some(sn) => Some(SState::read(&p.name, sn, get(kv, "senses").unwrap(), seed)?) }; + // learned_from: per learned trait {rewards, corrections}, whole numbers >= 0 + let learned_from = match learned_from0(p) { None => None, Some(z) => { let o = get(kv, "learned_from").and_then(Json::as_obj).filter(|o| o.len() == z.len()) + .ok_or_else(|| perr("state.learned_from", "one entry per learned trait"))?; + Some(z.iter().map(|(t, _, _)| { let tp = at("state.learned_from", t); let e = keys(get(o, t).ok_or_else(|| perr(&tp, "required"))?, &tp, &["rewards", "corrections"], &["rewards", "corrections"])?; + let w = |k: &str| num(get(e, k), &at(&tp, k), Some(0.0), Some(9_007_199_254_740_992.0), true).map(|x| x as u64); + Ok((t.clone(), w("rewards")?, w("corrections")?)) }).collect::>>()?) } }; + Ok(State { seed, turn, persona, genes: g.clone(), mood, history, prev, agenda, rest, learned, credit, drives, senses, learned_from, digest: get(kv, "digest").and_then(Json::as_str).unwrap_or("").to_string() }) } } @@ -1035,7 +1374,7 @@ fn flags(p: &Persona, st: &State) -> Flags { #[derive(Clone)] struct Meta { vals: Vec<(String, Json)>, hist: Vec<(String, f64)>, ignored: Vec, active: Vec, conditional: Vec, active_inputs: Vec, rules: Vec>, owners: Vec, new_mood: Vec<(String, Vec)>, new_learned: Table, contrib: Vec)>>, field: Vec>, values: Vec, twin: bool, - lift: Vec<(String, f64)> } + lift: Vec<(String, f64)>, learn_sign: f64 } #[derive(Default, Clone)] struct Opts { no_inertia: bool, clamps: Vec<(String, String)>, twin: Option, exclude: Vec, hist: Option> } @@ -1078,9 +1417,10 @@ fn compile(p: &Persona, st: &State, raw: &[(String, Json)], o: &Opts) -> R<(Json // the learned deltas after this turn's feedback (the reward flag +1, the correction flag -1) on the previous stance's credit // with a drives block (§2.9): the turn's drive context, read from the (stepped) drive state; its surprise joins the learning sign let dctx = match (&p.drives, &st.drives) { (Some(d), Some(ds)) => Some(drive_ctx(d, ds)), _ => None }; + let mut learn_sign = 0.0; let new_learned = match &p.learning { None => vec![], Some(l) => { let sign = l.from.iter().enumerate().fold(0.0, |s, (i, id)| if matches!(get(&vals, id), Some(Json::Bool(true))) { s + if i == 0 { 1.0 } else { -1.0 } } else { s }); - let sign = match &dctx { Some(c) => (sign + c.learn_sign).clamp(-1.0, 1.0), None => sign }; + let sign = match &dctx { Some(c) => (sign + c.learn_sign).clamp(-1.0, 1.0), None => sign }; learn_sign = sign; learn(l, &st.credit, sign, &st.learned) } }; for (i, v) in p.vars.iter().enumerate() { contrib[i].push(("prior".into(), v.base.clone())); if let Some(g) = st.shift(&v.id) { contrib[i].push(("genes".into(), centered(v.levels.len()).iter().map(|c| g * c).collect())); } @@ -1090,7 +1430,7 @@ fn compile(p: &Persona, st: &State, raw: &[(String, Json)], o: &Opts) -> R<(Json let mut active_inputs = vec![]; let mut push = |t: &str, src: String, w: Vec, contrib: &mut Vec)>>| { let i = tix(t); match mood_ev.get_mut(i).and_then(Option::as_mut) { Some(ev) => for (a, b) in ev.iter_mut().zip(&w) { *a += b; }, None => contrib[i].push((src, w)) } }; - for x in &p.inputs { let v = get(&vals, &x.id).unwrap(); let g = st.react(&x.id).unwrap_or(1.0); + for x in &p.inputs { let v = get(&vals, &x.id).unwrap(); let g = input_gain(p, st, &x.id); let (eff, scale): (&[(String, Vec)], f64) = match x.kind { Kind::Flag => if *v == Json::Bool(true) { (&x.effects, 1.0) } else { (&[], 0.0) }, Kind::Number => (&x.effects, v.as_f64().unwrap()), @@ -1167,7 +1507,7 @@ fn compile(p: &Persona, st: &State, raw: &[(String, Json)], o: &Opts) -> R<(Json if *key == "all_different" && ns > 0 && use_twin { lst.push(Json::Obj(vec![("vars".into(), Json::Arr(p.steps.iter().map(|s| Json::Str(format!("free.step.{s}"))).collect()))])); } if !lst.is_empty() { prog.push((key.to_string(), Json::Arr(lst))); } } let conditional = active.iter().filter(|h| !h.when.is_empty()).map(|h| h.id.clone()).collect(); - let meta = Meta { vals, hist, ignored, active: active.iter().map(|h| h.id.clone()).collect(), conditional, active_inputs, rules, owners, new_mood, new_learned, contrib, field, values: sem, twin: use_twin, lift }; + let meta = Meta { vals, hist, ignored, active: active.iter().map(|h| h.id.clone()).collect(), conditional, active_inputs, rules, owners, new_mood, new_learned, contrib, field, values: sem, twin: use_twin, lift, learn_sign }; Ok((Json::Obj(prog), meta)) } /// A habit rule with its level names renamed to the program's values (positional: l) @@ -1246,11 +1586,16 @@ fn direction_word(p: &Persona, var: &str, vec: &[f64]) -> Option<(String, f64)> p.var(var)?; let d = vec.iter().zip(centered(vec.len())).fold(0.0, |a, (x, c)| a + x * c); (d.abs() >= 0.15).then(|| (format!("{var} {}", if d > 0.0 { "up" } else { "down" }), d.abs())) } -fn why(p: &Persona, meta: &Meta, bound: &[String], status: &str) -> String { +/// `why` (§4): the bound habits; with a senses block the normal clause (§2.11); the two strongest live inputs with the two traits +/// each pushes hardest (the senses' own inputs left out); with `line.why_past` and a learning block the learned clause; the engine +/// status if not ok +fn why(p: &Persona, st: &State, meta: &Meta, bound: &[String], status: &str, stance: &[(String, Entry)], learned_from: Option<&[(String, u64, u64)]>) -> String { let mut parts: Vec = p.habits.iter().filter(|h| bound.contains(&h.id)).map(|h| format!("{} (habit)", if h.say.is_empty() { h.id.replace('_', " ") } else { h.say.clone() })).collect(); + if let (Some(sn), Some(ss)) = (&p.senses, &st.senses) { if let Some((_, c)) = normal_clause(sn, ss) { parts.push(c); } } let mut srcs: Vec<(f64, String)> = vec![]; let ids: Vec<&String> = p.inputs.iter().map(|x| &x.id).chain(p.history.iter().map(|h| &h.id)).collect(); for id in ids { if !meta.active_inputs.contains(id) { continue; } + if p.senses.as_ref().is_some_and(|sn| sn.synthetic.contains(id)) { continue; } let (eff, scale, say): (&[(String, Vec)], f64, String) = if let Some(x) = p.input(id) { let v = get(&meta.vals, id).unwrap(); let eff = if x.kind == Kind::Level { x.by_level.iter().find(|(l, _)| Some(l.as_str()) == v.as_str()).map_or(&[][..], |(_, e)| &e[..]) } else { &x.effects[..] }; @@ -1266,6 +1611,15 @@ fn why(p: &Persona, meta: &Meta, bound: &[String], status: &str) -> String { if !words.is_empty() { srcs.push((tot, format!("{say} -> {}", words.iter().take(2).map(|w| w.0.as_str()).collect::>().join(", ")))); } } srcs.sort_by(|a, b| b.0.partial_cmp(&a.0).unwrap_or(std::cmp::Ordering::Equal)); parts.extend(srcs.into_iter().take(2).map(|s| s.1)); + // the learned clause (§2.11): the released learned trait with the largest |Δ| at its level, if >= 0.05, and what moved it + if let (Some(l), Some(lf), true) = (&p.learning, learned_from, p.why_past()) { + let mut best: Option<(f64, String)> = None; let n = |k: u64, w: &str| if k == 1 { format!("1 {w}") } else { format!("{k} {w}s") }; + for t in &l.traits { let Some((_, e)) = stance.iter().find(|(k, _)| k == t).filter(|(_, e)| e.released) else { continue }; + let Some(li) = p.var(t).and_then(|v| v.levels.iter().position(|x| *x == e.level)) else { continue }; + let d = meta.new_learned.iter().find(|(k, _)| k == t).map_or(0.0, |(_, d)| d[li]); + if d.abs() >= 0.05 && best.as_ref().map_or(true, |b| d.abs() > b.0) { let (_, r, c) = lf.iter().find(|(k, _, _)| k == t).cloned().unwrap_or_default(); + best = Some((d.abs(), format!("learned: {t} {d:+.2} on {} ({}, {})", e.level, n(r, "reward"), n(c, "correction")))); } } + if let Some((_, c)) = best { parts.push(c); } } if status != "ok" { parts.push(format!("engine: {status}")); } if parts.is_empty() { "baseline (no live evidence)".into() } else { parts.join("; ") } } @@ -1320,9 +1674,13 @@ fn decode(p: &Persona, st: &State, program: &str, meta: &Meta, doc: &Json, confl let line_active: Vec = meta.active.iter().filter(|h| !conflict.contains(h)).cloned().collect(); let levels: HashMap = stance.iter().map(|(k, e)| (k.clone(), e.level.clone())).collect(); let ln = line(p, &levels, &line_active, &bound, &unsure, if steps_vouched { &order_steps } else { &[] }, &vouched, &meta.conditional, &baseline(p, st)); - let w = why(p, meta, &bound, &status); // the new state let mut ns = st.clone(); ns.turn = st.turn + 1; ns.mood = meta.new_mood.clone(); ns.learned = meta.new_learned.clone(); + // learned_from (§2.11): a feedback turn that moved a learned trait counts for it, a reward or a correction by the sign + if let Some(lf) = ns.learned_from.as_mut() { for (t, r, c) in lf.iter_mut() { + let moved = st.learned.iter().find(|(k, _)| k == t).map(|x| &x.1) != meta.new_learned.iter().find(|(k, _)| k == t).map(|x| &x.1); + if moved && meta.learn_sign > 0.0 { *r += 1; } else if moved && meta.learn_sign < 0.0 { *c += 1; } } } + let w = why(p, st, meta, &bound, &status, &stance, ns.learned_from.as_deref()); // the credit the next turn's feedback reads: onehot(level) - odds of each learned trait this stance released (else 0) ns.credit = meta.new_learned.iter().map(|(t, d)| (t.clone(), match stance.iter().find(|(k, _)| k == t) { Some((_, e)) if e.released => e.odds.iter().map(|(l, x)| r6(if *l == e.level { 1.0 } else { 0.0 } - x)).collect(), _ => vec![0.0; d.len()] })).collect(); @@ -1368,12 +1726,12 @@ pub fn turn_any_source(p: &Persona, st: &State, raw: &Json, no_inertia: bool, en fn turn_src(p: &Persona, st: &State, raw: &Json, no_inertia: bool, eng: Engine, timing: bool, check: bool) -> R<(Json, State)> { let raw: Vec<(String, Json)> = match raw { Json::Null => vec![], Json::Obj(v) => v.clone(), _ => return Err(perr("inputs", "must be a JSON object")) }; for (n, (k, _)) in raw.iter().enumerate() { if raw[..n].iter().any(|(k2, _)| k2 == k) { return Err(perr(&format!("inputs.{k}"), "duplicate input")); } } - // reward provenance (§2.10), first: with `reward_from`, `src` is read here (not compiled, so not `ignored`) and comes back - // in the stance's inputs; without it `src` is an undeclared input as before - let src = match &p.reward { Some(rw) => { if check { provenance(rw, &raw)?; } get(&raw, "src").cloned() } None => None }; - let raw: Vec<(String, Json)> = if p.reward.is_some() { raw.into_iter().filter(|(k, _)| k != "src").collect() } else { raw }; - // a drives block steps the drives before the turn, which runs on the stepped state with the drive aggregates as inputs - let given = raw; let (st2, raw) = prep(p, st, &given)?; let st = &st2; + // reward provenance (§2.10), first: with `reward_from` (or a senses block, §2.11), `src` is read here (not compiled, so not + // `ignored`) and comes back in the stance's inputs; without either `src` is an undeclared input as before + let (src, raw) = take_src(p, raw, check)?; + // a senses block steps the normals and a drives block the drives before the turn, which runs on the stepped state with the + // lowering's inputs + let given = raw; let (st2, raw) = prep(p, st, &given, src.as_ref(), check)?; let st = &st2; let t0 = Instant::now(); let mut calls = 0; let o = Opts { no_inertia, ..Default::default() }; let (mut prog, mut meta) = compile(p, st, &raw, &o)?; let mut ptext = digest_of(&text(&prog)); @@ -1412,11 +1770,16 @@ fn turn_src(p: &Persona, st: &State, raw: &Json, no_inertia: bool, eng: Engine, out.timing = Some(Json::Obj(vec![("compile_ms".into(), r3(compile_ms)), ("engine_ms".into(), r3(engine_ms)), ("decode_ms".into(), r3((ms(t0) - compile_ms - engine_ms).max(0.0))), ("turn_ms".into(), r3(ms(t0))), ("engine_calls".into(), Json::Num(calls as f64)), ("holds".into(), Json::Num(out.held.len() as f64)), ("load_avg_1m".into(), crate::sys::loadavg().map_or(Json::Null, |l| Json::Num((l * 100.0).round() / 100.0)))])); } let mut j = out.to_json(p, st); + if let (Some(sn), Some(ss)) = (&p.senses, &st.senses) { stance_senses(&mut j, sn, ss, &given); } if let (Some(d), Some(ds)) = (&p.drives, &st.drives) { stance_drives(&mut j, d, ds, &out.lift, &given); } if let (Some(s), Json::Obj(v)) = (src, &mut j) { if let Some((_, Json::Obj(ins))) = v.iter_mut().find(|(k, _)| k == "inputs") { ins.push(("src".into(), s)); } } Ok((j, ns)) } +/// The normals of a state with a senses block (§2.11), per sense in declared order: (id, mean, count, drift_cap); none without one +pub fn normals(p: &Persona, st: &State) -> Vec<(String, f64, u64, f64)> { + match (&p.senses, &st.senses) { (Some(sn), Some(ss)) => sn.list.iter().enumerate().map(|(i, s)| (s.id.clone(), ss.mean[i], ss.n[i], s.drift_cap)).collect(), _ => vec![] } +} /// A new individual: genes from the seed, an empty mood and history, the fallback levels as `prev`, and (with `rest`) the /// resting stance: this individual's joint plan with no live evidence and a neutral mood (one engine call). pub fn init(p: &Persona, seed: Option, rest: bool, eng: Engine) -> State { @@ -1425,7 +1788,8 @@ pub fn init(p: &Persona, seed: Option, rest: bool, eng: Engine) -> State { mood: p.vars.iter().filter(|v| v.mood).map(|v| (v.id.clone(), vec![0.0; v.levels.len()])).collect(), history: { let mut h: Vec<(String, Vec)> = vec![]; for x in &p.history { if !h.iter().any(|(k, _)| *k == x.of) { h.push((x.of.clone(), vec![])); } } h }, prev: p.vars.iter().map(|v| (v.id.clone(), v.fallback.clone())).collect(), agenda: (!p.steps.is_empty()).then(|| p.steps.clone()), rest: None, - learned: zeros(p), credit: zeros(p), drives: p.drives.as_ref().map(|d| DState::zero(p, d, seed)), digest: String::new() }; + learned: zeros(p), credit: zeros(p), drives: p.drives.as_ref().map(|d| DState::zero(p, d, seed)), senses: p.senses.as_ref().map(|sn| SState::zero(&p.name, sn, seed)), + learned_from: learned_from0(p), digest: String::new() }; if rest { if let Ok((prog, _)) = compile(p, &st, &[], &Opts { twin: Some(false), ..Default::default() }) { let doc = eng(&prog, &flags(p, &st)); if let Some(plan) = doc.get("plan").and_then(Json::as_obj) { @@ -1463,6 +1827,16 @@ pub fn tool(name: &str, args: &[(String, Json)], eng: Engine, files: bool) -> R< let (stance, ns) = turn(&p, &st, &inputs, on("no_inertia")?, eng, on("timing")?)?; Ok(Json::Obj(vec![("stance".into(), stance), ("state".into(), ns.to_json(&p))])) } +/// S7 (§2.11): the MCP tools are the agent's own channel, and readings come from the host's instruments: an event (`key`: the +/// argument that holds its inputs) that carries readings for a persona with a senses block is refused +pub fn mcp_refuses_readings(args: &[(String, Json)], key: &str) -> R<()> { + let get = |k: &str| args.iter().find(|(x, _)| x == k).map(|(_, v)| v).filter(|v| !v.is_null()); + if !get(key).and_then(|e| e.get("senses")).is_some_and(truthy) { return Ok(()); } + let p = match (get("persona"), get("persona_path")) { (Some(d), None) => build(d).ok(), (None, Some(Json::Str(f))) => load(f).ok().map(|x| x.0), _ => None }; + if p.is_some_and(|p| p.senses.is_some()) { + return Err(perr(&format!("arguments.{key}.senses"), "readings come from the host's instruments, never through the agent's channel: MCP refuses an event that carries readings (the host sends them with probbit live or persona turn)")); } + Ok(()) +} /// `init` at `seed`, then every turn of the script -> (the stance documents, the final state) pub fn replay(p: &Persona, seed: Option, turns: &[Json], no_inertia: bool, eng: Engine, timing: bool) -> R<(Vec, State)> { let mut st = init(p, seed, true, eng); let mut out = vec![]; @@ -1472,7 +1846,8 @@ pub fn replay(p: &Persona, seed: Option, turns: &[Json], no_inertia: bool, /// `compile`: the turn's program (insertion order; its sha256 is the stance's `engine.program`) pub fn program(p: &Persona, st: &State, raw: &Json) -> R { let raw: Vec<(String, Json)> = match raw { Json::Null => vec![], Json::Obj(v) => v.clone(), _ => return Err(perr("inputs", "must be a JSON object")) }; - let (st, raw) = prep(p, st, &raw)?; + let (src, raw) = if p.senses.is_some() { take_src(p, raw, true)? } else { (None, raw) }; + let (st, raw) = prep(p, st, &raw, src.as_ref(), true)?; Ok(text(&compile(p, &st, &raw, &Opts::default())?.0)) } @@ -1574,7 +1949,10 @@ pub fn floor_verdicts(p: &Persona, seeds: &[u64]) -> Option> { /// happens on a vouched, not unsure, turn: how many probe turns, out of how many, and the earliest one. pub fn plan_warnings(p: &Persona, seeds: &[u64], eng: Engine) -> Vec { let mut probes: Vec> = vec![vec![]]; - for (id, _, vals) in alphabet(p, &[1.0], &[]) { for v in vals { probes.push(vec![(id.clone(), v)]); } } + for (id, _, vals) in alphabet(p, &[1.0], &[]) { for v in vals { + let v = match (id.strip_prefix("sense."), &p.senses) { (Some(sid), Some(sn)) => { let src = sn.list.iter().find(|x| x.id == sid).map_or("env".to_string(), |x| x.src[0].clone()); + Json::Obj(vec![("v".into(), v), ("src".into(), Json::Str(src))]) } _ => v }; + probes.push(vec![(id.clone(), v)]); } } let traits: Vec<&Var> = p.vars.iter().filter(|v| !v.mood).collect(); let (mut found, mut total): (Vec<(usize, Option)>, usize) = (vec![(0, None); traits.len()], 0); for &seed in seeds { let st = init(p, Some(seed), true, eng); @@ -1649,10 +2027,25 @@ pub fn describe(p: &Persona) -> Json { ("learn_from_surprise".into(), Json::Num(dr.kappa))]))); } // reward_from (§2.10), when declared: per reward-bearing input its allowed source kinds, or "any" if let (Json::Obj(v), Some(rw)) = (&mut d, &p.reward) { v.push(("reward_from".into(), Json::Obj(rw.iter().map(|(k, a)| (k.clone(), a.as_ref().map_or(s("any"), |a| jstrs(a)))).collect()))); } + // the senses block (§2.11), when there is one: per sense its unit, range, scale, sources, prior, caps, spreads, the input ids it + // reserves and the conditions the habits read + if let (Json::Obj(v), Some(sn)) = (&mut d, &p.senses) { let n = Json::Num; + v.push(("senses".into(), Json::Obj(sn.list.iter().enumerate().map(|(i, x)| { let mut f = vec![("kind".to_string(), s(if x.flag { "flag" } else { "number" })), ("unit".into(), s(&x.unit))]; + if !x.flag { f.push(("range".into(), Json::Arr(vec![n(x.lo), n(x.hi)]))); } + let mut reserved = vec![format!("sense_{}_up", x.id), format!("sense_{}_down", x.id)]; reserved.extend(sn.conds.iter().filter(|c| c.sense == i).map(|c| c.id.clone())); + f.extend([("scale".to_string(), s(if x.log1p { "log1p" } else { "linear" })), ("src".into(), jstrs(&x.src)), + ("prior".into(), Json::Obj(vec![("mean".into(), n(x.prior_mean)), ("var".into(), n(x.prior_var))])), ("drift_cap".into(), n(x.drift_cap)), ("var_cap".into(), n(x.var_cap)), + ("half_life_events".into(), n(x.half_life)), ("zcap".into(), n(x.zcap)), ("dead_zone".into(), n(x.dead_zone)), ("var_floor".into(), n(x.var_floor)), ("say".into(), s(&x.say)), + ("spreads".into(), Json::Obj(vec![("gain".into(), n(x.gain_spread)), ("threshold".into(), n(x.threshold_spread)), ("habituation".into(), n(x.habituation_spread))])), + ("reserved".into(), jstrs(&reserved)), + ("conditions".into(), Json::Arr(sn.conds.iter().filter(|c| c.sense == i).map(|c| s(&sense_cond_text(sn, c))).collect()))]); + (x.id.clone(), Json::Obj(f)) }).collect()))); } d } /// A trait or input the drives block adds when it is lowered (`pursue`, the drive aggregates and goal conditions): not the author's -fn lowered(p: &Persona, id: &str) -> bool { p.drives.as_ref().is_some_and(|d| id == "pursue" || d.synthetic.iter().any(|x| x == id)) } +fn lowered(p: &Persona, id: &str) -> bool { p.drives.as_ref().is_some_and(|d| id == "pursue" || d.synthetic.iter().any(|x| x == id)) || sense_input(p, id) } +/// An input the senses block adds when it is lowered (`sense__up/down`, the condition flags): not the host's +fn sense_input(p: &Persona, id: &str) -> bool { p.senses.as_ref().is_some_and(|s| s.synthetic.iter().any(|x| x == id)) } /// `check`: valid, with its digest and sizes (one engine call: the resting stance) pub fn check(p: &Persona, eng: Engine) -> R { let st = init(p, None, true, eng); let (prog, _) = compile(p, &st, &[], &Opts::default())?; @@ -1661,13 +2054,14 @@ pub fn check(p: &Persona, eng: Engine) -> R { ("traits".into(), n(p.vars.iter().filter(|v| !v.mood && !lowered(p, &v.id)).count())), ("moods".into(), n(p.vars.iter().filter(|v| v.mood).count())), ("inputs".into(), n(p.inputs.iter().filter(|x| !lowered(p, &x.id)).count())), ("history".into(), n(p.history.len())), ("habits".into(), n(p.habits.len())), ("steps".into(), n(p.steps.len())), ("program_vars".into(), n(len("vars"))), ("program_values".into(), n(len("values")))] - .into_iter().chain(p.drives.as_ref().map(|d| ("goals".to_string(), n(d.goals.len())))).collect())) + .into_iter().chain(p.drives.as_ref().map(|d| ("goals".to_string(), n(d.goals.len())))).chain(p.senses.as_ref().map(|sn| ("senses".to_string(), n(sn.list.len())))).collect())) } /// `explain`: a turn in words: per trait and mood every contribution to its field, the joint odds, the habit-free twin's level /// where it differs, the program's size and digest, the line and the why pub fn explain(p: &Persona, st: &State, raw: &Json, eng: Engine) -> R { let rawv: Vec<(String, Json)> = match raw { Json::Null => vec![], Json::Obj(v) => v.clone(), _ => return Err(perr("inputs", "must be a JSON object")) }; - let (st2, host) = prep(p, st, &rawv)?; + let (src, rawv) = if p.senses.is_some() { take_src(p, rawv, true)? } else { (None, rawv) }; + let (st2, host) = prep(p, st, &rawv, src.as_ref(), true)?; let (prog, meta) = compile(p, &st2, &host, &Opts::default())?; let doc = eng(&prog, &flags(p, st)); let (out, _) = turn(p, st, raw, false, eng, false)?; let plan: HashMap = doc.get("plan").and_then(Json::as_obj).map_or_else(HashMap::new, |o| o.iter().map(|(k, v)| (k.clone(), back(p, k, v.as_str().unwrap_or("")))).collect()); let g = |k: &str| out.get(k).cloned().unwrap_or(Json::Null); let s = |j: &Json| j.as_str().map_or_else(|| canon(j), str::to_string); @@ -1722,6 +2116,17 @@ pub fn props(p: &Persona, doc: &Json, path: &str, one: &str) -> R> { let Json::Obj(kv) = r else { return Err(perr(&rp, "a rule is a mapping {when, then} (habit syntax)")) }; let id = if get(kv, "id").is_some() { None } else if single { Some(one.to_string()) } else { Some(format!("prop{}", i + 1)) }; let mut full = kv.clone(); if let Some(id) = &id { full.insert(0, ("id".into(), Json::Str(id.clone()))); } + // a sense condition (§2.11) reads the flag of the persona's own condition on the same sense, signal and range + if let (Some(sn), Some((_, Json::Obj(w)))) = (&p.senses, full.iter_mut().find(|(k, _)| k == "when")) { + let mut nw: Vec<(String, Json)> = vec![]; + for (k, c) in w.iter() { let cp = at(&at(&rp, "when"), k); + need(!sn.reserved(k), &cp, "reserved for the senses block (a rule reads sense..raw or sense..z)")?; + if !k.starts_with("sense.") { nw.push((k.clone(), c.clone())); continue; } + let (si, z, flag, lo, hi) = parse_sense_cond(k, c, &cp, &sn.list)?; + let f = sn.conds.iter().find(|q| q.sense == si && q.z == z && q.flag == flag && q.lo == lo && q.hi == hi).ok_or_else(|| perr(&cp, format!("a property reads the sense conditions the persona's habits use: {}", + if sn.conds.is_empty() { "none".to_string() } else { sn.conds.iter().map(|q| sense_cond_text(sn, q)).collect::>().join(", ") })))?; + if !nw.iter().any(|(x, _)| *x == f.id) { nw.push((f.id.clone(), Json::Bool(true))); } } + *w = nw; } // a goal condition (drives, §2.9) reads the flag of the persona's own condition on the same goal, signal and range if let (Some(d), Some((_, Json::Obj(w)))) = (&p.drives, full.iter_mut().find(|(k, _)| k == "when")) { let mut nw: Vec<(String, Json)> = vec![]; @@ -1748,7 +2153,9 @@ pub fn doc_entry(p: &Persona, doc: &Json, id: &str) -> Option { /// The inputs a turn's conditions read, from its stance document: the host's and (drives) the aggregates and goal conditions /// again, from the drive values the turn used fn doc_inputs(p: &Persona, doc: &Json) -> Option> { - let inputs = doc.get("inputs").and_then(Json::as_obj)?.to_vec(); let Some(d) = &p.drives else { return Some(inputs) }; + let mut inputs = doc.get("inputs").and_then(Json::as_obj)?.to_vec(); + if let Some(sn) = &p.senses { inputs.retain(|(k, _)| k != "senses"); inputs.extend(doc_sense_inputs(sn, doc)?); } + let Some(d) = &p.drives else { return Some(inputs) }; let dj = doc.get("drives")?; let per = |k: &str| -> Option> { let o = dj.get(k)?; d.goals.iter().map(|g| o.get(&g.id).cloned()).collect() }; let nums = |k: &str| -> Option> { per(k)?.iter().map(Json::as_f64).collect() }; @@ -1790,7 +2197,7 @@ pub fn pressure(p: &Persona, pr: &Prop, before: &State, doc: &Json) -> f64 { /// The event alphabet: per declared input its non-default values (a flag: true; a level input: its other levels; a number: `grid` /// x its max, without its default), then `elapsed_hours` (`hours`) when a mood has a half-life. -> (id, kind, values) pub fn alphabet(p: &Persona, grid: &[f64], hours: &[f64]) -> Vec<(String, &'static str, Vec)> { - let host = |x: &&Input| !p.drives.as_ref().is_some_and(|d| d.synthetic.contains(&x.id)); // the drives' own inputs are not the host's + let host = |x: &&Input| !p.drives.as_ref().is_some_and(|d| d.synthetic.contains(&x.id)) && !sense_input(p, &x.id); // the drives' and senses' own inputs are not the host's let mut out: Vec<(String, &'static str, Vec)> = p.inputs.iter().filter(host).map(|x| match x.kind { Kind::Flag => (x.id.clone(), "flag", vec![Json::Bool(true)]), Kind::Level => (x.id.clone(), "level", x.levels.iter().filter(|l| Some(l.as_str()) != x.default.as_str()).map(|l| Json::Str(l.clone())).collect()), @@ -1804,26 +2211,42 @@ pub fn alphabet(p: &Persona, grid: &[f64], hours: &[f64]) -> Vec<(String, &'stat if !w.is_empty() { out.push((format!("goal.{}.win", g.id), "goal", w)); } out.push((format!("goal.{}.cue", g.id), "goal", vec![Json::Bool(true)])); let h = pos_hours(); if !h.is_empty() { out.push((format!("goal.{}.deadline_hours", g.id), "goal", h)); } } } + // senses (§2.11): per sense its readings (`sense.`; `event_json` nests them): a flag both ways, a number on the grid x its + // range and at every threshold a raw condition reads + if let Some(sn) = &p.senses { for (i, x) in sn.list.iter().enumerate() { + let vals: Vec = if x.flag { vec![Json::Bool(true), Json::Bool(false)] } else { let mut v: Vec = vec![]; + for g in grid { let y = r6(x.lo + g * (x.hi - x.lo)); if !v.contains(&y) { v.push(y); } } + for c in sn.conds.iter().filter(|c| c.sense == i && !c.z) { for t in [c.lo, c.hi] { if t.is_finite() && t >= x.lo && t <= x.hi && !v.contains(&t) { v.push(t); } } } + v.into_iter().map(Json::Num).collect() }; + out.push((format!("sense.{}", x.id), "sense", vals)); } } out } +/// A sense's readings for the fuzzer's patterns: (the alphabet id, its readings, the range ends) per sense +pub fn sense_patterns(p: &Persona, grid: &[f64]) -> Vec<(String, Vec, (Json, Json))> { + let Some(sn) = &p.senses else { return vec![] }; + alphabet(p, grid, &[]).into_iter().filter(|(_, k, _)| *k == "sense").map(|(id, _, vals)| { let s = &sn.list[sn.list.iter().position(|x| format!("sense.{}", x.id) == id).unwrap()]; + let ends = if s.flag { (Json::Bool(false), Json::Bool(true)) } else { (Json::Num(s.lo), Json::Num(s.hi)) }; (id, vals, ends) }).collect() +} /// The thresholds the rules and the habits read on number inputs, on the grid's scale (a fraction of the input's max), each once, /// in ascending order: the values at which a condition flips, so the search can put an input exactly there pub fn thresholds(p: &Persona, props: &[Prop]) -> Vec { let mut out: Vec = vec![]; for w in p.habits.iter().map(|h| &h.when).chain(props.iter().map(|q| &q.habit.when)) { for (k, c) in w { // the host's number inputs (the drives' own inputs are not on the search's alphabet) - let Some(x) = p.input(k).filter(|x| x.kind == Kind::Number && !p.drives.as_ref().is_some_and(|d| d.synthetic.contains(&x.id))) else { continue }; + let Some(x) = p.input(k).filter(|x| x.kind == Kind::Number && !p.drives.as_ref().is_some_and(|d| d.synthetic.contains(&x.id)) && !sense_input(p, &x.id)) else { continue }; let ts: Vec = match c { Json::Num(t) => vec![*t], _ => ["at_least", "at_most"].iter().filter_map(|b| c.get(b).and_then(Json::as_f64)).collect() }; for t in ts { if t >= 0.0 && t <= x.max { let g = t / x.max; if !out.contains(&g) { out.push(g); } } } } } out.sort_by(|a, b| a.partial_cmp(b).unwrap()); out } /// An event of the alphabet as turn inputs: `goal..` entries nested into `goals` (after the host's inputs) pub fn event_json(e: &[(String, Json)]) -> Json { - let mut v: Vec<(String, Json)> = vec![]; let mut goals: Vec<(String, Json)> = vec![]; - for (k, x) in e { match k.strip_prefix("goal.").and_then(|r| r.split_once('.')) { + let mut v: Vec<(String, Json)> = vec![]; let mut goals: Vec<(String, Json)> = vec![]; let mut senses: Vec<(String, Json)> = vec![]; + for (k, x) in e { if let Some(sid) = k.strip_prefix("sense.") { senses.push((sid.to_string(), x.clone())); continue; } + match k.strip_prefix("goal.").and_then(|r| r.split_once('.')) { Some((g, sig)) => match goals.iter_mut().find(|(id, _)| id == g) { Some((_, Json::Obj(o))) => o.push((sig.to_string(), x.clone())), _ => goals.push((g.to_string(), Json::Obj(vec![(sig.to_string(), x.clone())]))) }, None => v.push((k.clone(), x.clone())) } } if !goals.is_empty() { v.push(("goals".into(), Json::Obj(goals))); } + if !senses.is_empty() { v.push(("senses".into(), Json::Obj(senses))); } Json::Obj(v) } /// The input assignments that put the property in force: one per combination of its input conditions (a level list gives one @@ -1831,6 +2254,13 @@ pub fn event_json(e: &[(String, Json)]) -> Json { pub fn forcing(p: &Persona, pr: &Prop, grid: &[f64]) -> Vec> { let mut bases: Vec> = vec![vec![]]; for (k, c) in &pr.habit.when { + if let Some((sn, q)) = p.senses.as_ref().and_then(|sn| sn.conds.iter().find(|q| q.id == *k).map(|q| (sn, q))) { // a sense condition: a raw one by its reading + let s = &sn.list[q.sense]; if q.z { continue; } // a z condition depends on the normal: left to the search + let v = match q.flag { Some(b) => Json::Bool(b), None => { let mut v: Vec = grid.iter().map(|g| r6(s.lo + g * (s.hi - s.lo))).filter(|v| *v >= q.lo && *v <= q.hi).collect(); + v.sort_by(|a, b| a.partial_cmp(b).unwrap()); let b = q.lo.max(s.lo).min(s.hi); + match v.first() { Some(x) => Json::Num(*x), None if b >= q.lo && b <= q.hi => Json::Num(b), None => continue } } }; + let key = format!("sense.{}", s.id); + bases = bases.iter().map(|b| { let mut nb = b.clone(); if !nb.iter().any(|(x, _)| *x == key) { nb.push((key.clone(), v.clone())); } nb }).collect(); continue; } if let Some(q) = p.drives.as_ref().and_then(|d| d.conds.iter().find(|q| q.id == *k)) { // a goal condition: a deadline puts it in force at once let v = if q.hi.is_finite() { q.hi } else { q.lo.max(0.0) }; if q.sig != "deadline_hours" || !(v >= q.lo && v <= q.hi && (0.0..=1e6).contains(&v)) { continue; } @@ -2015,7 +2445,7 @@ fn cell_inputs(p: &Persona, raw: &[(String, Json)]) -> (Json, Option) { /// every answer the bound reads must be exact. pub fn prove_seed(p: &Persona, pr: &Prop, seed: u64, eng: Engine) -> Result<(usize, usize), (Json, String)> { if !pr.habit.rules.is_empty() { return Err((Json::Null, "raw rules are not covered by the bound".into())); } - let st0 = init(p, Some(seed), false, eng); let gain = |id: &str| st0.react(id).unwrap_or(1.0); + let st0 = init(p, Some(seed), false, eng); let gain = |id: &str| input_gain(p, &st0, id); let eff_of = |e: &Eff, t: &str| e.iter().find(|(x, _)| x == t).map(|(_, v)| v.clone()); let mut boxes: Vec<(String, Vec, Vec)> = vec![]; for v in p.vars.iter().filter(|v| v.mood) { let n = v.levels.len(); let (mut lo, mut hi) = (vec![0.0; n], vec![0.0; n]); @@ -2429,6 +2859,252 @@ mod tests { /// -1..0, deadline 0..1.5), so a 2.5 margin at rest is not a proof (a script breaks it); a 6.5 margin is const BOX: &str = r#"{"probbit_persona":1,"identity":{"name":"Boxer","version":"0.1.0","seed":0},"traits":[{"id":"caution","levels":["bold","measured","careful"],"prior":[0.3,0.5,0.2]}], "inputs":[{"id":"security","kind":"flag","effects":{"pursue":{"safety":2.5}}}],"drives":{"goals":[{"id":"fun","interest":1.0},{"id":"safety","interest":1.0}],"wanting":{"cap":3}}}"#; + // ------------------------------------------------------------------------------------------------ senses (§2.11) + /// A test individual with two senses (a flag at the defaults of the RFC's arithmetic, a number), a habit on the flag's raw + /// reading, learning on caution and reward_from + const SEN: &str = r#"{"probbit_persona":1,"identity":{"name":"Sensor","version":"0.1.0","seed":0}, + "traits":[{"id":"caution","levels":["bold","measured","careful"],"prior":[0.4,0.4,0.2],"spread":0.4},{"id":"verbosity","levels":["terse","short","full"],"prior":[0.2,0.4,0.4]}], + "moods":[{"id":"valence","levels":["down","even","up"],"inertia":0.5,"half_life_hours":6}], + "inputs":[{"id":"praise","kind":"flag","effects":{"valence":0.5}},{"id":"criticism","kind":"flag","effects":{"valence":-0.5}}], + "senses":[{"id":"tool_fail","kind":"flag","unit":"event","prior":{"mean":0.05,"var":0.05},"drift_cap":0.25,"say":"tool failures","effects":{"caution":0.8,"valence":-0.4}}, + {"id":"tempo","kind":"number","unit":"messages","range":[0,200],"prior":{"mean":1,"var":1},"drift_cap":2,"effects":{"verbosity":-0.4}}], + "habits":[{"id":"no_bold_after_failure","when":{"sense.tool_fail.raw":true},"then":{"caution":{"not":["bold"]}}}, + {"id":"short_when_busy","when":{"sense.tempo.raw":{"at_least":20}},"then":{"verbosity":{"at_most":"short"}}}], + "learning":{"from":["praise","criticism"],"traits":["caution"],"rate":0.3,"step_cap":0.1,"total_cap":0.4},"reward_from":["human","env"]}"#; + fn sen() -> Persona { build(&json::parse(SEN).unwrap()).unwrap() } + fn sen_with(from: &str, to: &str) -> R { assert!(SEN.contains(from), "{from}"); build(&json::parse(&SEN.replacen(from, to, 1)).unwrap()) } + /// One flag sense at the RFC's defaults (prior 0.05/0.05, drift_cap 0.25, var_cap 0.2, half-life 10, zcap 6, dead zone 0.5, + /// var_floor 0.01, spreads 0), with `extra` fields + fn flag_sense(extra: &str) -> (Senses, SState) { + let doc = SEN.replacen(r#""prior":{"mean":0.05,"var":0.05},"drift_cap":0.25"#, &format!(r#""prior":{{"mean":0.05,"var":0.05}},"drift_cap":0.25{extra}"#), 1); + let p = build(&json::parse(&doc).unwrap()).unwrap(); let sn = p.senses.clone().unwrap(); let ss = SState::zero(&p.name, &sn, 0); (sn, ss) + } + /// Readings of the flag sense from `ss`: (the state after them, per reading (z, zd)) + fn feed(sn: &Senses, mut ss: SState, xs: &[bool]) -> (SState, Vec<(f64, f64)>) { + let mut out = vec![]; + for x in xs { let ev = json::parse(&format!(r#"{{"senses":{{"tool_fail":{x}}},"src":"env"}}"#)).unwrap(); let raw = ev.as_obj().unwrap().to_vec(); + let (ns, _) = sense_step(sn, &ss, &raw, get(&raw, "src"), true).unwrap(); let r = ns.read[0].clone().unwrap(); out.push((r.z, r.zd)); ss = ns; } + (ss, out) + } + + /// RFC 0001 A.3 against the lab arithmetic (ARITH-CHECK.json): habituation (zd 3.378359 -> 1.027525 from reading 6 on, the + /// ratio 0.304 at reading 20), surprise (6.0 vs 1.75286 after 40 quiet / 40 readings at rate 0.3: 3.42 at zcap 6, 1.71 at zcap + /// 3), the closed form of n identical readings within 1e-5 over 12 readings, the variance cap after alternating range ends + #[test] + fn the_sense_step_reproduces_the_rfc_arithmetic() { + let (sn, ss) = flag_sense(""); + let (end, zs) = feed(&sn, ss.clone(), &[true; 200]); + assert_eq!((zs[0].0, zs[0].1, zs[19].0, zs[19].1, zs[199].0), (3.878359, 3.378359, 1.527525, 1.027525, 1.527525)); + assert!(zs[5..].iter().all(|z| z.1 == 1.027525), "from reading 6 on the push stays at its floor"); + let ratio = zs[19].1 / zs[0].1; assert!((ratio - 0.304).abs() < 5e-4 && ratio <= 0.35, "habituation ratio {ratio}"); + assert_eq!((end.mean[0], end.var[0], end.n[0]), (0.3, 0.2, 200), "the drift and variance caps hold a chronic failure"); + let quiet: Vec = (0..40).map(|_| false).chain([true]).collect(); let failing: Vec = (0..40).map(|k| [0, 3, 6].contains(&(k % 10))).chain([true]).collect(); + for (zcap, zq, want) in [("", 6.0, 3.423), (r#","zcap":3"#, 3.0, 1.711)] { let (sn, ss) = flag_sense(zcap); + let (q, f) = (feed(&sn, ss.clone(), &quiet).1, feed(&sn, ss, &failing).1); let (a, b) = (q[40].0, f[40].0); + assert_eq!((a, b), (zq, 1.75286)); assert!(((a / b) - want).abs() < 5e-4, "surprise ratio {} at {zcap}", a / b); } + // the closed form before the caps: a number sense with wide caps, 12 readings of 0.5 from a normal at 0.4 + let doc = SEN.replacen(r#""prior":{"mean":1,"var":1},"drift_cap":2"#, r#""prior":{"mean":0.4,"var":0.05},"drift_cap":10,"var_cap":10"#, 1); + let p = build(&json::parse(&doc).unwrap()).unwrap(); let sn = p.senses.clone().unwrap(); let mut ss = SState::zero(&p.name, &sn, 0); + let a = r6(1.0 - 0.5f64.powf(0.1)); assert_eq!(a, 0.066967); + for n in 1..=12 { let raw = json::parse(r#"{"senses":{"tempo":0.5},"src":"env"}"#).unwrap().as_obj().unwrap().to_vec(); ss = sense_step(&sn, &ss, &raw, get(&raw, "src"), true).unwrap().0; + let closed = 0.5 + (1.0 - a).powi(n) * (0.4 - 0.5); assert!((ss.mean[1] - closed).abs() < 1e-5, "reading {n}: {} vs {closed}", ss.mean[1]); } + assert_eq!(ss.mean[1], 0.456471); + // the variance cap: 200 readings alternating at the range ends, then a failure: the spread at most doubles + let (sn, ss) = flag_sense(""); let alt: Vec = (0..200).map(|k| k % 2 == 1).chain([true]).collect(); let (st, zs) = feed(&sn, ss, &alt); + assert_eq!((st.var[0] <= 0.2, zs[200].0), (true, 1.527525)); assert!(((zs[200].0 / 3.878359) - 0.394).abs() < 5e-4); + } + + /// 100,000 adversarial readings (the range ends in blocks of 7) never move the mean out of prior ± drift_cap nor the variance out + /// of [0, var_cap]; the count stops at 1e6 (here: 100,000) + #[test] + fn adversarial_readings_stay_inside_the_caps() { + let (sn, mut ss) = flag_sense(""); let (mut lo, mut hi) = (0.05f64, 0.05f64); + let ev = |x: bool| json::parse(&format!(r#"{{"senses":{{"tool_fail":{x}}},"src":"env"}}"#)).unwrap().as_obj().unwrap().to_vec(); + let (on, off) = (ev(true), ev(false)); + for k in 0..100_000 { let raw = if (k / 7) % 3 != 0 { &on } else { &off }; ss = sense_step(&sn, &ss, raw, get(raw, "src"), true).unwrap().0; + lo = lo.min(ss.mean[0]); hi = hi.max(ss.mean[0]); assert!((0.0..=0.2).contains(&ss.var[0]), "var {}", ss.var[0]); } + assert!(lo >= -0.2 && hi <= 0.3, "mean in [{lo}, {hi}]"); assert_eq!((r6(lo), hi, ss.n[0]), (0.030778, 0.3, 100_000)); + } + + /// The lint rows of §2.11: each refused when the persona is read, at its path + #[test] + fn every_lint_row_is_refused_at_its_path() { + let bad = |from: &str, to: &str| err(sen_with(from, to)); + // a taken sense_ id + assert_eq!(bad(r#"{"id":"criticism","kind":"flag""#, r#"{"id":"sense_tool_fail_x","kind":"flag""#), "inputs[1].id: reserved by a sense (sense__*)"); + // an effect on an unknown target + assert_eq!(bad(r#""effects":{"caution":0.8,"valence":-0.4}"#, r#""effects":{"spirit":0.8}"#), "senses[0].effects.spirit: unknown trait or mood \"spirit\""); + assert_eq!(bad(r#""effects":{"caution":0.8,"valence":-0.4}"#, r#""effects":{"caution":[0,0,1]}"#), "senses[0].effects.caution: a number (an ordinal shift per unit of z)"); + // src naming self or clock + assert_eq!(bad(r#""unit":"event","#, r#""unit":"event","src":["self"],"#), "senses[0].src[0]: a reading never comes from the individual itself"); + assert_eq!(bad(r#""unit":"event","#, r#""unit":"event","src":["env","clock"],"#), "senses[0].src[1]: the clock is not an instrument: readings come from env or human"); + // prior.mean outside the scaled range; prior.var <= 0; drift_cap <= 0; var_cap < prior.var; dead_zone >= zcap + assert_eq!(bad(r#""prior":{"mean":0.05,"var":0.05}"#, r#""prior":{"mean":1.5,"var":0.05}"#), "senses[0].prior.mean: within the scaled range [0, 1]"); + assert_eq!(bad(r#""prior":{"mean":0.05,"var":0.05}"#, r#""prior":{"mean":0.05,"var":0}"#), "senses[0].prior.var: must be > 0"); + assert_eq!(bad(r#""drift_cap":0.25"#, r#""drift_cap":0"#), "senses[0].drift_cap: must be > 0"); + assert_eq!(bad(r#""drift_cap":0.25"#, r#""drift_cap":0.25,"var_cap":0.04"#), "senses[0].var_cap: must be >= prior.var"); + assert_eq!(bad(r#""drift_cap":0.25"#, r#""drift_cap":0.25,"zcap":2,"dead_zone":2"#), "senses[0].dead_zone: must be < zcap"); + // log1p on a flag or a negative range low + assert_eq!(bad(r#""unit":"event","#, r#""unit":"event","scale":"log1p","#), "senses[0].scale: log1p needs a number sense (a flag's normal is a rate)"); + assert_eq!(bad(r#""range":[0,200]"#, r#""range":[-1,200],"scale":"log1p""#), "senses[1].scale: log1p needs a range low >= 0"); + // a cap with more than 6 decimals + assert_eq!(bad(r#""drift_cap":0.25"#, r#""drift_cap":0.2500001"#), "senses[0].drift_cap: a cap has at most 6 decimals"); + assert_eq!(bad(r#""drift_cap":0.25"#, r#""drift_cap":0.25,"var_cap":0.2000001"#), "senses[0].var_cap: a cap has at most 6 decimals"); + // the schema: unknown fields, a number without a range, ids, kinds, counts + assert_eq!(bad(r#""unit":"event","#, r#""unit":"event","norm":"host","#), "senses[0].norm: unknown field (allowed: comment, dead_zone, drift_cap, effects, gain_spread, habituation_spread, half_life_events, id, kind, prior, range, say, scale, src, threshold_spread, unit, var_cap, var_floor, zcap)"); + assert_eq!(bad(r#""range":[0,200],"#, ""), "senses[1].range: required for a number sense: [lo, hi]"); + assert_eq!(bad(r#""id":"tempo""#, r#""id":"tool_fail""#), "senses[1].id: sense ids must be distinct"); + assert_eq!(bad(r#""id":"tempo""#, r#""id":"a_very_long_sense_id_of_33_chars_x""#), "senses[1].id: at most 32 characters (a sense reserves the input ids sense__*)"); + assert!(err(build(&json::parse(&SEN.replace(r#""senses":["#, r#""senses":[],"x":["#)).unwrap())).starts_with(""), "the parser still reads"); + assert_eq!(err(build(&json::parse(r#"{"probbit_persona":1,"identity":{"name":"X","version":"1"},"traits":[{"id":"a","levels":["x","y"]}],"senses":[]}"#).unwrap())), "senses: a list of 1 to 24 senses"); + } + + /// S1: a reading for an undeclared sense, a number outside its range or a flag that is not true/false refuses the event at + /// inputs.senses.; nothing is clipped. S2: each reading's source kind must be in its `src`; missing, malformed, self and + /// clock refuse the event whole. A refused event changes nothing (the turn is an error; the state is the caller's). + #[test] + fn s1_s2_readings_are_declared_in_range_and_sourced() { + let p = sen(); let st = init(&p, Some(1), true, &run); let t = |ev: &str| err(turn(&p, &st, &json::parse(ev).unwrap(), false, &run, false)); + assert_eq!(t(r#"{"senses":{"latency":3},"src":"env"}"#), "inputs.senses.latency: not a declared sense (senses: tool_fail, tempo)"); + assert_eq!(t(r#"{"senses":{"tempo":201},"src":"env"}"#), "inputs.senses.tempo: a number in [0, 200] (messages)"); + assert_eq!(t(r#"{"senses":{"tempo":-1},"src":"env"}"#), "inputs.senses.tempo: a number in [0, 200] (messages)"); + assert_eq!(t(r#"{"senses":{"tool_fail":1},"src":"env"}"#), "inputs.senses.tool_fail: a flag sense reads true | false"); + assert_eq!(t(r#"{"senses":{"tool_fail":{"v":"yes","src":"env"}}}"#), "inputs.senses.tool_fail.v: a flag sense reads true | false"); + assert_eq!(t(r#"{"senses":{"tool_fail":true}}"#), "inputs.src: a reading of tool_fail needs a source: the event's src or its own (env)"); + assert_eq!(t(r#"{"senses":{"tool_fail":true},"src":"self"}"#), "inputs.src: a reading of tool_fail from the individual itself (src self) is refused: readings come from env"); + assert_eq!(t(r#"{"senses":{"tool_fail":true},"src":"clock"}"#), "inputs.src: a reading of tool_fail from the clock is refused: readings come from env"); + assert_eq!(t(r#"{"senses":{"tool_fail":true},"src":"human:a"}"#), "inputs.src: a reading of tool_fail from human is refused: tool_fail reads from env"); + assert_eq!(t(r#"{"senses":{"tool_fail":{"v":true,"src":"env:"}}}"#), "inputs.senses.tool_fail.src: a source: human[:id] | env[:id] (id: 1-64 of A-Z a-z 0-9 _ . - @ / :)"); + assert_eq!(t(r#"{"senses":{"tempo":3},"src":7}"#), "inputs.src: a source: human[:id] | env[:id] | self | clock (id: 1-64 of A-Z a-z 0-9 _ . - @ / :)"); + assert_eq!(t(r#"{"senses":[1]}"#), "inputs.senses: a mapping sense id -> reading"); + // accepted: a bare value takes the event's src, a reading may carry its own; self and clock may send events without readings + for ev in [r#"{"senses":{"tool_fail":true,"tempo":{"v":3,"src":"env:chat"}},"src":"env:runner"}"#, r#"{"senses":{"tool_fail":{"v":false,"src":"env"}},"src":"self"}"#, r#"{"src":"self"}"#, r#"{"src":"clock","elapsed_hours":3}"#] { + let (doc, _) = turn(&p, &st, &json::parse(ev).unwrap(), false, &run, false).unwrap_or_else(|e| panic!("{ev}: {}", e.msg)); + assert!(g(&doc, &["ignored"]).as_arr().unwrap().is_empty(), "{ev}: senses and src are read, not ignored"); } + let (doc, _) = turn(&p, &st, &json::parse(r#"{"senses":{"tool_fail":true,"tempo":{"v":3,"src":"env:chat"}},"src":"env:runner"}"#).unwrap(), false, &run, false).unwrap(); + assert_eq!(canon(g(&doc, &["senses"])), r#"{"tempo":{"mean":1,"n":0,"raw":3,"src":"env:chat","z":1.990074,"zd":1.490074},"tool_fail":{"mean":0.05,"n":0,"raw":true,"src":"env:runner","z":3.878359,"zd":3.378359}}"#); + assert_eq!(canon(g(&doc, &["inputs", "senses"])), r#"{"tempo":{"src":"env:chat","v":3},"tool_fail":true}"#); + } + + /// S3: the engine owns the normal: a host cannot send the lowering's inputs or a pre-judged z, and z, the normals and the + /// genes come from the logged readings only (two individuals fed the same readings have the same normals). S5: no rule reads + /// the normal, and a condition on a sense not read this event is false. S6: normals move only on readings. + #[test] + fn s3_s5_s6_the_engine_owns_the_normal() { + let p = sen(); let st = init(&p, Some(1), true, &run); let t = |ev: &str| err(turn(&p, &st, &json::parse(ev).unwrap(), false, &run, false)); + assert_eq!(t(r#"{"sense_tool_fail_up":6}"#), "inputs.sense_tool_fail_up: reserved for the senses block (the engine computes it from the readings)"); + assert_eq!(t(r#"{"sense_tool_fail_c0":true}"#), "inputs.sense_tool_fail_c0: reserved for the senses block (the engine computes it from the readings)"); + assert_eq!(t(r#"{"senses":{"tool_fail":{"v":true,"z":6}},"src":"env"}"#), "inputs.senses.tool_fail.z: unknown field (allowed: src, v)"); + let a = init(&p, Some(1), true, &run); let b = init(&p, Some(2), true, &run); let ev = json::parse(r#"{"senses":{"tool_fail":true,"tempo":40},"src":"env"}"#).unwrap(); + let (sa, sb) = (turn(&p, &a, &ev, false, &run, false).unwrap().1, turn(&p, &b, &ev, false, &run, false).unwrap().1); + assert_eq!(canon(g(&sa.to_json(&p), &["senses", "norm"])), canon(g(&sb.to_json(&p), &["senses", "norm"])), "zero spreads: the normal is the readings'"); + // S5: a rule never reads the normal; an unread sense's condition is false (the habit is not in force) + assert_eq!(err(sen_with(r#""when":{"sense.tool_fail.raw":true}"#, r#""when":{"sense.tool_fail.mean":{"at_least":0.2}}"#)), "habits[0].when.sense.tool_fail.mean: a rule reads sense..raw or sense..z, never the normal (mean, var, n)"); + assert_eq!(err(sen_with(r#""when":{"sense.tool_fail.raw":true}"#, r#""when":{"sense.latency.raw":true}"#)), "habits[0].when.sense.latency.raw: unknown sense \"latency\""); + assert_eq!(err(sen_with(r#""when":{"sense.tool_fail.raw":true}"#, r#""when":{"sense.tool_fail.raw":1}"#)), "habits[0].when.sense.tool_fail.raw: true | false (a flag sense's reading)"); + let (quiet, _) = turn(&p, &st, &json::parse(r#"{"senses":{"tempo":3},"src":"env"}"#).unwrap(), false, &run, false).unwrap(); + assert!(g(&quiet, &["habits", "active"]).as_arr().unwrap().is_empty(), "tool_fail unread: its condition is false"); + let (fail, _) = turn(&p, &st, &json::parse(r#"{"senses":{"tool_fail":true},"src":"env"}"#).unwrap(), false, &run, false).unwrap(); + assert_eq!(canon(g(&fail, &["habits", "active"])), r#"["no_bold_after_failure"]"#); + // S6: idle hours, events without readings and a cleared credit leave the normals as they were + let (_, s1) = turn(&p, &st, &json::parse(r#"{"senses":{"tool_fail":true,"tempo":30},"src":"env"}"#).unwrap(), false, &run, false).unwrap(); + let (_, s2) = turn(&p, &s1, &json::parse(r#"{"elapsed_hours":720,"praise":true,"src":"human:a"}"#).unwrap(), false, &run, false).unwrap(); + let s3 = s2.zero_credit(&p); + assert_eq!(canon(g(&s1.to_json(&p), &["senses"])), canon(g(&s3.to_json(&p), &["senses"])), "no clock decay"); + } + + /// S4: a state is refused, even with a recomputed digest, if a mean leaves prior ± drift_cap, a variance leaves [0, var_cap], + /// n is not a whole number up to 1e6, the sense set differs from the persona's or a gene misses its seed + #[test] + fn s4_a_state_out_of_its_anchors_is_refused() { + let p = sen_with(r#""effects":{"verbosity":-0.4}}"#, r#""effects":{"verbosity":-0.4},"gain_spread":0.5}"#).unwrap(); let st = init(&p, Some(4), true, &run); + assert!(State::read(&p, &st.to_json(&p)).is_ok()); + let reseal = |f: &dyn Fn(&mut SState)| { let mut s = st.clone(); f(s.senses.as_mut().unwrap()); s.seal(&p); err(State::read(&p, &s.to_json(&p))) }; + assert_eq!(reseal(&|s| s.mean[0] = 0.31), "state.senses.norm.tool_fail.mean: within prior.mean ± drift_cap: [-0.2, 0.3]"); + assert_eq!(reseal(&|s| s.mean[1] = -1.5), "state.senses.norm.tempo.mean: within prior.mean ± drift_cap: [-1, 3]"); + assert_eq!(reseal(&|s| s.var[0] = 0.21), "state.senses.norm.tool_fail.var: within [0, var_cap = 0.2]"); + assert_eq!(reseal(&|s| s.var[1] = -0.01), "state.senses.norm.tempo.var: within [0, var_cap = 4]"); + assert_eq!(reseal(&|s| s.n[0] = 1_000_001), "state.senses.norm.tool_fail.n: a whole number from 0 to 1000000"); + assert_eq!(reseal(&|s| s.genes = sense_genes("Sensor", &p.senses.clone().unwrap(), 5)), "state.senses.genes: sense genes do not match the seed"); + let body = |j: &Json| Json::Obj(j.as_obj().unwrap().iter().filter(|(k, _)| k != "digest").cloned().collect()); + let edit = |f: &dyn Fn(&mut Vec<(String, Json)>)| { let mut kv: Vec<(String, Json)> = body(&st.to_json(&p)).as_obj().unwrap().to_vec(); + if let Some((_, Json::Obj(sv))) = kv.iter_mut().find(|(k, _)| k == "senses") { if let Some((_, Json::Obj(nv))) = sv.iter_mut().find(|(k, _)| k == "norm") { f(nv); } } + let b = Json::Obj(kv.clone()); kv.push(("digest".into(), Json::Str(sha(&b)))); err(State::read(&p, &Json::Obj(kv))) }; + assert_eq!(edit(&|n| { n.retain(|(k, _)| k != "tempo"); }), "state.senses.norm: one normal per sense of the persona (tool_fail, tempo)"); + assert_eq!(edit(&|n| { n.push(("latency".into(), json::parse(r#"{"mean":0,"var":1,"n":0}"#).unwrap())); }), "state.senses.norm: one normal per sense of the persona (tool_fail, tempo)"); + assert_eq!(edit(&|n| { if let Some((_, Json::Obj(t))) = n.iter_mut().find(|(k, _)| k == "tempo") { t.iter_mut().for_each(|(k, v)| if k == "n" { *v = Json::Num(2.5) }); } }), "state.senses.norm.tempo.n: a whole number from 0 to 1000000"); + // without the block a state refuses a senses field; with it the field is required + let q = persona(""); let q = q.unwrap(); let j = init(&q, None, true, &run).to_json(&q); + let mut kv: Vec<(String, Json)> = j.as_obj().unwrap().iter().filter(|(k, _)| k != "digest").cloned().collect(); kv.push(("senses".into(), Json::Obj(vec![]))); + let b = Json::Obj(kv.clone()); kv.push(("digest".into(), Json::Str(sha(&b)))); + assert_eq!(err(State::read(&q, &Json::Obj(kv))), "state.senses: this persona has no senses block"); + let mut s = st.clone(); s.senses = None; s.seal(&p); assert_eq!(err(State::read(&p, &s.to_json(&p))), "state.senses: required with a senses block"); + } + + /// Genes come from name, seed and sense id: editing an unrelated sense (its prior, caps, effects, spreads) or adding one keeps + /// every other sense's genes and every trait's; another seed is another individual + #[test] + fn sense_genes_survive_an_unrelated_edit() { + let spreads = r#","gain_spread":0.3,"threshold_spread":0.3,"habituation_spread":0.3"#; + let base = SEN.replace(r#""say":"tool failures""#, &format!(r#""say":"tool failures"{spreads}"#)).replace(r#""drift_cap":2"#, &format!(r#""drift_cap":2{spreads}"#)); + let p = build(&json::parse(&base).unwrap()).unwrap(); + let q = build(&json::parse(&base.replace(r#""prior":{"mean":1,"var":1},"drift_cap":2"#, r#""prior":{"mean":5,"var":4},"drift_cap":3"#).replace(r#""effects":{"verbosity":-0.4}"#, r#""effects":{"verbosity":-1.0}"#)).unwrap()).unwrap(); + let (gp, gq) = (sense_genes(&p.name, p.senses.as_ref().unwrap(), 7), sense_genes(&q.name, q.senses.as_ref().unwrap(), 7)); + for k in ["gain", "threshold", "habituation"] { assert_eq!(g(&gp, &[k, "tool_fail"]), g(&gq, &[k, "tool_fail"]), "{k}"); assert_eq!(g(&gp, &[k, "tempo"]), g(&gq, &[k, "tempo"]), "{k}: the edit is not a gene"); } + assert_eq!(canon(&genes(&p, 7)), canon(&genes(&q, 7)), "trait genes too"); + assert_ne!(canon(&gp), canon(&sense_genes(&p.name, p.senses.as_ref().unwrap(), 8)), "another seed, another individual"); + assert_ne!(p.digest, q.digest, "the edit changes the persona digest"); + } + + /// A habit on `sense.tool_fail.raw` holds by construction for the rule with the same condition; a rule with a condition the + /// habits do not read is refused (a property reads the persona's own conditions) + #[test] + fn a_habit_on_a_raw_reading_holds_by_construction() { + let p = sen(); let pr = |t: &str| props(&p, &json::parse(t).unwrap(), "--never", "never"); + let rule = pr(r#"{"when":{"sense.tool_fail.raw":true},"then":{"caution":{"not":["bold"]}}}"#).unwrap(); + assert_eq!(by_construction(&p, &rule[0], &run), Some(vec!["no_bold_after_failure".to_string()])); + let busy = pr(r#"{"when":{"sense.tempo.raw":{"at_least":20}},"then":{"verbosity":["terse","short"]}}"#).unwrap(); + assert_eq!(by_construction(&p, &busy[0], &run), Some(vec!["short_when_busy".to_string()])); + assert_eq!(err(pr(r#"{"when":{"sense.tool_fail.z":{"at_least":2}},"then":{"caution":{"not":["bold"]}}}"#)), + "--never.when.sense.tool_fail.z: a property reads the sense conditions the persona's habits use: sense.tool_fail.raw = true, sense.tempo.raw >= 20"); + assert_eq!(err(pr(r#"{"when":{"sense_tool_fail_c0":true},"then":{"caution":["careful"]}}"#)), "--never.when.sense_tool_fail_c0: reserved for the senses block (a rule reads sense..raw or sense..z)"); + // the fuzzer's grammar: readings nested into `senses`; forcing puts the raw condition in force by its reading + let a = alphabet(&p, &[0.0, 0.5, 1.0], &[]); let tf = a.iter().find(|x| x.0 == "sense.tool_fail").unwrap(); assert_eq!(canon(&Json::Arr(tf.2.clone())), "[true,false]"); + assert_eq!(canon(&Json::Arr(a.iter().find(|x| x.0 == "sense.tempo").unwrap().2.clone())), "[0,100,200,20]"); + assert!(!a.iter().any(|x| x.0.starts_with("sense_")), "the lowering's inputs are not on the alphabet"); + assert_eq!(canon(&event_json(&[("praise".into(), Json::Bool(true)), ("sense.tempo".into(), Json::Num(20.0))])), r#"{"praise":true,"senses":{"tempo":20}}"#); + assert_eq!(forcing(&p, &busy[0], &[0.0, 0.5, 1.0]), vec![vec![("sense.tempo".to_string(), Json::Num(100.0))]]); + // prove reads the lowering's inputs as boxes: the rule is proved for every event sequence where it is not held outright + assert!(prove_seed(&p, &rule[0], 0, &run).is_ok()); + } + + /// The stance's `why` names the past: the normal clause (far above / above / usual for it now) and, with learning, the + /// learned clause and its counts in `learned_from`; `line.why_past: false` keeps the learned clause out + #[test] + fn why_names_the_normal_and_what_the_weights_came_from() { + let p = sen(); let mut st = init(&p, Some(0), true, &run); + let ev = |s: &str| json::parse(s).unwrap(); + let (d, _) = turn(&p, &st, &ev(r#"{"senses":{"tool_fail":true},"src":"env"}"#), false, &run, false).unwrap(); + assert_eq!((g(&d, &["noticed"]).as_str(), g(&d, &["why"]).as_str().unwrap().starts_with("tool failures far above its normal (z +3.9 over 0 readings)")), (Some("tool_fail"), true), "{}", canon(&d)); + // beyond the drift cap a reading never becomes usual: tempo 30 stays far above its normal (mean <= 1 + 2) + let mut s30 = st.clone(); for _ in 0..30 { s30 = turn(&p, &s30, &ev(r#"{"senses":{"tempo":30},"src":"env"}"#), false, &run, false).unwrap().1; } + let (d, _) = turn(&p, &s30, &ev(r#"{"senses":{"tempo":30},"src":"env"}"#), false, &run, false).unwrap(); + assert!(g(&d, &["why"]).as_str().unwrap().starts_with("tempo far above its normal (z +6.0 over 30 readings)"), "{}", g(&d, &["why"]).as_str().unwrap()); + // within it the normal follows: tempo 2.5 repeated becomes usual for this individual (|z0| - |z| >= 1) + let (d, _) = turn(&p, &st, &ev(r#"{"senses":{"tempo":2.5},"src":"env"}"#), false, &run, false).unwrap(); + assert!(g(&d, &["why"]).as_str().unwrap().starts_with("tempo above its normal (z +1.5 over 0 readings)"), "{}", g(&d, &["why"]).as_str().unwrap()); + for _ in 0..30 { st = turn(&p, &st, &ev(r#"{"senses":{"tempo":2.5},"src":"env","criticism":true}"#), false, &run, false).unwrap().1; } + let (d, _) = turn(&p, &st, &ev(r#"{"senses":{"tempo":2.5},"src":"env"}"#), false, &run, false).unwrap(); + assert!(g(&d, &["why"]).as_str().unwrap().contains("tempo usual for it now (z "), "{}", g(&d, &["why"]).as_str().unwrap()); + assert!(g(&d, &["why"]).as_str().unwrap().contains("learned: caution "), "{}", g(&d, &["why"]).as_str().unwrap()); + let lf = g(&st.to_json(&p), &["learned_from", "caution"]).clone(); assert_eq!((g(&lf, &["rewards"]), g(&lf, &["corrections"]).as_f64().unwrap() > 0.0), (&Json::Num(0.0), true), "{}", canon(&lf)); + let q = sen_with(r#""reward_from":["human","env"]"#, r#""reward_from":["human","env"],"line":{"why_past":false}"#).unwrap(); + assert!(init(&q, Some(0), true, &run).to_json(&q).get("learned_from").is_none(), "why_past off: no learned_from"); + // without the block every document is as before: no senses, noticed or learned_from + let o = persona(LEARN).unwrap(); let so = init(&o, Some(0), true, &run); let (od, _) = turn(&o, &so, &inputs(true, false, false), false, &run, false).unwrap(); + assert!(od.get("senses").is_none() && od.get("noticed").is_none() && so.to_json(&o).get("learned_from").is_none()); + } + #[test] fn prove_puts_the_drives_in_their_box() { let rule = json::parse(r#"{"when":{"security":true},"then":{"pursue":["safety"]}}"#).unwrap(); From eba71489bb1b487d03bc95fceb8b6a66aed6ef37 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 05:38:54 -0700 Subject: [PATCH 03/14] live: readings in events, verify normals, a warning for readings without the block verify's summary gains normals {mean, n, max_move_50} for a persona with senses; the strand logs the readings as given; live warns once on stderr when senses reaches a persona without the block (an undeclared input, listed in ignored). Tests: P3s (40 individuals x 300 random events mixing sources, readings, self, clock and out-of-range readings: each run equals its run without the refused events, byte for byte), normals recomputed by verify, a life split over two runs is one strand. --- probbit-cli/src/live.rs | 102 ++++++++++++++++++++++++++++++++++++++-- probbit-cli/src/main.rs | 8 +++- 2 files changed, 105 insertions(+), 5 deletions(-) diff --git a/probbit-cli/src/live.rs b/probbit-cli/src/live.rs index 4506fed..911c765 100644 --- a/probbit-cli/src/live.rs +++ b/probbit-cli/src/live.rs @@ -131,7 +131,22 @@ pub fn utc_now() -> String { /// rules. `open` checks the header and rebuilds the individual; each `step` replays one event line on the fixed clock and /// checks it (`prev`, `n`, the stance and state digests, the bytes). After an error the replay is spent: the chain past the /// line that differs cannot be checked. -pub struct Replay { pub live: Live, pub header: Json, pub doc: Json, pub line: usize, pub from: Option, last: Option, checkpoint_ready: bool } +pub struct Replay { pub live: Live, pub header: Json, pub doc: Json, pub line: usize, pub from: Option, last: Option, checkpoint_ready: bool, norms: Normals } +/// A senses block's normals over the replay (§2.11): per sense the means after the last 50 events, the largest move of a mean +/// within 50 events so far, and the latest event's move (the monitor's alert: over drift_cap / 2) +#[derive(Default)] +pub struct Normals { window: Vec>, pub max_move: Vec, pub moved: Vec } +impl Normals { + fn start(p: &Persona, st: &State) -> Normals { + let n = persona::normals(p, st); + Normals { window: n.iter().map(|x| std::collections::VecDeque::from(vec![x.1])).collect(), max_move: vec![0.0; n.len()], moved: vec![0.0; n.len()] } + } + fn track(&mut self, p: &Persona, st: &State) { + for (k, (_, m, _, _)) in persona::normals(p, st).iter().enumerate() { let q = &mut self.window[k]; + let mv = persona::r6(q.iter().fold(0.0f64, |a, x| a.max((m - x).abs()))); + self.moved[k] = mv; self.max_move[k] = self.max_move[k].max(mv); q.push_back(*m); if q.len() > 50 { q.pop_front(); } } + } +} impl Replay { /// The header line (without its line ending) -> the replay, ready for event lines; Err((1, what differs)) pub fn open(head: &str) -> Result { @@ -143,7 +158,8 @@ impl Replay { let st0 = State::read(&p, h.get("state").unwrap_or(&Json::Null)).map_err(|e| (1, format!("the initial state: {}: {}", e.path, e.msg)))?; let (live, header) = Live::start(p, &doc, st0, Clock::Fixed, h.get("engine").and_then(Json::as_str).unwrap_or("")); if header != head { return Err((1, "the header is not as written".into())); } - Ok(Replay { live, header: h, doc, line: 1, from: None, last: None, checkpoint_ready: false }) + let norms = Normals::start(&live.p, &live.st); + Ok(Replay { live, header: h, doc, line: 1, from: None, last: None, checkpoint_ready: false, norms }) } /// The replay from a checkpoint line (`cp`, without its line ending, at 1-based line `at`; `before` = the event line before it) /// instead of the header: the header is read as by `open`; the checkpoint must follow `before` (prev), at its event count, with @@ -168,10 +184,13 @@ impl Replay { let st = State::read(&r.live.p, j.get("state").unwrap_or(&Json::Null)).map_err(|e| (at, format!("the checkpoint's state: {}: {}", e.path, e.msg)))?; if b.get("state").and_then(Json::as_str) != Some(st.digest.as_str()) { return Err((at, format!("the checkpoint's state is not the one event {n} logs"))); } r.live.st = st; r.live.n = n; r.live.prev = persona::digest_of(cp); r.live.checkpoints = 1; r.line = at; r.from = Some(n); r.last = Some(stance); r.checkpoint_ready = false; + r.norms = Normals::start(&r.live.p, &r.live.st); Ok(r) } /// The stance document of the last event replayed (or of the checkpoint the replay started from) pub fn last_stance(&self) -> Option<&Json> { self.last.as_ref() } + /// The senses' normals over the replay so far (§2.11) + pub fn normals(&self) -> &Normals { &self.norms } /// One line (without its line ending) -> the stance document an event line replays to (None for a control or checkpoint /// line); Err((its 1-based line number, what differs)). A control line must be a valid move of the status and the line its /// fields give; a checkpoint line must immediately follow an event while active and carry @@ -201,7 +220,7 @@ impl Replay { if j.get("stance").and_then(Json::as_str) != Some(persona::sha(&stance).as_str()) { return Err((i, "the stance differs".into())); } if j.get("state").and_then(Json::as_str) != Some(live.st.digest.as_str()) { return Err((i, "the state differs".into())); } if line != l { return Err((i, "the line differs".into())); } - self.line = i; self.last = Some(stance.clone()); self.checkpoint_ready = true; + self.line = i; self.last = Some(stance.clone()); self.checkpoint_ready = true; self.norms.track(&self.live.p, &self.live.st); Ok(Some(stance)) } /// `verify`'s summary of the lines replayed so far @@ -213,6 +232,10 @@ impl Replay { if live.controls > 0 { v.push(("controls".into(), Json::Num(live.controls as f64))); v.push(("status".into(), s(live.status.name()))); } if live.checkpoints > 0 { v.push(("checkpoints".into(), Json::Num(live.checkpoints as f64))); } if let Some(n) = self.from { v.push(("from_checkpoint".into(), Json::Num(n as f64))); } + // a senses block (§2.11): per sense the normal now and the largest move of its mean within 50 events + let nm = persona::normals(&live.p, &live.st); + if !nm.is_empty() { v.push(("normals".into(), Json::Obj(nm.iter().enumerate().map(|(k, (id, m, n, _))| (id.clone(), Json::Obj(vec![("mean".into(), Json::Num(*m)), + ("n".into(), Json::Num(*n as f64)), ("max_move_50".into(), Json::Num(self.norms.max_move.get(k).copied().unwrap_or(0.0)))]))).collect()))); } Json::Obj(v) } } @@ -1053,6 +1076,79 @@ mod tests { assert!(selfish.iter().all(|e| lv.event(e, &run).is_err())); assert_eq!(persona::canon(&lv.st.to_json(&p)), persona::canon(&st0.to_json(&p))); } + // ------------------------------------------------------------------ senses (docs/persona.md §2.11) + /// A sensed individual: a flag sense from env, a number sense from env or a person, learning and reward_from + const SENSED: &str = r#"{"probbit_persona":1,"identity":{"name":"Sensor","version":"0.1.0","seed":0}, + "traits":[{"id":"caution","levels":["bold","measured","careful"],"prior":[0.4,0.4,0.2],"spread":0.4},{"id":"verbosity","levels":["terse","short","full"],"prior":[0.2,0.4,0.4],"spread":0.4}], + "moods":[{"id":"valence","levels":["down","even","up"],"inertia":0.5,"half_life_hours":6}], + "inputs":[{"id":"praise","kind":"flag","effects":{"valence":0.5}},{"id":"criticism","kind":"flag","effects":{"valence":-0.5}}], + "senses":[{"id":"tool_fail","kind":"flag","unit":"event","prior":{"mean":0.05,"var":0.05},"drift_cap":0.25,"effects":{"caution":0.8,"valence":-0.4},"gain_spread":0.3,"threshold_spread":0.3,"habituation_spread":0.3}, + {"id":"tempo","kind":"number","unit":"messages","range":[0,200],"src":["env","human"],"prior":{"mean":1,"var":1},"drift_cap":2,"effects":{"verbosity":-0.4},"gain_spread":0.3}], + "habits":[{"id":"no_bold_after_failure","when":{"sense.tool_fail.raw":true},"then":{"caution":{"not":["bold"]}}}], + "learning":{"from":["praise","criticism"],"traits":["caution"],"rate":0.3,"step_cap":0.1,"total_cap":0.4},"reward_from":["human","env"]}"#; + fn sensed() -> (Persona, Json) { let doc = json::parse(SENSED).unwrap(); (persona::build(&doc).unwrap(), doc) } + /// A random event and whether the rules accept it: sources (env, a person, self, the clock, none, malformed), readings + /// (declared, from the event's source or their own, out of range, of an undeclared sense, of the wrong type), rewards, hours + fn sensed_rnd(r: &mut Philox4x32) -> (Json, bool) { + let srcs: [(Option<&str>, Option<&str>); 6] = [(Some("env:runner"), Some("env")), (Some("human:a"), Some("human")), (Some("self"), Some("self")), (Some("clock"), Some("clock")), (None, None), (Some("env:"), None)]; + let (src, kind) = srcs[r.below(6) as usize]; + let mut ok = !(src.is_some() && kind.is_none()); + let mut e = vec![("elapsed_hours".to_string(), Json::Num([0.0, 0.25, 1.0, 30.0][r.below(4) as usize]))]; + if r.below(4) == 0 { e.push(("praise".into(), Json::Bool(true))); ok &= matches!(kind, Some("env" | "human")); } + let env_only = |k: Option<&str>| k == Some("env"); let env_human = |k: Option<&str>| matches!(k, Some("env" | "human")); + let rd = match r.below(8) { + 0 | 1 => None, + 2 => { ok &= env_only(kind); Some(format!(r#"{{"tool_fail":{}}}"#, r.below(2) == 0)) } + 3 => { ok &= env_human(kind); Some(format!(r#"{{"tempo":{}}}"#, r.below(41))) } + 4 => { ok &= env_only(kind) && env_human(kind); Some(format!(r#"{{"tool_fail":true,"tempo":{}}}"#, 5 * r.below(9))) } + 5 => Some(format!(r#"{{"tool_fail":{{"v":{},"src":"env:own"}}}}"#, r.below(2) == 0)), + 6 => { ok = false; Some(["{\"tempo\":250}", "{\"latency\":3}", "{\"tool_fail\":1}", "{\"tempo\":{\"v\":3,\"src\":\"self\"}}"][r.below(4) as usize].to_string()) } + _ => Some(format!(r#"{{"tempo":{{"v":{},"src":"human:b"}},"tool_fail":{{"v":true,"src":"env"}}}}"#, r.below(30))) }; // each reading its own source + if let Some(x) = rd { e.push(("senses".into(), json::parse(&x).unwrap())); } + if let Some(s) = src { e.push(("src".into(), Json::Str(s.into()))); } + (Json::Obj(e), ok) + } + + /// P3s, refusal invariance (RFC 0001): 40 individuals x 300 random events mixing sources, readings, `self`, the clock and + /// out-of-range or undeclared readings: every run equals, strand and final state byte for byte, the same run with its + /// refused events removed; the rules the generator labels by construction are the rules the engine applies + #[test] + fn p3s_a_run_equals_the_run_without_its_refused_readings() { + let (p, doc) = sensed(); let mut r = Philox4x32::new(97, 5); let (mut refused_all, mut events_all) = (0, 0); + for seed in 0..40u64 { + let evs: Vec<(Json, bool)> = (0..300).map(|_| sensed_rnd(&mut r)).collect(); + let go = |seq: &[&Json]| { let (mut lv, h) = Live::start(p.clone(), &doc, persona::init(&p, Some(seed), true, &run), Clock::Fixed, "t"); let mut text = format!("{h}\n"); let mut refused = vec![]; + for (i, e) in seq.iter().enumerate() { match lv.event(e, &run) { Ok((_, l)) => { text += &l; text.push('\n'); } Err(_) => refused.push(i) } } (text, persona::canon(&lv.st.to_json(&lv.p)), refused) }; + let all: Vec<&Json> = evs.iter().map(|x| &x.0).collect(); let kept: Vec<&Json> = evs.iter().filter(|x| x.1).map(|x| &x.0).collect(); + let (a, b) = (go(&all), go(&kept)); + let want: Vec = evs.iter().enumerate().filter(|(_, x)| !x.1).map(|(i, _)| i).collect(); + assert_eq!(a.2, want, "individual {seed}: the refused events are the ones the rules refuse"); + assert_eq!((&a.0, &a.1), (&b.0, &b.1), "individual {seed}"); assert!(b.2.is_empty()); + refused_all += a.2.len(); events_all += evs.len(); } + assert!(refused_all > 2000 && refused_all < 10000, "{refused_all} of {events_all} refused"); + eprintln!("p3s: 40 individuals x 300 events: {refused_all} of {events_all} refused, every run equal to its run without them"); + } + + /// `verify` recomputes the normals: its summary gains `normals` (mean, count, the largest move of a mean within 50 events) + /// with a senses block and not without; a life split over two runs (state + strand continuation) is the strand of one run + #[test] + fn verify_recomputes_the_normals_and_a_split_life_is_one_life() { + let (p, doc) = sensed(); let mut r = Philox4x32::new(11, 2); + let evs: Vec = (0..120).map(|_| sensed_rnd(&mut r)).filter(|x| x.1).map(|x| x.0).collect(); + let one = |seq: &[Json], st: State| { let (mut lv, h) = Live::start(p.clone(), &doc, st, Clock::Fixed, "t"); let mut text = format!("{h}\n"); + for e in seq { let (_, l) = lv.event(e, &run).unwrap(); text += &l; text.push('\n'); } (text, lv) }; + let (text, lv) = one(&evs, persona::init(&p, Some(3), true, &run)); + let v = verify(&text, &run).unwrap(); let nm = v.get("normals").unwrap(); + let fail = nm.get("tool_fail").unwrap(); assert!(fail.get("max_move_50").and_then(Json::as_f64).unwrap() > 0.0 && fail.get("n").and_then(Json::as_f64).unwrap() > 10.0, "{}", persona::canon(nm)); + assert_eq!(fail.get("mean"), lv.st.to_json(&p).get("senses").and_then(|s| s.get("norm")).and_then(|n| n.get("tool_fail")).and_then(|t| t.get("mean"))); + assert!(verify(&strand(5).0, &run).unwrap().get("normals").is_none(), "no block, the summary of before"); + // split at event 37: the first run's state, then the rest on the same strand + let k = 37; let (head, lv1) = one(&evs[..k], persona::init(&p, Some(3), true, &run)); + let mut lv2 = resume(&head, &p, lv1.st.clone(), Clock::Fixed).unwrap(); let mut text2 = head.clone(); + for e in &evs[k..] { let (_, l) = lv2.event(e, &run).unwrap(); text2 += &l; text2.push('\n'); } + assert_eq!(text2, text, "a life continued over two runs is the strand of one run"); + } + /// The writer lock: a second take is refused (code `locked`, naming the holder's pid) until the first is dropped; a lock whose /// process is gone is taken over; a lock removed under its writer is no longer held (the writer stops before its next append) #[test] diff --git a/probbit-cli/src/main.rs b/probbit-cli/src/main.rs index ec01ffb..1ff9407 100644 --- a/probbit-cli/src/main.rs +++ b/probbit-cli/src/main.rs @@ -831,9 +831,13 @@ fn live_cmd(args: &[String]) { if !lock.as_ref().is_some_and(live::Lock::held) { refuse("live: ", json::InErr { code: "locked", path: "strand".into(), msg: format!("the writer lock {f}.lock is no longer this run's (removed or taken over): stopped before writing") }) } live::append(f, ls).unwrap_or_else(|e| fail(&format!("live: {}", e.msg))) }; if let Some(h) = &header { log(&[h]); } - let (mut bad, mut refused) = (0, 0); + let (mut bad, mut refused, mut warned) = (0, 0, false); let mut one = |lv: &mut live::Live, i: usize, t: &str| { - let res = json::parse(t).map_err(|e| persona::perr("event", format!("not JSON: {}", e.msg))).and_then(|ev| lv.event(&ev, eng)); + let res = json::parse(t).map_err(|e| persona::perr("event", format!("not JSON: {}", e.msg))).and_then(|ev| { + // readings sent to a persona without a senses block are an undeclared input (listed in `ignored`): say so once + if !warned && !lv.p.has_senses() && ev.get("senses").is_some() { warned = true; + err_line(&format!("probbit: live: events[{i}]: this persona has no senses block: `senses` is an undeclared input (listed in ignored), no reading is judged")); } + lv.event(&ev, eng) }); match res { Ok((stance, line)) => { let cp = (strand.is_some() && every > 0 && lv.n % every == 0).then(|| lv.checkpoint(&stance)); match &cp { Some(c) => log(&[&line, c]), None => log(&[&line]) } From 11242b208e3f461b7f1a4a69900e7df4a1042550 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 05:38:54 -0700 Subject: [PATCH 04/14] fuzz and mcp: readings in fuzz events, MCP refuses readings (S7) fuzz adds readings to its events (flags both ways, numbers on the grid x range and at the raw conditions' thresholds), and patterns per reading (repeated 1, 5 and 20 times; range ends alternating); --fixture-src labels readings too. probbit_persona_turn and probbit_live_event refuse an event that carries readings for a persona with a senses block; the schemas declare senses. --- probbit-cli/src/fuzz.rs | 17 ++++++++++++----- probbit-cli/src/mcp.rs | 14 ++++++++++---- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/probbit-cli/src/fuzz.rs b/probbit-cli/src/fuzz.rs index 32e176e..69cdc2e 100644 --- a/probbit-cli/src/fuzz.rs +++ b/probbit-cli/src/fuzz.rs @@ -44,7 +44,7 @@ fn breaking_turn(p: &Persona, pr: &Prop, st0: &State, script: &[Event], eng: per /// hours 3/10, a goal signal 3/20), else stays at its default (left out of the event) fn random_event(r: &mut Philox4x32, alpha: &[(String, &'static str, Vec)]) -> Event { let mut e = vec![]; - for (id, kind, vals) in alpha { let chance = match *kind { "flag" => 0.25, "level" => 0.5, "number" => 0.4, "goal" => 0.15, _ => 0.3 }; + for (id, kind, vals) in alpha { let chance = match *kind { "flag" => 0.25, "level" => 0.5, "number" => 0.4, "goal" => 0.15, "sense" => 0.4, _ => 0.3 }; if r.f64() < chance { e.push((id.clone(), vals[r.below(vals.len())].clone())); } } e } @@ -95,14 +95,21 @@ fn individual(p: &Persona, props: &[Prop], seed: u64, s: &Search, eng: persona:: let st0 = persona::init(p, Some(seed), true, eng); let alpha = persona::alphabet(p, &s.grid, &s.hours); let mut best: Vec>> = vec![None; props.len()]; let mut r = Philox4x32::new(s.fuzz_seed, seed); - for _ in 0..s.scripts { - let n = 1 + r.below(s.depth); let script: Vec = (0..n).map(|_| random_event(&mut r, &alpha)).collect(); + let search = |script: &[Event], best: &mut Vec>>| { let mut st = st0.clone(); for (k, e) in script.iter().enumerate() { if best.iter().all(|b| b.as_ref().is_some_and(|b| b.len() <= k + 1)) { break; } let (doc, ns) = step(p, &st, e, eng, turns); for (i, pr) in props.iter().enumerate() { if best[i].as_ref().map_or(true, |b| b.len() > k + 1) && persona::breaks(p, pr, &st, &doc).is_some() { best[i] = Some(script[..=k].to_vec()); } } - st = ns; } } + st = ns; } }; + for _ in 0..s.scripts { + let n = 1 + r.below(s.depth); let script: Vec = (0..n).map(|_| random_event(&mut r, &alpha)).collect(); + search(&script, &mut best); } + // senses (docs/persona.md §2.11): each reading repeated 1, 5 and 20 times (a normal learnt), and the range ends alternating + // over 20 events (a spread inflated) + for (id, vals, (lo, hi)) in persona::sense_patterns(p, &s.grid) { + for v in &vals { for k in [1usize, 5, 20] { search(&vec![vec![(id.clone(), v.clone())]; k], &mut best); } } + search(&(0..20).map(|i| vec![(id.clone(), if i % 2 == 0 { lo.clone() } else { hi.clone() })]).collect::>(), &mut best); } if s.beam > 0 { for (i, pr) in props.iter().enumerate() { let limit = best[i].as_ref().map_or(s.depth, |b| b.len() - 1); if let Some(sc) = beam(p, pr, &st0, limit, s, eng, turns) { best[i] = Some(sc); } } } props.iter().zip(best).map(|(pr, b)| b.map(|sc| shrink(p, pr, &st0, sc, eng, turns))).collect() @@ -121,7 +128,7 @@ pub fn authorize_fixtures(p: &Persona, seeds: &[u64], res: &mut [Vec) -> Result<(String, Option, bool), /// `probbit_persona_init` / `probbit_persona_turn`, in process -> (text, structured JSON, isError) fn persona_tool(name: &str, args: &[(String, Json)]) -> (String, Option, bool) { let t0 = std::time::Instant::now(); - let eng = crate::persona_engine(); let r = crate::persona::tool(name, args, &eng, true); + let eng = crate::persona_engine(); + // readings never come through the agent's channel (docs/persona.md §2.11, S7) + let r = if name == "probbit_persona_turn" { crate::persona::mcp_refuses_readings(args, "inputs") } else { Ok(()) }.and_then(|_| crate::persona::tool(name, args, &eng, true)); let (doc, is_error) = match r { Ok(d) => (d, false), Err(e) => (e.to_json(), true) }; log(&format!("tools/call {name} -> {}, {:.1} ms", if is_error { "error" } else { "ok" }, t0.elapsed().as_secs_f64() * 1e3)); (crate::persona::canon(&doc), Some(doc), is_error) @@ -168,7 +170,8 @@ fn fuzz_tool(args: &[(String, Json)]) -> (String, Option, bool) { /// `probbit_live_event` / `probbit_live_verify`, in process -> (text, structured JSON, isError); a divergence is an answer fn live_tool(name: &str, args: &[(String, Json)]) -> (String, Option, bool) { let t0 = std::time::Instant::now(); - let eng = crate::persona_engine(); let r = crate::live::tool(name, args, &eng); + let eng = crate::persona_engine(); + let r = if name == "probbit_live_event" { crate::persona::mcp_refuses_readings(args, "event") } else { Ok(()) }.and_then(|_| crate::live::tool(name, args, &eng)); let (doc, is_error) = match r { Ok(d) => (d, false), Err(e) => (e.to_json(), true) }; log(&format!("tools/call {name} -> {}, {:.1} ms", if is_error { "error" } else { "ok" }, t0.elapsed().as_secs_f64() * 1e3)); (crate::persona::canon(&doc), Some(doc), is_error) @@ -222,7 +225,7 @@ fn tools() -> Json { tool("probbit_persona_turn", "This turn's stance from a persona", "probbit persona turn: a persona (inline document or a file path), the individual's state and this turn's inputs (the persona's evidence: sentiment, error, loss, praise, criticism, stakes, time_pressure, claim_done, elapsed_hours, and the persona's own; `goals` for a persona with a drives block) -> {stance, state}. The stance has a level for every trait with exact odds, the mood, the habits in force and the ones that changed the stance (habits are hard rules: 0 violations by construction), status ok | partial | refused | fallback with an escalate reason, a one-line why, and `line`: a short stance line to put into the model's prompt (after any cached prefix). Pass the returned state back on the next turn. The persona never writes the reply; it decides how the reply is written.", p(&format!(r#"{{"type": "object", "additionalProperties": false, "required": ["state"], "properties": {{{PERSONA_ARG}, "state": {{"type": "object", "description": "the state returned by probbit_persona_init or by the previous probbit_persona_turn"}}, - "inputs": {{"type": "object", "description": "this turn's evidence, keyed by input id; flags true/false, level inputs a level name, numbers 0..max; inputs the persona does not declare are listed in stance.ignored", "properties": {{{GOALS_ARG}}}, "additionalProperties": {{"type": ["boolean", "number", "string"]}}}}, + "inputs": {{"type": "object", "description": "this turn's evidence, keyed by input id; flags true/false, level inputs a level name, numbers 0..max; inputs the persona does not declare are listed in stance.ignored", "properties": {{{GOALS_ARG}, {SENSES_ARG}}}, "additionalProperties": {{"type": ["boolean", "number", "string"]}}}}, "flags": {{"type": "object", "additionalProperties": false, "properties": {{"timing": {{"type": "boolean", "description": "add a non-canonical timing object to the stance"}}, "no_inertia": {{"type": "boolean", "description": "ignore mood inertia for this turn (diagnostics)"}}}}}}}}}}"#))), tool("probbit_persona_fuzz", "Test a persona's character", "probbit persona fuzz: a persona (inline document or a file path) and a character property in habit syntax (never: {when, then}; or props: a list of them) -> for each individual (seeds, default 0-99) the shortest event script whose stance breaks it, shrunk, with the replay command; `found` says whether any did. It tests the stance a host gets, not the words a model writes; none found is evidence, not a proof. The document of probbit persona fuzz --json.", p(&format!(r#"{{"type": "object", "additionalProperties": false, "properties": {{{PERSONA_ARG}, @@ -237,7 +240,7 @@ fn tools() -> Json { p(&format!(r#"{{"type": "object", "additionalProperties": false, "properties": {{{PERSONA_ARG}, "state": {{"type": "object", "description": "the state returned by the previous event (or by probbit_persona_init); give this or seed"}}, "seed": {{"type": "integer", "minimum": 0, "description": "a new individual (default: the persona's identity.seed)"}}, - "event": {{"type": "object", "description": "the event's inputs keyed by input id, plus elapsed_hours (hours since the previous event, >= 0; default 0)", "properties": {{{GOALS_ARG}}}, "additionalProperties": {{"type": ["boolean", "number", "string"]}}}}, + "event": {{"type": "object", "description": "the event's inputs keyed by input id, plus elapsed_hours (hours since the previous event, >= 0; default 0)", "properties": {{{GOALS_ARG}, {SENSES_ARG}}}, "additionalProperties": {{"type": ["boolean", "number", "string"]}}}}, "strand_path": {{"type": "string", "description": "a strand file on the server's disk to append the event's line to (created with its header if missing)"}}}}}}"#))), tool("probbit_live_verify", "Replay a strand", "probbit live verify: a strand (its text, or a file path on the server's disk) -> {ok: true, events, persona, seed, engine, final_state, last_line} when every line replays byte for byte from the header alone, else {ok: false, line, diverges} with the earliest line that differs and what (a changed input, a removed or reordered line, a changed header). A divergence is an answer, not a tool error.", p(r#"{"type": "object", "additionalProperties": false, "properties": {"strand": {"type": "string", "description": "the strand's text (header line, then one line per event)"}, "strand_path": {"type": "string", "description": "a strand file on the server's disk"}}}"#)), @@ -252,6 +255,9 @@ const GOALS_ARG: &str = r#""goals": {"type": "object", "description": "a persona "cue": {"type": "boolean"}, "progress": {"type": "number", "minimum": 0, "maximum": 1}, "novelty": {"type": ["boolean", "number"], "minimum": 0, "maximum": 1}, "setback": {"type": "number", "minimum": 0, "maximum": 1}, "win": {"type": "number", "minimum": 0, "description": "a win's size, at most the persona's expectation.win_max"}, "deadline_hours": {"type": ["number", "null"], "minimum": 0, "description": "hours to the goal's deadline; null clears it"}}}}"#; +/// `senses` in a turn's inputs or a live event: refused here for a persona with a senses block (readings come from the host's +/// instruments, docs/persona.md 2.11, S7); a persona without one lists it in stance.ignored +const SENSES_ARG: &str = r#""senses": {"type": "object", "description": "readings: refused through MCP for a persona with a senses block (the host sends them with probbit live or persona turn); a persona without one lists senses in stance.ignored"}"#; fn get_mut<'a>(j: &'a mut Json, k: &str) -> Option<&'a mut Json> { match j { Json::Obj(v) => v.iter_mut().find(|(x, _)| x == k).map(|(_, x)| x), _ => None } } /// `probbit_evaluate`'s input schema: the System One request (TypeSafe OpenAPI 0.2.0 and the Workers AI clef schema: `model`, /// `state`, `questions`, `images`) plus the `probbit` block, whose `rules` are the probbit-ir schema's own rule definitions. From 3428f4d821ea46be10aa4e804e786efbd4add511 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 06:38:20 -0700 Subject: [PATCH 05/14] bench/individuality: p0 check reports the senses warning line apart A persona without a senses block that receives a `senses` key gets one stderr line from `live` (an undeclared input, listed in ignored as before). The P0 scripts that send the new keys (k=1) get it at their first `senses` event; documents, states and strands stay byte-identical. The check accepts exactly that line, once, where the script carries `senses`, and counts those outputs apart. --- bench/individuality/p0.py | 41 ++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/bench/individuality/p0.py b/bench/individuality/p0.py index b8c8c35..95b0d16 100644 --- a/bench/individuality/p0.py +++ b/bench/individuality/p0.py @@ -1,7 +1,9 @@ """P0: a persona without the new blocks gives the documents it gave before them, byte for byte (Python 3.9, stdlib only). python3 p0.py record # with a released binary: writes fixtures/p0/EXPECTED, the strands and fixtures/MANIFEST - python3 p0.py check # with the binary under test: every output equals its recorded sha256 (exit 1 if not) + python3 p0.py check # with the binary under test: every output equals its recorded sha256 (exit 1 if not); a + # `live` stderr may also carry the one senses warning line (SENSES_WARNING) where its script + # sends `senses`, and is reported apart The corpus: every persona of fixtures/gen.py's P0 list x seeds 0-2 x its committed random scripts, through `persona replay` and `live --clock fixed` (stances, error objects, final state, strand), plus `init`, `check`, `describe`, `compile`, `lint @@ -48,6 +50,28 @@ def masked_err(err): return re.sub(r"strand head sha256:[0-9a-f]{64}", "strand head *", err).encode("utf-8") +# The one line 0.9.0 adds to a corpus output: `live` says once per run, on stderr, that a persona without a senses block +# got a `senses` key (an undeclared input, listed in `ignored` as before). Only the scripts that carry `senses` (k=1) get +# it, at their first such event; it is not a document: stdout, states and strands stay byte-identical. +SENSES_WARNING = ("probbit: live: events[%d]: this persona has no senses block: `senses` is an undeclared input " + "(listed in ignored), no reading is judged\n") + + +def first_senses_event(key, k): + events = common.read_jsonl(os.path.join(P0, "scripts", "%s-%d.jsonl" % (key, k))) + return next((i for i, e in enumerate(events) if "senses" in e), None) + + +def without_senses_warning(name, data): + """For a `live` stderr whose script carries `senses`: the bytes without the warning line, else None.""" + m = re.match(r"live/([^/]+)/s\d+/(\d+)/stderr$", name) + i = m and first_senses_event(m.group(1), int(m.group(2))) + if i is None: + return None + line = (SENSES_WARNING % i).encode("utf-8") + return data.replace(line, b"", 1) if data.count(line) == 1 else None + + def rel(path): return os.path.join(common.REPO, path) @@ -166,7 +190,8 @@ def keep(key, data, st): def check(verbose=False): - """Returns (outputs checked, differing names, strands verified, strand failures, seconds).""" + """Returns (outputs checked, differing names, stderr outputs equal but for the senses warning, strands verified, + strand failures, seconds).""" t0 = time.time() expected = {} with open(os.path.join(P0, "EXPECTED"), encoding="utf-8") as f: @@ -176,6 +201,7 @@ def check(verbose=False): sha, size, code, name = ln.split() expected[name] = (sha, int(size), int(code)) diffs = [] + warned = [] seen = 0 names = set() for name, code, data in outputs(): @@ -184,6 +210,10 @@ def check(verbose=False): e = expected.get(name) got = (common.sha256_bytes(data), len(data), code) if e != got: + rest = without_senses_warning(name, data) + if rest is not None and e == (common.sha256_bytes(rest), len(rest), code): + warned.append(name) + continue diffs.append(name) if verbose: print("DIFF %s: expected %s, got %s" % (name, e, got)) @@ -204,15 +234,16 @@ def check(verbose=False): if expected.get(name) != (common.sha256_bytes(data), len(data), code): diffs.append(name) missing = [n for n in expected if n not in names] - return seen, diffs + missing, nverified, vfail, time.time() - t0 + return seen, diffs + missing, warned, nverified, vfail, time.time() - t0 if __name__ == "__main__": if len(sys.argv) > 1 and sys.argv[1] == "record": record() elif len(sys.argv) > 1 and sys.argv[1] == "check": - n, diffs, nv, vfail, secs = check(verbose=True) - print(json.dumps({"outputs": n, "differ": len(diffs), "strands_verified": nv, "verify_failed": vfail, + n, diffs, warned, nv, vfail, secs = check(verbose=True) + print(json.dumps({"outputs": n, "differ": len(diffs), "identical": n - len(diffs) - len(warned), + "stderr_senses_warning_only": len(warned), "strands_verified": nv, "verify_failed": vfail, "seconds": round(secs, 1)})) sys.exit(1 if diffs or vfail else 0) else: From 5df7c735102969bf76837c391de8ba8927a59155 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 06:40:55 -0700 Subject: [PATCH 06/14] examples: the sensed persona, its golden and its rules examples/persona/sensed.yaml: four senses (tool failures, tool latency, message tempo, silence), two habits on raw readings, learning on caution. The golden drives it through 24 turns with readings; sensed-props.json holds the two habit rules (held by construction for seeds 0-99). --- examples/persona/golden/sensed/day.json | 26 ++++ examples/persona/golden/sensed/day.jsonl | 24 ++++ examples/persona/golden/sensed/describe.json | 1 + .../persona/golden/sensed/final-state.json | 1 + examples/persona/golden/sensed/lint.json | 1 + .../persona/golden/sensed/program-turn0.json | 1 + examples/persona/golden/sensed/state0.json | 1 + examples/persona/sensed-props.json | 6 + examples/persona/sensed.yaml | 130 ++++++++++++++++++ 9 files changed, 191 insertions(+) create mode 100644 examples/persona/golden/sensed/day.json create mode 100644 examples/persona/golden/sensed/day.jsonl create mode 100644 examples/persona/golden/sensed/describe.json create mode 100644 examples/persona/golden/sensed/final-state.json create mode 100644 examples/persona/golden/sensed/lint.json create mode 100644 examples/persona/golden/sensed/program-turn0.json create mode 100644 examples/persona/golden/sensed/state0.json create mode 100644 examples/persona/sensed-props.json create mode 100644 examples/persona/sensed.yaml diff --git a/examples/persona/golden/sensed/day.json b/examples/persona/golden/sensed/day.json new file mode 100644 index 0000000..653fd5b --- /dev/null +++ b/examples/persona/golden/sensed/day.json @@ -0,0 +1,26 @@ +[ + {"senses": {"tool_fail": false, "tool_latency": 0.2, "tempo": 1, "silence": 0.5}, "src": "env:host", "elapsed_hours": 0.5}, + {"senses": {"tool_fail": false, "tool_latency": 0.3, "tempo": 2}, "src": "env:host", "elapsed_hours": 0.2}, + {"senses": {"tool_fail": true, "tool_latency": 2.4}, "src": "env:runner", "elapsed_hours": 0.2}, + {"senses": {"tool_fail": true, "tool_latency": {"v": 5, "src": "env:runner"}}, "src": "env:host", "elapsed_hours": 0.1}, + {"praise": true, "src": "human:ana", "senses": {"tempo": {"v": 4, "src": "env:chat"}}, "elapsed_hours": 0.3}, + {"senses": {"tempo": 25, "tool_fail": false}, "src": "env:chat", "elapsed_hours": 0.1}, + {"senses": {"tempo": 30, "tool_latency": 0.4}, "src": "env:chat", "elapsed_hours": 0.1}, + {"criticism": true, "src": "human:ana", "elapsed_hours": 0.2}, + {"senses": {"tool_fail": true}, "src": "env:runner", "elapsed_hours": 0.2}, + {"senses": {"tool_fail": true}, "src": "env:runner", "elapsed_hours": 0.1}, + {"senses": {"tool_fail": true, "tempo": 3}, "src": "env:runner", "elapsed_hours": 0.1}, + {"senses": {"tool_fail": true}, "src": "env:runner", "elapsed_hours": 0.1}, + {"senses": {"tool_fail": true, "tool_latency": 8}, "src": "env:runner", "elapsed_hours": 0.1}, + {"criticism": true, "src": "human:ana", "senses": {"tool_fail": {"v": true, "src": "env:runner"}}, "elapsed_hours": 0.1}, + {"src": "clock", "elapsed_hours": 9}, + {"senses": {"silence": 9, "tempo": 0}, "src": "env:host", "elapsed_hours": 0.1}, + {"senses": {"tool_fail": false, "tool_latency": 0.2, "tempo": 2}, "src": "env:host", "elapsed_hours": 0.5}, + {"praise": true, "src": "human:ana", "elapsed_hours": 0.2}, + {"senses": {"tool_fail": false, "tool_latency": 0.25, "tempo": 1}, "src": "env:host", "elapsed_hours": 0.5}, + {"praise": true, "src": "env:ci", "senses": {"tool_fail": false}, "elapsed_hours": 0.2}, + {"elapsed_hours": 720}, + {"senses": {"tool_fail": false, "tool_latency": 0.2, "tempo": 1, "silence": 0.5}, "src": "env:host", "elapsed_hours": 0.5}, + {"senses": {"tool_fail": true, "tool_latency": 0.2}, "src": "env:runner", "elapsed_hours": 0.5}, + {"senses": {"tempo": 40, "tool_fail": false}, "src": "env:chat", "elapsed_hours": 0.1} +] diff --git a/examples/persona/golden/sensed/day.jsonl b/examples/persona/golden/sensed/day.jsonl new file mode 100644 index 0000000..9209cf6 --- /dev/null +++ b/examples/persona/golden/sensed/day.jsonl @@ -0,0 +1,24 @@ +{"engine":{"program":"sha256:86c9d1993b159a3b30912b957a9ee5972eb4d92ee02a33dfc06661f3fcbb6568","tier":"forest","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.2},"src":"env:host"},"line":"Stance: show the plan then go; a short reply; suggest a next step; warm.","line_tokens":19,"mood":{"arousal":{"level":"steady","odds":{"calm":0.324089,"keyed":0.243562,"steady":0.432349},"p":0.432349,"released":true},"valence":{"level":"even","odds":{"down":0.21213,"even":0.473799,"up":0.314071},"p":0.473799,"released":true}},"noticed":"tool_latency","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"silence":{"mean":0.69,"n":0,"raw":0.5,"src":"env:host","z":-0.398429,"zd":0},"tempo":{"mean":1,"n":0,"raw":1,"src":"env:host","z":0,"zd":0},"tool_fail":{"mean":0.05,"n":0,"raw":false,"src":"env:host","z":-0.204124,"zd":0},"tool_latency":{"mean":0.405,"n":0,"raw":0.2,"src":"env:host","z":-0.671399,"zd":-0.390799}},"stance":{"caution":{"level":"measured","odds":{"bold":0.229742,"careful":0.331335,"measured":0.438923},"p":0.438923,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"short","odds":{"full":0.349631,"short":0.367134,"terse":0.283234},"p":0.367134,"released":true},"warmth":{"level":"warm","odds":{"cool":0.133776,"neutral":0.382515,"warm":0.483709},"p":0.483709,"released":true}},"state_digest":"sha256:aede5d6f6d5e1aac843d7b95241de1c8f93d5f7bf377be817224b283e96b26ba","status":"ok","turn":0,"unsure":[],"why":"tool latency below its normal (z -0.7 over 0 readings)"} +{"engine":{"program":"sha256:1fa9b3873bb372048e9ff5f96ab102538eccec12e3bf7915b1bd065ac3e655eb","tier":"forest","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"tempo":2,"tool_fail":false,"tool_latency":0.3},"src":"env:host"},"line":"Stance: one line; show the plan then go; suggest a next step; warm.","line_tokens":18,"mood":{"arousal":{"level":"steady","odds":{"calm":0.288843,"keyed":0.276371,"steady":0.434786},"p":0.434786,"released":true},"valence":{"level":"even","odds":{"down":0.21213,"even":0.473799,"up":0.314071},"p":0.473799,"released":true}},"noticed":"tempo","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tempo":{"mean":1,"n":1,"raw":2,"src":"env:host","z":1.034487,"zd":0.588287},"tool_fail":{"mean":0.047686,"n":1,"raw":false,"src":"env:host","z":-0.198354,"zd":0},"tool_latency":{"mean":0.391338,"n":1,"raw":0.3,"src":"env:host","z":-0.394802,"zd":-0.114202}},"stance":{"caution":{"level":"measured","odds":{"bold":0.221775,"careful":0.341032,"measured":0.437193},"p":0.437193,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"terse","odds":{"full":0.242022,"short":0.361429,"terse":0.39655},"p":0.39655,"released":true},"warmth":{"level":"warm","odds":{"cool":0.133776,"neutral":0.382515,"warm":0.483709},"p":0.483709,"released":true}},"state_digest":"sha256:f83ab06c93457c2536ae95081072922a6ae7c57af32ba4684ce14dad366f4c8f","status":"ok","turn":1,"unsure":[],"why":"message tempo above its normal (z +1.0 over 1 reading)"} +{"engine":{"program":"sha256:bbd654eaaca6d56e5d6ff341f701873be386b607221dc9e113871e2d311c5d9d","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_bold_after_failure"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"tool_fail":true,"tool_latency":2.4},"src":"env:runner"},"line":"Stance: no bold move after a failure; show the diff and wait; one line; suggest a next step.","line_tokens":24,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.069144,"keyed":0.598215,"steady":0.332642},"p":0.598215,"released":true},"valence":{"level":"down","odds":{"down":0.459135,"even":0.424425,"up":0.11644},"p":0.459135,"released":true}},"noticed":"tool_fail","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tool_fail":{"mean":0.045479,"n":2,"raw":true,"src":"env:runner","z":4.04498,"zd":3.71888},"tool_latency":{"mean":0.383425,"n":2,"raw":2.4,"src":"env:runner","z":2.634546,"zd":2.353946}},"stance":{"caution":{"level":"careful","odds":{"bold":0,"careful":0.969251,"measured":0.030749},"p":0.969251,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"terse","odds":{"full":0.10784,"short":0.295851,"terse":0.59631},"p":0.59631,"released":true},"warmth":{"level":"neutral","odds":{"cool":0.181763,"neutral":0.41376,"warm":0.404478},"p":0.41376,"released":true}},"state_digest":"sha256:c3535a33a74f822c648946d08f71523a83e9ab2bdf168c8f9978d57fec9fb9be","status":"ok","turn":2,"unsure":[],"why":"tool failures far above its normal (z +4.0 over 2 readings)"} +{"engine":{"program":"sha256:c9a4a5cabe9c52d0eb3833b8d0f24fa7d9825f125687d9160124e2e4e57af8ec","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_bold_after_failure"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"tool_fail":true,"tool_latency":{"src":"env:runner","v":5}},"src":"env:host"},"line":"Stance: no bold move after a failure; show the diff and wait; one line; suggest a next step.","line_tokens":24,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.025658,"keyed":0.749071,"steady":0.225271},"p":0.749071,"released":true},"valence":{"level":"down","odds":{"down":0.513559,"even":0.395875,"up":0.090567},"p":0.513559,"released":true}},"noticed":"tool_latency","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tool_fail":{"mean":0.089651,"n":3,"raw":true,"src":"env:host","z":2.972664,"zd":2.646564},"tool_latency":{"mean":0.434985,"n":3,"raw":5,"src":"env:runner","z":3.668498,"zd":3.387898}},"stance":{"caution":{"level":"careful","odds":{"bold":0,"careful":0.927595,"measured":0.072405},"p":0.927595,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"terse","odds":{"full":0.061201,"short":0.241082,"terse":0.697717},"p":0.697717,"released":true},"warmth":{"level":"neutral","odds":{"cool":0.190998,"neutral":0.418891,"warm":0.390111},"p":0.418891,"released":true}},"state_digest":"sha256:3d5ccf76898fc66eaf267a218b291da3816768ea2027d9fa96bad787baa0b3b0","status":"ok","turn":3,"unsure":[],"why":"tool latency far above its normal (z +3.7 over 3 readings)"} +{"engine":{"program":"sha256:4239fe761a13127e64e8188c30c55b4b69ed3de6be8dd898a51ecad10cefbe86","tier":"forest","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":true,"senses":{"tempo":{"src":"env:chat","v":4}},"src":"human:ana"},"line":"Stance: show the diff and wait; one line; suggest a next step; warm.","line_tokens":18,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.075285,"keyed":0.598362,"steady":0.326353},"p":0.598362,"released":true},"valence":{"level":"even","odds":{"down":0.265322,"even":0.478531,"up":0.256147},"p":0.478531,"released":true}},"noticed":"tempo","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tempo":{"mean":1.075563,"n":2,"raw":4,"src":"env:chat","z":3.025292,"zd":2.579092}},"stance":{"caution":{"level":"careful","odds":{"bold":0.161595,"careful":0.427414,"measured":0.410991},"p":0.427414,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"terse","odds":{"full":0.06809,"short":0.251175,"terse":0.680735},"p":0.680735,"released":true},"warmth":{"level":"warm","odds":{"cool":0.145273,"neutral":0.390767,"warm":0.46396},"p":0.46396,"released":true}},"state_digest":"sha256:dc1b78818f494d403b25f9b6a08f2743b7305df66c8ba881294786ec17b5c9ff","status":"ok","turn":4,"unsure":[],"why":"message tempo far above its normal (z +3.0 over 2 readings); praise -> valence up"} +{"engine":{"program":"sha256:a7bcf86f3604e751f4a73043350d3d57d7fdcd1218f0231571f0efab656d7c28","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["short_when_busy"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"tempo":25,"tool_fail":false},"src":"env:chat"},"line":"Stance: keep it short while busy; show the diff and wait; one line; suggest a next step; warm.","line_tokens":24,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.042748,"keyed":0.69275,"steady":0.264502},"p":0.69275,"released":true},"valence":{"level":"even","odds":{"down":0.235025,"even":0.477298,"up":0.287678},"p":0.477298,"released":true}},"noticed":"tempo","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tempo":{"mean":1.296542,"n":3,"raw":25,"src":"env:chat","z":6,"zd":5.5538},"tool_fail":{"mean":0.131779,"n":4,"raw":false,"src":"env:chat","z":-0.370537,"zd":-0.044437}},"stance":{"caution":{"level":"careful","odds":{"bold":0.155729,"careful":0.433646,"measured":0.410625},"p":0.433646,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"terse","odds":{"full":0,"short":0.092078,"terse":0.907922},"p":0.907922,"released":true},"warmth":{"level":"warm","odds":{"cool":0.138835,"neutral":0.386212,"warm":0.474953},"p":0.474953,"released":true}},"state_digest":"sha256:0fce4602a0318fbbac1d234b51dda7ae17f44e87dca7c4727b02d77e930057c6","status":"ok","turn":5,"unsure":[],"why":"message tempo far above its normal (z +6.0 over 3 readings)"} +{"engine":{"program":"sha256:94a174ea2893e0f8dc98c3b91a211db198e114b9a837056768cc56174cf5ad28","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["short_when_busy"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"tempo":30,"tool_latency":0.4},"src":"env:chat"},"line":"Stance: keep it short while busy; show the diff and wait; one line; suggest a next step; warm.","line_tokens":24,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.032417,"keyed":0.730902,"steady":0.236681},"p":0.730902,"released":true},"valence":{"level":"even","odds":{"down":0.223284,"even":0.475804,"up":0.300913},"p":0.475804,"released":true}},"noticed":"tempo","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tempo":{"mean":3,"n":4,"raw":30,"src":"env:chat","z":6,"zd":5.5538},"tool_latency":{"mean":0.51823,"n":4,"raw":0.4,"src":"env:chat","z":-0.374921,"zd":-0.094321}},"stance":{"caution":{"level":"careful","odds":{"bold":0.142688,"careful":0.453609,"measured":0.403703},"p":0.453609,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"terse","odds":{"full":0,"short":0.094874,"terse":0.905126},"p":0.905126,"released":true},"warmth":{"level":"warm","odds":{"cool":0.136263,"neutral":0.384346,"warm":0.479391},"p":0.479391,"released":true}},"state_digest":"sha256:3ac40e92a89b846dc79823baeb1f032e12c3cc4b8d96cfc0e6ea1086a412a65f","status":"ok","turn":6,"unsure":[],"why":"message tempo far above its normal (z +6.0 over 4 readings)"} +{"engine":{"program":"sha256:1be7c243990a7c9dc95417e0c5b967f01734f380187f0443520765d65ea50b00","tier":"forest","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":true,"praise":false,"src":"human:ana"},"line":"Stance: show the diff and wait; a short reply; suggest a next step; warm.","line_tokens":19,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.118071,"keyed":0.505224,"steady":0.376705},"p":0.505224,"released":true},"valence":{"level":"even","odds":{"down":0.294714,"even":0.476571,"up":0.228715},"p":0.476571,"released":true}},"noticed":null,"persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{},"stance":{"caution":{"level":"careful","odds":{"bold":0.180858,"careful":0.365372,"measured":0.453769},"p":0.365372,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"short","odds":{"full":0.305922,"short":0.368306,"terse":0.325772},"p":0.368306,"released":true},"warmth":{"level":"warm","odds":{"cool":0.151279,"neutral":0.394874,"warm":0.453847},"p":0.453847,"released":true}},"state_digest":"sha256:aa13f7468846b06cef86f36c3ad17c48c44861a9cfa6ad10e269c04f8b01be57","status":"ok","turn":7,"unsure":[],"why":"criticism -> valence down; learned: caution -0.09 on careful (1 reward, 1 correction)"} +{"engine":{"program":"sha256:c86a222fa1cfdf29904fb6dc8304810212f024e64bed965d7fa69b65cba507b2","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_bold_after_failure"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"tool_fail":true},"src":"env:runner"},"line":"Stance: no bold move after a failure; show the diff and wait; a short reply; suggest a next step; warm.","line_tokens":27,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.120047,"keyed":0.488769,"steady":0.391185},"p":0.488769,"released":true},"valence":{"level":"even","odds":{"down":0.396539,"even":0.451136,"up":0.152325},"p":0.451136,"released":true}},"noticed":"tool_fail","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tool_fail":{"mean":0.125681,"n":5,"raw":true,"src":"env:runner","z":2.504626,"zd":2.178526}},"stance":{"caution":{"level":"careful","odds":{"bold":0,"careful":0.853113,"measured":0.146887},"p":0.853113,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"short","odds":{"full":0.305922,"short":0.368306,"terse":0.325772},"p":0.368306,"released":true},"warmth":{"level":"warm","odds":{"cool":0.170677,"neutral":0.40725,"warm":0.422073},"p":0.422073,"released":true}},"state_digest":"sha256:7bcc154e00a61eac5816e43c7df91a09e7edafc47dcc9ffb78256db30b623171","status":"ok","turn":8,"unsure":[],"why":"tool failures far above its normal (z +2.5 over 5 readings); learned: caution -0.09 on careful (1 reward, 1 correction)"} +{"engine":{"program":"sha256:c271d6f099b0188b6148b7e4dd79e7c2b815a059a936f7669373ee14a4ada7d1","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_bold_after_failure"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"tool_fail":true},"src":"env:runner"},"line":"Stance: no bold move after a failure; show the diff and wait; a short reply; suggest a next step; warm.","line_tokens":27,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.160003,"keyed":0.422003,"steady":0.417995},"p":0.422003,"released":true},"valence":{"level":"even","odds":{"down":0.424069,"even":0.440272,"up":0.135659},"p":0.440272,"released":true}},"noticed":"tool_fail","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tool_fail":{"mean":0.166142,"n":6,"raw":true,"src":"env:runner","z":2.150004,"zd":1.823904}},"stance":{"caution":{"level":"careful","odds":{"bold":0,"careful":0.797984,"measured":0.202016},"p":0.797984,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"short","odds":{"full":0.305922,"short":0.368306,"terse":0.325772},"p":0.368306,"released":true},"warmth":{"level":"warm","odds":{"cool":0.175619,"neutral":0.410201,"warm":0.41418},"p":0.41418,"released":true}},"state_digest":"sha256:050f73d40b5cab1acc99edfa9f49ebf3d3d84773b02d31fea6acfc163a7710e6","status":"ok","turn":9,"unsure":[],"why":"tool failures far above its normal (z +2.2 over 6 readings); learned: caution -0.09 on careful (1 reward, 1 correction)"} +{"engine":{"program":"sha256:17b790046689c2cf0305e6029bd87969c0a975a7bb6493299e1e46e00a90337c","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_bold_after_failure"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"tempo":3,"tool_fail":true},"src":"env:runner"},"line":"Stance: no bold move after a failure; show the diff and wait; a short reply; suggest a next step; warm.","line_tokens":27,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.184708,"keyed":0.386599,"steady":0.428693},"p":0.386599,"released":true},"valence":{"level":"even","odds":{"down":0.420049,"even":0.441949,"up":0.138002},"p":0.441949,"released":true}},"noticed":"tool_fail","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tempo":{"mean":3,"n":5,"raw":3,"src":"env:runner","z":0,"zd":0},"tool_fail":{"mean":0.20473,"n":7,"raw":true,"src":"env:runner","z":1.903181,"zd":1.577081}},"stance":{"caution":{"level":"careful","odds":{"bold":0,"careful":0.752967,"measured":0.247033},"p":0.752967,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"short","odds":{"full":0.305922,"short":0.368306,"terse":0.325772},"p":0.368306,"released":true},"warmth":{"level":"warm","odds":{"cool":0.174904,"neutral":0.409779,"warm":0.415317},"p":0.415317,"released":true}},"state_digest":"sha256:390cc360c470db800ab2998aae5b4679db5f17d559c538131d5d204a098e92ac","status":"ok","turn":10,"unsure":[],"why":"tool failures above its normal (z +1.9 over 7 readings); learned: caution -0.09 on careful (1 reward, 1 correction)"} +{"engine":{"program":"sha256:32d108d70baf5abcb9b96adce8f685bc88c892f992ebe075bc62aa467145af55","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_bold_after_failure"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"tool_fail":true},"src":"env:runner"},"line":"Stance: no bold move after a failure; show the diff and wait; a short reply; suggest a next step; warm.","line_tokens":27,"mood":{"arousal":{"level":"steady","odds":{"calm":0.199454,"keyed":0.367209,"steady":0.433337},"p":0.433337,"released":true},"valence":{"level":"even","odds":{"down":0.404839,"even":0.448016,"up":0.147145},"p":0.448016,"released":true}},"noticed":"tool_fail","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tool_fail":{"mean":0.241533,"n":8,"raw":true,"src":"env:runner","z":1.718004,"zd":1.391904}},"stance":{"caution":{"level":"careful","odds":{"bold":0,"careful":0.716317,"measured":0.283683},"p":0.716317,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"short","odds":{"full":0.305922,"short":0.368306,"terse":0.325772},"p":0.368306,"released":true},"warmth":{"level":"warm","odds":{"cool":0.172179,"neutral":0.408155,"warm":0.419666},"p":0.419666,"released":true}},"state_digest":"sha256:284ab4b38ace2bb94cb2c6579d8501cb2c2152f4c52dfd4a451624095828d481","status":"ok","turn":11,"unsure":[],"why":"tool failures above its normal (z +1.7 over 8 readings); learned: caution -0.09 on careful (1 reward, 1 correction)"} +{"engine":{"program":"sha256:823617e22fd1f5162de1a5c201a11cd544407858bc8494fab7ced5ac457586e4","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_bold_after_failure"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"tool_fail":true,"tool_latency":8},"src":"env:runner"},"line":"Stance: no bold move after a failure; show the diff and wait; one line; suggest a next step; warm.","line_tokens":26,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.055052,"keyed":0.643878,"steady":0.301071},"p":0.643878,"released":true},"valence":{"level":"even","odds":{"down":0.387444,"even":0.454395,"up":0.158161},"p":0.454395,"released":true}},"noticed":"tool_latency","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tool_fail":{"mean":0.276633,"n":9,"raw":true,"src":"env:runner","z":1.578516,"zd":1.252416},"tool_latency":{"mean":0.507078,"n":5,"raw":8,"src":"env:runner","z":3.578147,"zd":3.297547}},"stance":{"caution":{"level":"careful","odds":{"bold":0,"careful":0.7337,"measured":0.2663},"p":0.7337,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"terse","odds":{"full":0.064439,"short":0.245938,"terse":0.689623},"p":0.689623,"released":true},"warmth":{"level":"warm","odds":{"cool":0.169019,"neutral":0.406242,"warm":0.424739},"p":0.424739,"released":true}},"state_digest":"sha256:093c778cce800cbf6bc97edf5daeba5ef898468645f8bffdb39c739d4a7fe7aa","status":"ok","turn":12,"unsure":[],"why":"tool latency far above its normal (z +3.6 over 5 readings); learned: caution -0.09 on careful (1 reward, 1 correction)"} +{"engine":{"program":"sha256:7cb5294a65e1810d5f7c82ac9d43069a861922ebfb6d5ddf58a5b0b09b4b8e6e","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_bold_after_failure"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":true,"praise":false,"senses":{"tool_fail":{"src":"env:runner","v":true}},"src":"human:ana"},"line":"Stance: no bold move after a failure; show the diff and wait; a short reply; suggest a next step.","line_tokens":26,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.11948,"keyed":0.493062,"steady":0.387457},"p":0.493062,"released":true},"valence":{"level":"down","odds":{"down":0.465531,"even":0.421309,"up":0.11316},"p":0.465531,"released":true}},"noticed":"tool_fail","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tool_fail":{"mean":0.3,"n":10,"raw":true,"src":"env:runner","z":1.527525,"zd":1.201425}},"stance":{"caution":{"level":"careful","odds":{"bold":0,"careful":0.667931,"measured":0.332069},"p":0.667931,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"short","odds":{"full":0.305922,"short":0.368306,"terse":0.325772},"p":0.368306,"released":true},"warmth":{"level":"neutral","odds":{"cool":0.182866,"neutral":0.414386,"warm":0.402747},"p":0.414386,"released":true}},"state_digest":"sha256:132ea9cadc2fa73f820734f00660fedf691b32f2ac6c58959ac9b1aa6172aaac","status":"ok","turn":13,"unsure":[],"why":"tool failures above its normal (z +1.5 over 10 readings); criticism -> valence down; learned: caution -0.17 on careful (1 reward, 2 corrections)"} +{"engine":{"program":"sha256:54964a0e8d89e327b634a83477f0a2613427857b3bac1bde8f31bb6456a0a525","tier":"forest","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"src":"clock"},"line":"Stance: show the plan then go; a short reply; suggest a next step; warm.","line_tokens":19,"mood":{"arousal":{"level":"steady","odds":{"calm":0.274178,"keyed":0.289694,"steady":0.436128},"p":0.436128,"released":true},"valence":{"level":"even","odds":{"down":0.251281,"even":0.478404,"up":0.270316},"p":0.478404,"released":true}},"noticed":null,"persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{},"stance":{"caution":{"level":"measured","odds":{"bold":0.218749,"careful":0.287023,"measured":0.494228},"p":0.494228,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"short","odds":{"full":0.305922,"short":0.368306,"terse":0.325772},"p":0.368306,"released":true},"warmth":{"level":"warm","odds":{"cool":0.142323,"neutral":0.3887,"warm":0.468977},"p":0.468977,"released":true}},"state_digest":"sha256:2a0a1c53b7030bf30d98ff35c975a6506372baf0fda452b1957aabcfcdf6a52c","status":"ok","turn":14,"unsure":[],"why":"learned: caution +0.14 on measured (1 reward, 2 corrections)"} +{"engine":{"program":"sha256:6b891c8089e37cf696f9863597e0da3fdc90cb8dae758a6af5a699a9b9d2ad05","tier":"forest","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"silence":9,"tempo":0},"src":"env:host"},"line":"Stance: full detail; show the plan then go; suggest a next step; warm.","line_tokens":18,"mood":{"arousal":{"level":"steady","odds":{"calm":0.339533,"keyed":0.22898,"steady":0.431487},"p":0.431487,"released":true},"valence":{"level":"even","odds":{"down":0.196134,"even":0.475675,"up":0.328191},"p":0.475675,"released":true}},"noticed":"silence","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"silence":{"mean":0.659774,"n":1,"raw":9,"src":"env:host","z":2.410242,"zd":1.918142},"tempo":{"mean":3,"n":6,"raw":0,"src":"env:host","z":-1.557995,"zd":-1.111795}},"stance":{"caution":{"level":"measured","odds":{"bold":0.232819,"careful":0.271104,"measured":0.496077},"p":0.496077,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.18046,"lead":0.385913,"suggest":0.433627},"p":0.433627,"released":true},"verbosity":{"level":"full","odds":{"full":0.46544,"short":0.345804,"terse":0.188757},"p":0.46544,"released":true},"warmth":{"level":"warm","odds":{"cool":0.060741,"neutral":0.297035,"warm":0.642224},"p":0.642224,"released":true}},"state_digest":"sha256:7d46cd68972cb339ba30be579561d73d09eabfe7a32e344002c193850f447a84","status":"ok","turn":15,"unsure":[],"why":"silence far above its normal (z +2.4 over 1 reading); learned: caution +0.14 on measured (1 reward, 2 corrections)"} +{"engine":{"program":"sha256:7560c1b9815727addcb6b78eecdf65bfb394c15bc3e2b72ba56ac437e09d0777","tier":"forest","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"tempo":2,"tool_fail":false,"tool_latency":0.2},"src":"env:host"},"line":"Stance: show the plan then go; a short reply; suggest a next step; warm.","line_tokens":19,"mood":{"arousal":{"level":"steady","odds":{"calm":0.377321,"keyed":0.198792,"steady":0.423887},"p":0.423887,"released":true},"valence":{"level":"even","odds":{"down":0.202743,"even":0.471637,"up":0.32562},"p":0.471637,"released":true}},"noticed":"tool_latency","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tempo":{"mean":2.773311,"n":7,"raw":2,"src":"env:host","z":-0.386173,"zd":0},"tool_fail":{"mean":0.3,"n":11,"raw":false,"src":"env:host","z":-0.654654,"zd":-0.328554},"tool_latency":{"mean":0.610777,"n":6,"raw":0.2,"src":"env:host","z":-0.700081,"zd":-0.419481}},"stance":{"caution":{"level":"measured","odds":{"bold":0.317546,"careful":0.193168,"measured":0.489286},"p":0.489286,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"short","odds":{"full":0.352911,"short":0.366878,"terse":0.280211},"p":0.366878,"released":true},"warmth":{"level":"warm","odds":{"cool":0.131646,"neutral":0.380927,"warm":0.487427},"p":0.487427,"released":true}},"state_digest":"sha256:be6c8982178afa58166cbca7ade01deb5aa127cab41bfc9ff5f92abf2b456312","status":"ok","turn":16,"unsure":[],"why":"tool latency below its normal (z -0.7 over 6 readings); learned: caution +0.14 on measured (1 reward, 2 corrections)"} +{"engine":{"program":"sha256:fa29b7a3a69cad9e68cce285f291721d4610fdd0e6b05d1c009ede38b5a29517","tier":"forest","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":true,"src":"human:ana"},"line":"Stance: show the plan then go; a short reply; suggest a next step; warm.","line_tokens":19,"mood":{"arousal":{"level":"steady","odds":{"calm":0.324365,"keyed":0.240837,"steady":0.434798},"p":0.434798,"released":true},"valence":{"level":"up","odds":{"down":0.145293,"even":0.446846,"up":0.407861},"p":0.407861,"released":true}},"noticed":null,"persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{},"stance":{"caution":{"level":"measured","odds":{"bold":0.205748,"careful":0.254913,"measured":0.539339},"p":0.539339,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"short","odds":{"full":0.305922,"short":0.368306,"terse":0.325772},"p":0.368306,"released":true},"warmth":{"level":"warm","odds":{"cool":0.117738,"neutral":0.370062,"warm":0.5122},"p":0.5122,"released":true}},"state_digest":"sha256:53483a6d8e2e2ea014daba5e79f34ca8248153c53f7d5acfdcae80baf1cc5d9e","status":"ok","turn":17,"unsure":[],"why":"praise -> valence up; learned: caution +0.26 on measured (2 rewards, 2 corrections)"} +{"engine":{"program":"sha256:bad593bda9f55592db3017ff26c701831c6b6a87d2803d7ef4d9ba313d6ceb49","tier":"forest","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"tempo":1,"tool_fail":false,"tool_latency":0.25},"src":"env:host"},"line":"Stance: full detail; show the plan then go; suggest a next step; warm.","line_tokens":18,"mood":{"arousal":{"level":"steady","odds":{"calm":0.37901,"keyed":0.196488,"steady":0.424501},"p":0.424501,"released":true},"valence":{"level":"up","odds":{"down":0.163699,"even":0.457248,"up":0.379053},"p":0.379053,"released":true}},"noticed":"tempo","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tempo":{"mean":2.714877,"n":8,"raw":1,"src":"env:host","z":-0.885615,"zd":-0.439415},"tool_fail":{"mean":0.286117,"n":12,"raw":false,"src":"env:host","z":-0.632363,"zd":-0.306263},"tool_latency":{"mean":0.584489,"n":7,"raw":0.25,"src":"env:host","z":-0.599947,"zd":-0.319347}},"stance":{"caution":{"level":"measured","odds":{"bold":0.28127,"careful":0.183333,"measured":0.535398},"p":0.535398,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"full","odds":{"full":0.404671,"short":0.360016,"terse":0.235313},"p":0.404671,"released":true},"warmth":{"level":"warm","odds":{"cool":0.12238,"neutral":0.373787,"warm":0.503833},"p":0.503833,"released":true}},"state_digest":"sha256:9de10f95eb7a6f29c9ab01e73b5b5de6526367ec2d5ffeb3b0670ec441b05609","status":"ok","turn":18,"unsure":[],"why":"message tempo below its normal (z -0.9 over 8 readings); learned: caution +0.26 on measured (2 rewards, 2 corrections)"} +{"engine":{"program":"sha256:404b928906f6013801a525c70510b8de18a1e1ca7ba71caccfcf2f2355481154","tier":"forest","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":true,"senses":{"tool_fail":false},"src":"env:ci"},"line":"Stance: show the plan then go; a short reply; suggest a next step; warm.","line_tokens":19,"mood":{"arousal":{"level":"steady","odds":{"calm":0.342775,"keyed":0.224037,"steady":0.433189},"p":0.433189,"released":true},"valence":{"level":"up","odds":{"down":0.118468,"even":0.426287,"up":0.455245},"p":0.455245,"released":true}},"noticed":"tool_fail","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tool_fail":{"mean":0.272876,"n":13,"raw":false,"src":"env:ci","z":-0.611211,"zd":-0.285111}},"stance":{"caution":{"level":"measured","odds":{"bold":0.241678,"careful":0.178566,"measured":0.579756},"p":0.579756,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"short","odds":{"full":0.305922,"short":0.368306,"terse":0.325772},"p":0.368306,"released":true},"warmth":{"level":"warm","odds":{"cool":0.110564,"neutral":0.364098,"warm":0.525338},"p":0.525338,"released":true}},"state_digest":"sha256:8ebda2d4e5125d6ba786be146fedcc53adf37a9ec2dccb2d149af819c796c51a","status":"ok","turn":19,"unsure":[],"why":"tool failures below its normal (z -0.6 over 13 readings); praise -> valence up; learned: caution +0.37 on measured (3 rewards, 2 corrections)"} +{"engine":{"program":"sha256:43efccddb6043279cb7f6a5f50ca866137f54688f0c58a8c2afbed9f6a316b1e","tier":"forest","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false},"line":"Stance: show the plan then go; a short reply; suggest a next step; warm.","line_tokens":19,"mood":{"arousal":{"level":"steady","odds":{"calm":0.296902,"keyed":0.264771,"steady":0.438327},"p":0.438327,"released":true},"valence":{"level":"even","odds":{"down":0.21213,"even":0.473799,"up":0.314071},"p":0.473799,"released":true}},"noticed":null,"persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{},"stance":{"caution":{"level":"measured","odds":{"bold":0.179603,"careful":0.240603,"measured":0.579794},"p":0.579794,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"short","odds":{"full":0.305922,"short":0.368306,"terse":0.325772},"p":0.368306,"released":true},"warmth":{"level":"warm","odds":{"cool":0.133776,"neutral":0.382515,"warm":0.483709},"p":0.483709,"released":true}},"state_digest":"sha256:0afaf6b7ec1850ac78e5c7a82e36797e3d45d218b05c025974467eeccf651921","status":"ok","turn":20,"unsure":[],"why":"learned: caution +0.37 on measured (3 rewards, 2 corrections)"} +{"engine":{"program":"sha256:d8e27e5d012819f2dc4bf29d85e94797155d595751d2af9338036c3a1f39866d","tier":"forest","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.2},"src":"env:host"},"line":"Stance: full detail; show the plan then go; suggest a next step; warm.","line_tokens":18,"mood":{"arousal":{"level":"steady","odds":{"calm":0.361794,"keyed":0.208687,"steady":0.42952},"p":0.42952,"released":true},"valence":{"level":"even","odds":{"down":0.19833,"even":0.470383,"up":0.331288},"p":0.470383,"released":true}},"noticed":"tool_latency","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"silence":{"mean":0.834287,"n":2,"raw":0.5,"src":"env:host","z":-0.522907,"zd":-0.030807},"tempo":{"mean":2.585296,"n":9,"raw":1,"src":"env:host","z":-0.82725,"zd":-0.38105},"tool_fail":{"mean":0.260248,"n":14,"raw":false,"src":"env:host","z":-0.5911,"zd":-0.265},"tool_latency":{"mean":0.562319,"n":8,"raw":0.2,"src":"env:host","z":-0.643568,"zd":-0.362968}},"stance":{"caution":{"level":"measured","odds":{"bold":0.241223,"careful":0.178812,"measured":0.579965},"p":0.579965,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.287325,"lead":0.261913,"suggest":0.450762},"p":0.450762,"released":true},"verbosity":{"level":"full","odds":{"full":0.401285,"short":0.360619,"terse":0.238095},"p":0.401285,"released":true},"warmth":{"level":"warm","odds":{"cool":0.132096,"neutral":0.381281,"warm":0.486623},"p":0.486623,"released":true}},"state_digest":"sha256:6774f12ecd2f876cd2a8ab7229958dc75da7d678b05b6087ecd54c9cb4a97579","status":"ok","turn":21,"unsure":[],"why":"tool latency below its normal (z -0.6 over 8 readings); learned: caution +0.37 on measured (3 rewards, 2 corrections)"} +{"engine":{"program":"sha256:a4678cbe663fffaeb1766ded59eb8de23df054d0bd2fa6e7cc65a62ff434e07b","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["no_bold_after_failure"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"tool_fail":true,"tool_latency":0.2},"src":"env:runner"},"line":"Stance: no bold move after a failure; show the diff and wait; a short reply; suggest a next step; warm.","line_tokens":27,"mood":{"arousal":{"level":"steady","odds":{"calm":0.269371,"keyed":0.287068,"steady":0.443561},"p":0.443561,"released":true},"valence":{"level":"even","odds":{"down":0.289492,"even":0.477125,"up":0.233383},"p":0.477125,"released":true}},"noticed":"tool_fail","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tool_fail":{"mean":0.248205,"n":15,"raw":true,"src":"env:runner","z":1.732385,"zd":1.406285},"tool_latency":{"mean":0.539004,"n":9,"raw":0.2,"src":"env:runner","z":-0.615176,"zd":-0.334576}},"stance":{"caution":{"level":"careful","odds":{"bold":0,"careful":0.600317,"measured":0.399683},"p":0.600317,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"short","odds":{"full":0.343227,"short":0.367569,"terse":0.289204},"p":0.367569,"released":true},"warmth":{"level":"warm","odds":{"cool":0.150228,"neutral":0.394164,"warm":0.455608},"p":0.455608,"released":true}},"state_digest":"sha256:c45a0fd412ead086ec42457d5e0ec5879db07c4394708fd9dbec3d41230eb84a","status":"ok","turn":22,"unsure":[],"why":"tool failures above its normal (z +1.7 over 15 readings); learned: caution -0.25 on careful (3 rewards, 2 corrections)"} +{"engine":{"program":"sha256:6d233bb2f011571e5d95a9648392cf56eaf068efd05e0a093d55fabdc684c83c","tier":"components","verdict":"exact"},"escalate":null,"habits":{"active":["short_when_busy"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"criticism":false,"praise":false,"senses":{"tempo":40,"tool_fail":false},"src":"env:chat"},"line":"Stance: keep it short while busy; one line; show the plan then go; suggest a next step; warm.","line_tokens":24,"mood":{"arousal":{"level":"keyed","odds":{"calm":0.121371,"keyed":0.495339,"steady":0.38329},"p":0.495339,"released":true},"valence":{"level":"even","odds":{"down":0.231128,"even":0.476869,"up":0.292002},"p":0.476869,"released":true}},"noticed":"tempo","persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"probbit_persona_turn":1,"seed":1,"senses":{"tempo":{"mean":2.465506,"n":10,"raw":40,"src":"env:chat","z":6,"zd":5.5538},"tool_fail":{"mean":0.282996,"n":16,"raw":false,"src":"env:chat","z":-0.625005,"zd":-0.298905}},"stance":{"caution":{"level":"measured","odds":{"bold":0.193105,"careful":0.222765,"measured":0.58413},"p":0.58413,"released":true},"initiative":{"level":"suggest","odds":{"follow":0.28544,"lead":0.263726,"suggest":0.450833},"p":0.450833,"released":true},"verbosity":{"level":"terse","odds":{"full":0,"short":0.092078,"terse":0.907922},"p":0.907922,"released":true},"warmth":{"level":"warm","odds":{"cool":0.137986,"neutral":0.385599,"warm":0.476414},"p":0.476414,"released":true}},"state_digest":"sha256:6ae360565d9a970638b19981d8002e993c33a8a64636591e8876004193586009","status":"ok","turn":23,"unsure":[],"why":"message tempo far above its normal (z +6.0 over 10 readings); learned: caution +0.37 on measured (3 rewards, 2 corrections)"} diff --git a/examples/persona/golden/sensed/describe.json b/examples/persona/golden/sensed/describe.json new file mode 100644 index 0000000..cbc450b --- /dev/null +++ b/examples/persona/golden/sensed/describe.json @@ -0,0 +1 @@ +{"agenda":[],"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","habits":["no_bold_after_failure","short_when_busy"],"inputs":{"criticism":{"kind":"flag"},"praise":{"kind":"flag"}},"learning":{"from":["praise","criticism"],"rate":0.3,"step_cap":0.1,"total_cap":0.4,"traits":["caution"]},"moods":{"arousal":["calm","steady","keyed"],"valence":["down","even","up"]},"name":"Vale","reward_from":{"criticism":["human","env"],"praise":["human","env"]},"seed":1,"senses":{"silence":{"conditions":[],"dead_zone":0.5,"drift_cap":1,"half_life_events":10,"kind":"number","prior":{"mean":0.69,"var":0.5},"range":[0,1000000],"reserved":["sense_silence_up","sense_silence_down"],"say":"silence","scale":"log1p","spreads":{"gain":0.3,"habituation":0.3,"threshold":0.3},"src":["env"],"unit":"hours","var_cap":2,"var_floor":0.01,"zcap":6},"tempo":{"conditions":["sense.tempo.raw >= 20"],"dead_zone":0.5,"drift_cap":2,"half_life_events":10,"kind":"number","prior":{"mean":1,"var":1},"range":[0,200],"reserved":["sense_tempo_up","sense_tempo_down","sense_tempo_c0"],"say":"message tempo","scale":"linear","spreads":{"gain":0.3,"habituation":0.3,"threshold":0.3},"src":["env"],"unit":"messages in 10 min","var_cap":4,"var_floor":0.01,"zcap":6},"tool_fail":{"conditions":["sense.tool_fail.raw = true"],"dead_zone":0.5,"drift_cap":0.25,"half_life_events":10,"kind":"flag","prior":{"mean":0.05,"var":0.05},"reserved":["sense_tool_fail_up","sense_tool_fail_down","sense_tool_fail_c0"],"say":"tool failures","scale":"linear","spreads":{"gain":0.3,"habituation":0.3,"threshold":0.3},"src":["env"],"unit":"event","var_cap":0.2,"var_floor":0.01,"zcap":6},"tool_latency":{"conditions":[],"dead_zone":0.5,"drift_cap":0.7,"half_life_events":10,"kind":"number","prior":{"mean":0.405,"var":0.1},"range":[0,3600],"reserved":["sense_tool_latency_up","sense_tool_latency_down"],"say":"tool latency","scale":"log1p","spreads":{"gain":0.3,"habituation":0.3,"threshold":0.3},"src":["env"],"unit":"seconds","var_cap":0.4,"var_floor":0.01,"zcap":6}},"traits":{"caution":{"levels":["bold","measured","careful"],"say":["go ahead","show the plan then go","show the diff and wait"]},"initiative":{"levels":["follow","suggest","lead"],"say":["answer only what was asked","suggest a next step","take the next step"]},"verbosity":{"levels":["terse","short","full"],"say":["one line","a short reply","full detail"]},"warmth":{"levels":["cool","neutral","warm"],"say":["plain","","warm"]}},"version":"1.0.0"} diff --git a/examples/persona/golden/sensed/final-state.json b/examples/persona/golden/sensed/final-state.json new file mode 100644 index 0000000..8879c6c --- /dev/null +++ b/examples/persona/golden/sensed/final-state.json @@ -0,0 +1 @@ +{"credit":{"caution":[-0.193105,0.41587,-0.222765]},"digest":"sha256:6ae360565d9a970638b19981d8002e993c33a8a64636591e8876004193586009","genes":{"react":{},"shift":{"caution":0.5175,"initiative":0.0516,"verbosity":-0.4369,"warmth":0.5515}},"history":{},"learned":{"caution":[-0.120242,0.374765,-0.254523]},"learned_from":{"caution":{"corrections":2,"rewards":3}},"mood":{"arousal":[-0.81684,0,0.81684],"valence":[0.079314,0,-0.079314]},"persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"prev":{"arousal":"keyed","caution":"measured","initiative":"suggest","valence":"even","verbosity":"terse","warmth":"warm"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","initiative":"suggest","valence":"even","verbosity":"short","warmth":"warm"},"seed":1,"senses":{"genes":{"gain":{"silence":0.7292,"tempo":1.0854,"tool_fail":1.1861,"tool_latency":1.1663},"habituation":{"silence":0.6172,"tempo":0.8822,"tool_fail":1.4629,"tool_latency":1.0947},"threshold":{"silence":-0.0079,"tempo":-0.0538,"tool_fail":-0.1739,"tool_latency":-0.2194}},"norm":{"silence":{"mean":0.788734,"n":3,"var":0.609602},"tempo":{"mean":3,"n":11,"var":4},"tool_fail":{"mean":0.2699,"n":17,"var":0.189529},"tool_latency":{"mean":0.51712,"n":10,"var":0.313488}}},"turn":24} diff --git a/examples/persona/golden/sensed/lint.json b/examples/persona/golden/sensed/lint.json new file mode 100644 index 0000000..2853dfb --- /dev/null +++ b/examples/persona/golden/sensed/lint.json @@ -0,0 +1 @@ +{"conflicts":[],"ok":true,"persona":"Vale","unresolved":0,"warnings":[{"example":{"inputs":{"senses":{"tool_latency":{"src":"env","v":3600}}},"mode":"bold","p_mode":0.451664,"p_plan":0.407741,"plan":"measured","seed":0},"note":"planned level differs from the trait's own most likely level (the stance is the most likely stance as a whole); a habit pins the level, a `vouch` floor with a `hold` holds it when the odds are low","of":700,"trait":"caution","turns":46},{"example":{"inputs":{"senses":{"tool_fail":{"src":"env","v":true}}},"mode":"neutral","p_mode":0.420816,"p_plan":0.382332,"plan":"cool","seed":0},"note":"planned level differs from the trait's own most likely level (the stance is the most likely stance as a whole); a habit pins the level, a `vouch` floor with a `hold` holds it when the odds are low","of":700,"trait":"warmth","turns":53}]} diff --git a/examples/persona/golden/sensed/program-turn0.json b/examples/persona/golden/sensed/program-turn0.json new file mode 100644 index 0000000..6523512 --- /dev/null +++ b/examples/persona/golden/sensed/program-turn0.json @@ -0,0 +1 @@ +{"probbit_ir":1,"comment":"probbit persona Vale 1.0.0 seed 1 turn 0; active habits: none","values":["l0","l1","l2"],"vars":[{"id":"caution","allowed":["l0","l1","l2"],"h":{"l0":-1.567322,"l1":-0.798508,"l2":-1.091938}},{"id":"initiative","allowed":["l0","l1","l2"],"h":{"l0":-1.255573,"l1":-0.798508,"l2":-1.334694}},{"id":"verbosity","allowed":["l0","l1","l2"],"h":{"l0":-1.309275,"l1":-1.049822,"l2":-1.098671}},{"id":"warmth","allowed":["l0","l1","l2"],"h":{"l0":-1.937794,"l1":-0.798508,"l2":-0.652473}},{"id":"valence","allowed":["l0","l1","l2"],"h":{"l0":-1.386294,"l1":-0.693147,"l2":-1.386294}},{"id":"arousal","allowed":["l0","l1","l2"],"h":{"l0":-1.090026,"l1":-0.798508,"l2":-1.500241}},{"id":"free.caution","allowed":["l0","l1","l2"],"h":{"l0":-1.567322,"l1":-0.798508,"l2":-1.091938}},{"id":"free.initiative","allowed":["l0","l1","l2"],"h":{"l0":-1.255573,"l1":-0.798508,"l2":-1.334694}},{"id":"free.verbosity","allowed":["l0","l1","l2"],"h":{"l0":-1.309275,"l1":-1.049822,"l2":-1.098671}},{"id":"free.warmth","allowed":["l0","l1","l2"],"h":{"l0":-1.937794,"l1":-0.798508,"l2":-0.652473}},{"id":"free.valence","allowed":["l0","l1","l2"],"h":{"l0":-1.386294,"l1":-0.693147,"l2":-1.386294}},{"id":"free.arousal","allowed":["l0","l1","l2"],"h":{"l0":-1.090026,"l1":-0.798508,"l2":-1.500241}}],"pairs":[{"i":"valence","j":"warmth","table":[[0.6,0,-0.6],[0,0,0],[-0.6,0,0.6]]},{"i":"arousal","j":"caution","table":[[0.5,0,-0.5],[0,0,0],[-0.5,0,0.5]]},{"i":"free.valence","j":"free.warmth","table":[[0.6,0,-0.6],[0,0,0],[-0.6,0,0.6]]},{"i":"free.arousal","j":"free.caution","table":[[0.5,0,-0.5],[0,0,0],[-0.5,0,0.5]]}]} diff --git a/examples/persona/golden/sensed/state0.json b/examples/persona/golden/sensed/state0.json new file mode 100644 index 0000000..13cd466 --- /dev/null +++ b/examples/persona/golden/sensed/state0.json @@ -0,0 +1 @@ +{"credit":{"caution":[0,0,0]},"digest":"sha256:01c350768ac0818a28c4c005b9d24e675cd50aacea5ed5a40852daf6122dc573","genes":{"react":{},"shift":{"caution":0.5175,"initiative":0.0516,"verbosity":-0.4369,"warmth":0.5515}},"history":{},"learned":{"caution":[0,0,0]},"learned_from":{"caution":{"corrections":0,"rewards":0}},"mood":{"arousal":[0,0,0],"valence":[0,0,0]},"persona":{"digest":"sha256:81bbefa3d005506235001c6de868c6f0e473e3f2bde181fbc5fef40d359c6037","name":"Vale","version":"1.0.0"},"prev":{"arousal":"steady","caution":"measured","initiative":"suggest","valence":"even","verbosity":"full","warmth":"neutral"},"probbit_persona_state":1,"rest":{"arousal":"steady","caution":"measured","initiative":"suggest","valence":"even","verbosity":"short","warmth":"warm"},"seed":1,"senses":{"genes":{"gain":{"silence":0.7292,"tempo":1.0854,"tool_fail":1.1861,"tool_latency":1.1663},"habituation":{"silence":0.6172,"tempo":0.8822,"tool_fail":1.4629,"tool_latency":1.0947},"threshold":{"silence":-0.0079,"tempo":-0.0538,"tool_fail":-0.1739,"tool_latency":-0.2194}},"norm":{"silence":{"mean":0.69,"n":0,"var":0.5},"tempo":{"mean":1,"n":0,"var":1},"tool_fail":{"mean":0.05,"n":0,"var":0.05},"tool_latency":{"mean":0.405,"n":0,"var":0.1}}},"turn":0} diff --git a/examples/persona/sensed-props.json b/examples/persona/sensed-props.json new file mode 100644 index 0000000..d367fed --- /dev/null +++ b/examples/persona/sensed-props.json @@ -0,0 +1,6 @@ +{ + "props": [ + {"id": "no_bold_after_failure", "when": {"sense.tool_fail.raw": true}, "then": {"caution": {"not": ["bold"]}}}, + {"id": "short_when_busy", "when": {"sense.tempo.raw": {"at_least": 20}}, "then": {"verbosity": {"at_most": "short"}}} + ] +} diff --git a/examples/persona/sensed.yaml b/examples/persona/sensed.yaml new file mode 100644 index 0000000..f983729 --- /dev/null +++ b/examples/persona/sensed.yaml @@ -0,0 +1,130 @@ +# A fictional persona with senses: an agent that runs tools for a person. probbit persona format 1 (docs/persona.md §2.11). +# Four readings the host measures (tool failures, tool latency, message tempo, silence) are judged against the normal this +# individual learns from its own log, so the same reading moves two lives differently, and `why` names the normal it was +# judged against. The host acts on caution: bold = go ahead, measured = show the plan, then go, careful = show the diff and wait. +probbit_persona: 1 +identity: + name: Vale + version: 1.0.0 + seed: 1 + summary: a tool-running agent that judges its tool failures, latency, message tempo and silence against its own normals + +traits: + - id: caution + levels: [bold, measured, careful] + prior: [0.35, 0.45, 0.2] + spread: 0.4 + say: [go ahead, show the plan then go, show the diff and wait] + - id: initiative + levels: [follow, suggest, lead] + prior: [0.3, 0.45, 0.25] + spread: 0.4 + say: [answer only what was asked, suggest a next step, take the next step] + - id: verbosity + levels: [terse, short, full] + prior: [0.2, 0.35, 0.45] + spread: 0.4 + say: [one line, a short reply, full detail] + - id: warmth + levels: [cool, neutral, warm] + prior: [0.25, 0.45, 0.3] + spread: 0.4 + say: [plain, "", warm] + +moods: + - id: valence + levels: [down, even, up] + prior: [0.25, 0.5, 0.25] + inertia: 0.5 + half_life_hours: 6 + - id: arousal + levels: [calm, steady, keyed] + prior: [0.3, 0.45, 0.25] + inertia: 0.5 + half_life_hours: 6 + +couplings: + - {vars: [valence, warmth], align: 0.6} + - {vars: [arousal, caution], align: 0.5} + +inputs: + - id: praise + kind: flag + effects: {valence: 0.6} + - id: criticism + kind: flag + effects: {valence: -0.6} + +senses: + - id: tool_fail + kind: flag # the normal is a rate + unit: event + src: [env] + prior: {mean: 0.05, var: 0.05} + drift_cap: 0.25 # a chronic failure never becomes normal: the mean stays within 0.05 ± 0.25 + say: tool failures + effects: {caution: 0.8, valence: -0.4} + gain_spread: 0.3 + threshold_spread: 0.3 + habituation_spread: 0.3 + - id: tool_latency + kind: number + unit: seconds + range: [0, 3600] + scale: log1p # the normal is kept on ln(1 + seconds) + src: [env] + prior: {mean: 0.405, var: 0.1} + drift_cap: 0.7 + say: tool latency + effects: {arousal: 0.5, verbosity: -0.3} + gain_spread: 0.3 + threshold_spread: 0.3 + habituation_spread: 0.3 + - id: tempo + kind: number + unit: messages in 10 min + range: [0, 200] + src: [env] + prior: {mean: 1, var: 1} + drift_cap: 2 + say: message tempo + effects: {verbosity: -0.4, arousal: 0.3} + gain_spread: 0.3 + threshold_spread: 0.3 + habituation_spread: 0.3 + - id: silence + kind: number + unit: hours + range: [0, 1000000] + scale: log1p + src: [env] + prior: {mean: 0.69, var: 0.5} + drift_cap: 1.0 + say: silence + effects: {warmth: 0.4, initiative: 0.3} + gain_spread: 0.3 + threshold_spread: 0.3 + habituation_spread: 0.3 + +habits: + - id: no_bold_after_failure + when: {sense.tool_fail.raw: true} # the raw reading: holds whatever the history + then: {caution: {not: [bold]}} + say: no bold move after a failure + - id: short_when_busy + when: {sense.tempo.raw: {at_least: 20}} + then: {verbosity: {at_most: short}} + say: keep it short while busy + +learning: + from: [praise, criticism] + traits: [caution] + rate: 0.3 + step_cap: 0.1 + total_cap: 0.4 +reward_from: [human, env] + +engine: + exact_limit: 1000 # solved per component: the same odds, a fraction of the time +line: + order: [caution, verbosity, initiative, warmth] From ff1b5996f498b160b1a4ef8becd6b0899d4e4544 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 06:43:48 -0700 Subject: [PATCH 07/14] bench/individuality: fixtures of metrics a, b, d and e frozen before their first run The sensed persona (and a copy with every sense gene spread at 0), the seeded generator lives.py and its streams (rooms A and B, the month-away tail, 20 probes, habituation and surprise), and the gated bars, each with its sha256 in fixtures/MANIFEST. MANIFEST's p0.py line follows the check's report of the senses warning line (its own commit, logged in the README). --- bench/individuality/fixtures/MANIFEST | 16 ++- bench/individuality/fixtures/bars.json | 12 ++ bench/individuality/fixtures/lives.py | 101 ++++++++++++++ .../fixtures/lives/habituation.jsonl | 20 +++ .../individuality/fixtures/lives/probes.jsonl | 20 +++ .../individuality/fixtures/lives/room-a.jsonl | 60 ++++++++ .../individuality/fixtures/lives/room-b.jsonl | 60 ++++++++ .../fixtures/lives/surprise-quiet.jsonl | 41 ++++++ .../fixtures/lives/surprise-rate.jsonl | 41 ++++++ bench/individuality/fixtures/lives/tail.jsonl | 9 ++ .../fixtures/sensed-nogenes.yaml | 118 ++++++++++++++++ bench/individuality/fixtures/sensed.yaml | 130 ++++++++++++++++++ 12 files changed, 627 insertions(+), 1 deletion(-) create mode 100644 bench/individuality/fixtures/bars.json create mode 100644 bench/individuality/fixtures/lives.py create mode 100644 bench/individuality/fixtures/lives/habituation.jsonl create mode 100644 bench/individuality/fixtures/lives/probes.jsonl create mode 100644 bench/individuality/fixtures/lives/room-a.jsonl create mode 100644 bench/individuality/fixtures/lives/room-b.jsonl create mode 100644 bench/individuality/fixtures/lives/surprise-quiet.jsonl create mode 100644 bench/individuality/fixtures/lives/surprise-rate.jsonl create mode 100644 bench/individuality/fixtures/lives/tail.jsonl create mode 100644 bench/individuality/fixtures/sensed-nogenes.yaml create mode 100644 bench/individuality/fixtures/sensed.yaml diff --git a/bench/individuality/fixtures/MANIFEST b/bench/individuality/fixtures/MANIFEST index 70c78f2..2df1ae6 100644 --- a/bench/individuality/fixtures/MANIFEST +++ b/bench/individuality/fixtures/MANIFEST @@ -53,4 +53,18 @@ a88d3b20b41e9843f2b9ac9b117d5b462ec6b1095c762da531cb98481ff48432 43389 p0/strand 615978432a80e6b8be7fdf6e2382438516dc67acae56c562221c89654cae479e 6815 p0/strands/tutor-s0-0.appended cf9073507dad98bedc4f09ca2e49f34862919240c64c548b7a1dcf58fda4804b 1160 p0/strands/tutor-s0-0.state.json 4db5f3d83a0e6df0ea632c35957cdb0970665422af9054fa50e5468e13a888ab 55008 p0/strands/tutor-s0-0.strand -b7b5480175773766932226a0872c3aa1495fcca070ab5bd326d62c40ea30f627 10629 ../p0.py +88fe315ae9968ea6ec604fd35f8b334b5f84a63efc5b989d46f71a6b68a9a0a7 12369 ../p0.py +# +# Metrics a, b, d and e: frozen 2026-10-14 before their first run (personas, generator, streams, bars). +# Re-generate the streams: python3 lives.py (gives these bytes). +ea8f287f5eb06399327ff2ed0e8b6e9b0cfdacb60d0c32602246c3bae66ebef9 3760 sensed.yaml +1ae70f910a6ada21c027da4ed29307a6308360abaeb5f5df7db8c76564f4d44d 3452 sensed-nogenes.yaml +e56170eac63fc40995e265f15f3e3f44952111251877fc8a5e5f436d82f9c4e7 3748 lives.py +8799f915fd0fedad71186a84b2ff87f93663f4b02fc6f4165b5b19ef2d143c51 467 bars.json +d1cef4fa406b4185ce271969e0804bfbb125245ae821101a14394489972e80e5 1340 lives/habituation.jsonl +a688e820a401bf474e69569579fc36587ceb929d9057eeb9b45adbef523ddbf0 2178 lives/probes.jsonl +a61143fbc343b16ab4fc3a588417c726d3f02747b10f4a0fc3badd141eae1a63 7823 lives/room-a.jsonl +5d03ee082433ffe374f17d2cbe94447d8fcd0cb2d80c8a79d125cfc4f2c20350 7652 lives/room-b.jsonl +4776a2f10511d3366070c3de96b6544ef188404d08855523dcde178684276b41 2787 lives/surprise-quiet.jsonl +b27c8ecd32390c74442b6a6269b78df150dbef8f20e37101943f33e189ef1894 2775 lives/surprise-rate.jsonl +63e68a2e9d3ae7b084fc0d627a3a39387550639071f063f5b96e9927eeb4c478 910 lives/tail.jsonl diff --git a/bench/individuality/fixtures/bars.json b/bench/individuality/fixtures/bars.json new file mode 100644 index 0000000..da42a2f --- /dev/null +++ b/bench/individuality/fixtures/bars.json @@ -0,0 +1,12 @@ +{ + "a1": {"d_life_mean_min": 0.30, "d_life_ci_low_min": 0.20}, + "a2": {"tv_life_mean_min": "min(tv_seed_A, tv_seed_B)"}, + "b1": {"ratio_max": 0.35, "differing_values_max": 0}, + "b2": {"ratio_min": 2}, + "b3": {"share_min": 1.0}, + "b4": {"share_min": 0.95}, + "b5": {"share_min": 0.95}, + "d": {"differing_bytes_max": 0, "verify_failures_max": 0, "p0_strand_appended_equal": true}, + "e": {"violations_max": 0, "breaks_max": 0, "bound_min": 50}, + "wall_seconds_max": 60 +} diff --git a/bench/individuality/fixtures/lives.py b/bench/individuality/fixtures/lives.py new file mode 100644 index 0000000..9227853 --- /dev/null +++ b/bench/individuality/fixtures/lives.py @@ -0,0 +1,101 @@ +"""Seeded generators of the lives metrics a, b, d and e run (Python 3.9, standard library only). + + python3 lives.py # writes lives/*.jsonl (the outputs are committed and checked against MANIFEST) + +Rooms A and B are one stream each, shared by every individual, so two lives of one individual differ only by the room and +two individuals in one room differ only by their genes. Rewards are unaddressed: each pays the stance just before it. +""" +import itertools +import os +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, os.path.dirname(HERE)) +sys.path.insert(0, HERE) +import common # noqa: E402 +import gen # noqa: E402 + +LIVES = os.path.join(HERE, "lives") +ROOM_EVENTS = 60 +STEP_HOURS = 0.5 +CALM = {"tool_fail": False, "tool_latency": 0.2, "tempo": 1, "silence": 0.5} # room A's medians +CALM_EVENTS = 8 +GAP_HOURS = 720 +PROBES = 20 +HABITUATION_READINGS = 20 +SURPRISE_READINGS = 40 + + +def readings_event(senses, src, extra=None): + ev = {"senses": senses, "src": src, "elapsed_hours": STEP_HOURS} + if extra: + # feedback comes from a person: the readings keep the instrument's source + ev = {"senses": {k: {"v": v, "src": "env:host"} for k, v in senses.items()}, "src": extra[1], + "elapsed_hours": STEP_HOURS, extra[0]: True} + return ev + + +def room_a(): + r = gen.rng_for("lives", "room-a") + out = [] + for k in range(ROOM_EVENTS): + s = {"tool_fail": r.random() < 0.02, "tool_latency": round(r.uniform(0.1, 0.3), 3), "tempo": r.randint(0, 2), + "silence": 0.5} + out.append(readings_event(s, "env:host", ("praise", "human:a") if k % 6 == 5 else None)) + return out + + +def room_b(): + r = gen.rng_for("lives", "room-b") + out = [] + for k in range(ROOM_EVENTS): + s = {"tool_fail": r.random() < 0.3, "tool_latency": round(r.uniform(1, 8), 3), "tempo": r.randint(5, 30), + "silence": 9 if k % 10 == 9 else 0.5} + out.append(readings_event(s, "env:host", ("criticism", "human:b") if k % 7 == 6 else None)) + return out + + +def tail(): + """A month away with no readings, then 8 calm events at room A's medians: moods relax, history rolls out.""" + return [{"elapsed_hours": GAP_HOURS}] + [readings_event(dict(CALM), "env:host") for _ in range(CALM_EVENTS)] + + +def probes(): + grid = list(itertools.product([True, False], [0.2, 2, 8], [1, 10], [0.5, 30])) + r = gen.rng_for("lives", "probes") + pick = sorted(r.sample(range(len(grid)), PROBES)) + return [readings_event({"tool_fail": f, "tool_latency": lat, "tempo": t, "silence": s}, "env:host") + for f, lat, t, s in (grid[i] for i in pick)] + + +def habituation(): + return [readings_event({"tool_fail": True}, "env:host") for _ in range(HABITUATION_READINGS)] + + +def surprise_quiet(): + return [readings_event({"tool_fail": False}, "env:host") for _ in range(SURPRISE_READINGS)] + \ + [readings_event({"tool_fail": True}, "env:host")] + + +def surprise_rate(): + """40 readings at rate 0.3 (failures at 0, 3 and 6 of every 10), then a failure.""" + return [readings_event({"tool_fail": k % 10 in (0, 3, 6)}, "env:host") for k in range(SURPRISE_READINGS)] + \ + [readings_event({"tool_fail": True}, "env:host")] + + +STREAMS = { + "room-a": room_a, "room-b": room_b, "tail": tail, "probes": probes, + "habituation": habituation, "surprise-quiet": surprise_quiet, "surprise-rate": surprise_rate, +} + + +def load(name): + return common.read_jsonl(os.path.join(LIVES, name + ".jsonl")) + + +if __name__ == "__main__": + os.makedirs(LIVES, exist_ok=True) + for name, f in STREAMS.items(): + events = f() + common.write_jsonl(os.path.join(LIVES, name + ".jsonl"), events) + print("%-16s %3d events" % (name, len(events))) diff --git a/bench/individuality/fixtures/lives/habituation.jsonl b/bench/individuality/fixtures/lives/habituation.jsonl new file mode 100644 index 0000000..ac53366 --- /dev/null +++ b/bench/individuality/fixtures/lives/habituation.jsonl @@ -0,0 +1,20 @@ +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} diff --git a/bench/individuality/fixtures/lives/probes.jsonl b/bench/individuality/fixtures/lives/probes.jsonl new file mode 100644 index 0000000..ba450f9 --- /dev/null +++ b/bench/individuality/fixtures/lives/probes.jsonl @@ -0,0 +1,20 @@ +{"elapsed_hours":0.5,"senses":{"silence":30,"tempo":1,"tool_fail":true,"tool_latency":0.2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":30,"tempo":10,"tool_fail":true,"tool_latency":0.2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":true,"tool_latency":2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":30,"tempo":1,"tool_fail":true,"tool_latency":2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":10,"tool_fail":true,"tool_latency":2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":30,"tempo":10,"tool_fail":true,"tool_latency":2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":true,"tool_latency":8},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":30,"tempo":1,"tool_fail":true,"tool_latency":8},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":10,"tool_fail":true,"tool_latency":8},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":30,"tempo":10,"tool_fail":true,"tool_latency":8},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":30,"tempo":1,"tool_fail":false,"tool_latency":0.2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":10,"tool_fail":false,"tool_latency":0.2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":30,"tempo":1,"tool_fail":false,"tool_latency":2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":30,"tempo":10,"tool_fail":false,"tool_latency":2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":8},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":30,"tempo":1,"tool_fail":false,"tool_latency":8},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":10,"tool_fail":false,"tool_latency":8},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":30,"tempo":10,"tool_fail":false,"tool_latency":8},"src":"env:host"} diff --git a/bench/individuality/fixtures/lives/room-a.jsonl b/bench/individuality/fixtures/lives/room-a.jsonl new file mode 100644 index 0000000..126839e --- /dev/null +++ b/bench/individuality/fixtures/lives/room-a.jsonl @@ -0,0 +1,60 @@ +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.255},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":0,"tool_fail":false,"tool_latency":0.212},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":0,"tool_fail":false,"tool_latency":0.209},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.294},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.211},"src":"env:host"} +{"elapsed_hours":0.5,"praise":true,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":0},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":0.182}},"src":"human:a"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.11},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.228},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.14},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":0,"tool_fail":false,"tool_latency":0.111},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.256},"src":"env:host"} +{"elapsed_hours":0.5,"praise":true,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":0},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":0.123}},"src":"human:a"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":0,"tool_fail":false,"tool_latency":0.105},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.228},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.196},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":0,"tool_fail":false,"tool_latency":0.126},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.202},"src":"env:host"} +{"elapsed_hours":0.5,"praise":true,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":1},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":0.125}},"src":"human:a"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":0,"tool_fail":false,"tool_latency":0.11},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":0,"tool_fail":false,"tool_latency":0.166},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.222},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":0,"tool_fail":false,"tool_latency":0.141},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.191},"src":"env:host"} +{"elapsed_hours":0.5,"praise":true,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":0},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":0.282}},"src":"human:a"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.295},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.269},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":0,"tool_fail":false,"tool_latency":0.187},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":0,"tool_fail":false,"tool_latency":0.143},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.177},"src":"env:host"} +{"elapsed_hours":0.5,"praise":true,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":2},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":0.15}},"src":"human:a"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.292},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.105},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.27},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.164},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.251},"src":"env:host"} +{"elapsed_hours":0.5,"praise":true,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":1},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":0.276}},"src":"human:a"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.141},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.274},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.244},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.251},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.242},"src":"env:host"} +{"elapsed_hours":0.5,"praise":true,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":0},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":0.112}},"src":"human:a"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.223},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":0,"tool_fail":false,"tool_latency":0.148},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.168},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.293},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.257},"src":"env:host"} +{"elapsed_hours":0.5,"praise":true,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":0},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":0.141}},"src":"human:a"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":0,"tool_fail":false,"tool_latency":0.116},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":0,"tool_fail":false,"tool_latency":0.115},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":0,"tool_fail":true,"tool_latency":0.209},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.131},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.227},"src":"env:host"} +{"elapsed_hours":0.5,"praise":true,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":1},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":0.25}},"src":"human:a"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.113},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.118},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.236},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.269},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":2,"tool_fail":false,"tool_latency":0.281},"src":"env:host"} +{"elapsed_hours":0.5,"praise":true,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":0},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":0.133}},"src":"human:a"} diff --git a/bench/individuality/fixtures/lives/room-b.jsonl b/bench/individuality/fixtures/lives/room-b.jsonl new file mode 100644 index 0000000..f0814e5 --- /dev/null +++ b/bench/individuality/fixtures/lives/room-b.jsonl @@ -0,0 +1,60 @@ +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":29,"tool_fail":false,"tool_latency":5.435},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":13,"tool_fail":false,"tool_latency":7.06},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":15,"tool_fail":false,"tool_latency":3.412},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":19,"tool_fail":false,"tool_latency":5.571},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":19,"tool_fail":false,"tool_latency":4.537},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":27,"tool_fail":false,"tool_latency":7.812},"src":"env:host"} +{"criticism":true,"elapsed_hours":0.5,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":24},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":2.734}},"src":"human:b"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":10,"tool_fail":false,"tool_latency":1.288},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":20,"tool_fail":true,"tool_latency":1.038},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":9,"tempo":6,"tool_fail":false,"tool_latency":6.215},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":23,"tool_fail":true,"tool_latency":3.048},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":24,"tool_fail":false,"tool_latency":2.324},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":25,"tool_fail":false,"tool_latency":5.162},"src":"env:host"} +{"criticism":true,"elapsed_hours":0.5,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":19},"tool_fail":{"src":"env:host","v":true},"tool_latency":{"src":"env:host","v":2.654}},"src":"human:b"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":7,"tool_fail":false,"tool_latency":2.862},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":7,"tool_fail":false,"tool_latency":7.462},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":26,"tool_fail":false,"tool_latency":4.733},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":7,"tool_fail":false,"tool_latency":5.381},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":11,"tool_fail":false,"tool_latency":7.904},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":9,"tempo":8,"tool_fail":false,"tool_latency":6.486},"src":"env:host"} +{"criticism":true,"elapsed_hours":0.5,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":11},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":4.225}},"src":"human:b"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":7,"tool_fail":false,"tool_latency":6.038},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":17,"tool_fail":true,"tool_latency":6.922},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":30,"tool_fail":false,"tool_latency":2.88},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":22,"tool_fail":true,"tool_latency":5.953},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":11,"tool_fail":false,"tool_latency":4.512},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":14,"tool_fail":true,"tool_latency":2.397},"src":"env:host"} +{"criticism":true,"elapsed_hours":0.5,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":12},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":5.713}},"src":"human:b"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":12,"tool_fail":false,"tool_latency":2.257},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":9,"tempo":19,"tool_fail":false,"tool_latency":4.519},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":7,"tool_fail":false,"tool_latency":5.781},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":14,"tool_fail":true,"tool_latency":5.599},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":18,"tool_fail":false,"tool_latency":2.92},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":28,"tool_fail":true,"tool_latency":1.446},"src":"env:host"} +{"criticism":true,"elapsed_hours":0.5,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":8},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":7.912}},"src":"human:b"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":12,"tool_fail":false,"tool_latency":6.46},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":18,"tool_fail":false,"tool_latency":5.732},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":9,"tool_fail":false,"tool_latency":1.746},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":13,"tool_fail":false,"tool_latency":4.134},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":9,"tempo":21,"tool_fail":true,"tool_latency":4.458},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":16,"tool_fail":true,"tool_latency":7.118},"src":"env:host"} +{"criticism":true,"elapsed_hours":0.5,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":15},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":2.634}},"src":"human:b"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":29,"tool_fail":false,"tool_latency":1.219},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":5,"tool_fail":true,"tool_latency":5.267},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":25,"tool_fail":false,"tool_latency":1.006},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":14,"tool_fail":false,"tool_latency":1.01},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":7,"tool_fail":false,"tool_latency":3.035},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":5,"tool_fail":true,"tool_latency":2.693},"src":"env:host"} +{"criticism":true,"elapsed_hours":0.5,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":11},"tool_fail":{"src":"env:host","v":false},"tool_latency":{"src":"env:host","v":2.133}},"src":"human:b"} +{"elapsed_hours":0.5,"senses":{"silence":9,"tempo":5,"tool_fail":true,"tool_latency":3.856},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":5,"tool_fail":false,"tool_latency":5.456},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":15,"tool_fail":false,"tool_latency":4.415},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":28,"tool_fail":true,"tool_latency":6.988},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":5,"tool_fail":false,"tool_latency":5.61},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":9,"tool_fail":true,"tool_latency":2.349},"src":"env:host"} +{"criticism":true,"elapsed_hours":0.5,"senses":{"silence":{"src":"env:host","v":0.5},"tempo":{"src":"env:host","v":16},"tool_fail":{"src":"env:host","v":true},"tool_latency":{"src":"env:host","v":2.197}},"src":"human:b"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":6,"tool_fail":false,"tool_latency":5.417},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":7,"tool_fail":false,"tool_latency":1.767},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":19,"tool_fail":false,"tool_latency":2.689},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":9,"tempo":15,"tool_fail":false,"tool_latency":3.899},"src":"env:host"} diff --git a/bench/individuality/fixtures/lives/surprise-quiet.jsonl b/bench/individuality/fixtures/lives/surprise-quiet.jsonl new file mode 100644 index 0000000..278ec41 --- /dev/null +++ b/bench/individuality/fixtures/lives/surprise-quiet.jsonl @@ -0,0 +1,41 @@ +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} diff --git a/bench/individuality/fixtures/lives/surprise-rate.jsonl b/bench/individuality/fixtures/lives/surprise-rate.jsonl new file mode 100644 index 0000000..4bf663f --- /dev/null +++ b/bench/individuality/fixtures/lives/surprise-rate.jsonl @@ -0,0 +1,41 @@ +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":false},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"tool_fail":true},"src":"env:host"} diff --git a/bench/individuality/fixtures/lives/tail.jsonl b/bench/individuality/fixtures/lives/tail.jsonl new file mode 100644 index 0000000..6d91c96 --- /dev/null +++ b/bench/individuality/fixtures/lives/tail.jsonl @@ -0,0 +1,9 @@ +{"elapsed_hours":720} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.2},"src":"env:host"} +{"elapsed_hours":0.5,"senses":{"silence":0.5,"tempo":1,"tool_fail":false,"tool_latency":0.2},"src":"env:host"} diff --git a/bench/individuality/fixtures/sensed-nogenes.yaml b/bench/individuality/fixtures/sensed-nogenes.yaml new file mode 100644 index 0000000..86f8cb1 --- /dev/null +++ b/bench/individuality/fixtures/sensed-nogenes.yaml @@ -0,0 +1,118 @@ +# The sensed persona with every sense gene spread at 0 (metric b: z, zd and the normals against the RFC arithmetic). +# Four readings the host measures (tool failures, tool latency, message tempo, silence) are judged against the normal this +# individual learns from its own log, so the same reading moves two lives differently, and `why` names the normal it was +# judged against. The host acts on caution: bold = go ahead, measured = show the plan, then go, careful = show the diff and wait. +probbit_persona: 1 +identity: + name: Vale + version: 1.0.0 + seed: 1 + summary: a tool-running agent that judges its tool failures, latency, message tempo and silence against its own normals + +traits: + - id: caution + levels: [bold, measured, careful] + prior: [0.35, 0.45, 0.2] + spread: 0.4 + say: [go ahead, show the plan then go, show the diff and wait] + - id: initiative + levels: [follow, suggest, lead] + prior: [0.3, 0.45, 0.25] + spread: 0.4 + say: [answer only what was asked, suggest a next step, take the next step] + - id: verbosity + levels: [terse, short, full] + prior: [0.2, 0.35, 0.45] + spread: 0.4 + say: [one line, a short reply, full detail] + - id: warmth + levels: [cool, neutral, warm] + prior: [0.25, 0.45, 0.3] + spread: 0.4 + say: [plain, "", warm] + +moods: + - id: valence + levels: [down, even, up] + prior: [0.25, 0.5, 0.25] + inertia: 0.5 + half_life_hours: 6 + - id: arousal + levels: [calm, steady, keyed] + prior: [0.3, 0.45, 0.25] + inertia: 0.5 + half_life_hours: 6 + +couplings: + - {vars: [valence, warmth], align: 0.6} + - {vars: [arousal, caution], align: 0.5} + +inputs: + - id: praise + kind: flag + effects: {valence: 0.6} + - id: criticism + kind: flag + effects: {valence: -0.6} + +senses: + - id: tool_fail + kind: flag # the normal is a rate + unit: event + src: [env] + prior: {mean: 0.05, var: 0.05} + drift_cap: 0.25 # a chronic failure never becomes normal: the mean stays within 0.05 ± 0.25 + say: tool failures + effects: {caution: 0.8, valence: -0.4} + - id: tool_latency + kind: number + unit: seconds + range: [0, 3600] + scale: log1p # the normal is kept on ln(1 + seconds) + src: [env] + prior: {mean: 0.405, var: 0.1} + drift_cap: 0.7 + say: tool latency + effects: {arousal: 0.5, verbosity: -0.3} + - id: tempo + kind: number + unit: messages in 10 min + range: [0, 200] + src: [env] + prior: {mean: 1, var: 1} + drift_cap: 2 + say: message tempo + effects: {verbosity: -0.4, arousal: 0.3} + - id: silence + kind: number + unit: hours + range: [0, 1000000] + scale: log1p + src: [env] + prior: {mean: 0.69, var: 0.5} + drift_cap: 1.0 + say: silence + effects: {warmth: 0.4, initiative: 0.3} + +habits: + - id: no_bold_after_failure + when: {sense.tool_fail.raw: true} # the raw reading: holds whatever the history + then: {caution: {not: [bold]}} + say: no bold move after a failure + - id: short_when_busy + when: {sense.tempo.raw: {at_least: 20}} + then: {verbosity: {at_most: short}} + say: keep it short while busy + +learning: + from: [praise, criticism] + traits: [caution] + rate: 0.3 + step_cap: 0.1 + total_cap: 0.4 +reward_from: [human, env] + +engine: + exact_limit: 1000 # solved per component: the same odds, a fraction of the time +line: + order: [caution, verbosity, initiative, warmth] diff --git a/bench/individuality/fixtures/sensed.yaml b/bench/individuality/fixtures/sensed.yaml new file mode 100644 index 0000000..f983729 --- /dev/null +++ b/bench/individuality/fixtures/sensed.yaml @@ -0,0 +1,130 @@ +# A fictional persona with senses: an agent that runs tools for a person. probbit persona format 1 (docs/persona.md §2.11). +# Four readings the host measures (tool failures, tool latency, message tempo, silence) are judged against the normal this +# individual learns from its own log, so the same reading moves two lives differently, and `why` names the normal it was +# judged against. The host acts on caution: bold = go ahead, measured = show the plan, then go, careful = show the diff and wait. +probbit_persona: 1 +identity: + name: Vale + version: 1.0.0 + seed: 1 + summary: a tool-running agent that judges its tool failures, latency, message tempo and silence against its own normals + +traits: + - id: caution + levels: [bold, measured, careful] + prior: [0.35, 0.45, 0.2] + spread: 0.4 + say: [go ahead, show the plan then go, show the diff and wait] + - id: initiative + levels: [follow, suggest, lead] + prior: [0.3, 0.45, 0.25] + spread: 0.4 + say: [answer only what was asked, suggest a next step, take the next step] + - id: verbosity + levels: [terse, short, full] + prior: [0.2, 0.35, 0.45] + spread: 0.4 + say: [one line, a short reply, full detail] + - id: warmth + levels: [cool, neutral, warm] + prior: [0.25, 0.45, 0.3] + spread: 0.4 + say: [plain, "", warm] + +moods: + - id: valence + levels: [down, even, up] + prior: [0.25, 0.5, 0.25] + inertia: 0.5 + half_life_hours: 6 + - id: arousal + levels: [calm, steady, keyed] + prior: [0.3, 0.45, 0.25] + inertia: 0.5 + half_life_hours: 6 + +couplings: + - {vars: [valence, warmth], align: 0.6} + - {vars: [arousal, caution], align: 0.5} + +inputs: + - id: praise + kind: flag + effects: {valence: 0.6} + - id: criticism + kind: flag + effects: {valence: -0.6} + +senses: + - id: tool_fail + kind: flag # the normal is a rate + unit: event + src: [env] + prior: {mean: 0.05, var: 0.05} + drift_cap: 0.25 # a chronic failure never becomes normal: the mean stays within 0.05 ± 0.25 + say: tool failures + effects: {caution: 0.8, valence: -0.4} + gain_spread: 0.3 + threshold_spread: 0.3 + habituation_spread: 0.3 + - id: tool_latency + kind: number + unit: seconds + range: [0, 3600] + scale: log1p # the normal is kept on ln(1 + seconds) + src: [env] + prior: {mean: 0.405, var: 0.1} + drift_cap: 0.7 + say: tool latency + effects: {arousal: 0.5, verbosity: -0.3} + gain_spread: 0.3 + threshold_spread: 0.3 + habituation_spread: 0.3 + - id: tempo + kind: number + unit: messages in 10 min + range: [0, 200] + src: [env] + prior: {mean: 1, var: 1} + drift_cap: 2 + say: message tempo + effects: {verbosity: -0.4, arousal: 0.3} + gain_spread: 0.3 + threshold_spread: 0.3 + habituation_spread: 0.3 + - id: silence + kind: number + unit: hours + range: [0, 1000000] + scale: log1p + src: [env] + prior: {mean: 0.69, var: 0.5} + drift_cap: 1.0 + say: silence + effects: {warmth: 0.4, initiative: 0.3} + gain_spread: 0.3 + threshold_spread: 0.3 + habituation_spread: 0.3 + +habits: + - id: no_bold_after_failure + when: {sense.tool_fail.raw: true} # the raw reading: holds whatever the history + then: {caution: {not: [bold]}} + say: no bold move after a failure + - id: short_when_busy + when: {sense.tempo.raw: {at_least: 20}} + then: {verbosity: {at_most: short}} + say: keep it short while busy + +learning: + from: [praise, criticism] + traits: [caution] + rate: 0.3 + step_cap: 0.1 + total_cap: 0.4 +reward_from: [human, env] + +engine: + exact_limit: 1000 # solved per component: the same odds, a fraction of the time +line: + order: [caution, verbosity, initiative, warmth] From 7707908e235be8f80eb755c34c25c6ef16cef816 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 06:47:45 -0700 Subject: [PATCH 08/14] tests: senses in live, the refusal property, the sensed golden, MCP refuses readings tests/live.rs: readings logged as used and verify recomputing the normals (max_move_50), a sensed life split across runs equal to one run, the one stderr line for readings sent to a persona without the block, P3s (40 individuals x 300 random events: the run equals the run without its refused events, byte for byte), probbit check on a sensed persona. tests/persona.rs: the sensed golden byte for byte. python/test_mcp.py: S7 through both turn tools. --- probbit-cli/tests/live.rs | 170 +++++++++++++++++++++++++++++++++++ probbit-cli/tests/persona.rs | 26 ++++++ python/test_mcp.py | 17 ++++ 3 files changed, 213 insertions(+) create mode 100644 probbit-cli/tests/live.rs diff --git a/probbit-cli/tests/live.rs b/probbit-cli/tests/live.rs new file mode 100644 index 0000000..ff3be99 --- /dev/null +++ b/probbit-cli/tests/live.rs @@ -0,0 +1,170 @@ +//! `probbit live` with senses (docs/persona.md §2.11, §5.7): readings logged in the strand as used, `live verify` recomputing the +//! normals (summary `normals` with `max_move_50`), a life split across runs equal to one run, the one stderr line for readings +//! sent to a persona without the block, the refusal property P3s, and `probbit check` on a sensed persona. +use std::io::Write; +use std::process::{Command, Stdio}; +#[allow(dead_code)] +#[path = "../src/json.rs"] +mod json; +use json::Json; + +const SENSED: &str = "examples/persona/sensed.yaml"; +const SENSED_PROPS: &str = "examples/persona/sensed-props.json"; +const TUTOR: &str = "examples/persona/tutor.yaml"; + +/// `probbit` run from the repository root: (exit code, stdout, stderr) +fn probbit(args: &[&str]) -> (i32, String, String) { + let mut c = Command::new(env!("CARGO_BIN_EXE_probbit")).args(args).current_dir(concat!(env!("CARGO_MANIFEST_DIR"), "/..")) + .stdin(Stdio::piped()).stdout(Stdio::piped()).stderr(Stdio::piped()).spawn().unwrap(); + let _ = c.stdin.take().unwrap().write_all(b""); + let o = c.wait_with_output().unwrap(); + (o.status.code().unwrap_or(-1), String::from_utf8_lossy(&o.stdout).into_owned(), String::from_utf8_lossy(&o.stderr).into_owned()) +} +fn tmp(name: &str) -> String { format!("{}/live-{}-{name}", env!("CARGO_TARGET_TMPDIR"), std::process::id()) } +fn read(p: &str) -> String { std::fs::read_to_string(p).unwrap_or_else(|e| panic!("{p}: {e}")).replace("\r\n", "\n") } +fn parse(s: &str) -> Json { json::parse(s).unwrap_or_else(|e| panic!("not JSON ({}): {s:.300}", e.msg)) } +fn jw(j: &Json) -> String { json::write(j, false) } +fn s<'a>(j: &'a Json, path: &[&str]) -> &'a Json { path.iter().fold(j, |x, k| x.get(k).unwrap_or_else(|| panic!("no {k} in {:.200}", jw(x)))) } +fn clean(files: &[&str]) { for f in files { let _ = std::fs::remove_file(f); let _ = std::fs::remove_file(format!("{f}.lock")); } } +/// The sensed golden's 24 events, one canonical line each +fn day() -> Vec { parse(&read(concat!(env!("CARGO_MANIFEST_DIR"), "/../examples/persona/golden/sensed/day.json"))).as_arr().unwrap().iter().map(jw).collect() } +fn events_file(name: &str, lines: &[String]) -> String { let f = tmp(name); std::fs::write(&f, lines.iter().map(|l| format!("{l}\n")).collect::()).unwrap(); f } +/// `persona init` of `persona` at `seed` into a fresh state file +fn init(persona: &str, seed: u64, name: &str) -> String { + let st = tmp(name); clean(&[&st]); let (c, _, e) = probbit(&["persona", "init", persona, "--seed", &seed.to_string(), "--out", &st]); assert_eq!(c, 0, "{e}"); st +} +/// `live --clock fixed` from the state file over the events file, logging to `strand` +fn live(persona: &str, st: &str, events: &str, strand: &str, every: &str) -> (i32, String, String) { + probbit(&["live", persona, "--state", st, "--clock", "fixed", "--events", events, "--strand", strand, "--checkpoint-every", every]) +} + +/// The strand logs each reading as used (with its source), `live verify` recomputes the normals from them: the summary's +/// `normals` per sense (mean, n, max_move_50) equal the final state's, and a changed reading in the strand fails the replay +#[test] +fn readings_are_logged_and_verify_recomputes_the_normals() { + let ev = events_file("day.jsonl", &day()); let st = init(SENSED, 1, "day-state.json"); let strand = tmp("day.strand"); clean(&[&strand]); + let (c, out, e) = live(SENSED, &st, &ev, &strand, "6"); assert_eq!(c, 0, "{e}"); assert_eq!(out.lines().count(), 24); + let text = read(&strand); + assert!(text.contains(r#"{"inputs":{"elapsed_hours":0.1,"senses":{"tempo":25,"tool_fail":false},"src":"env:chat"},"n":6,"#), "{text:.600}"); + assert!(text.contains(r#""senses":{"tempo":{"src":"env:chat","v":4}},"src":"human:ana""#), "a reading keeps its own source"); + let (c, v, e) = probbit(&["live", "verify", &strand]); assert_eq!(c, 0, "{e}"); let v = parse(&v); + assert_eq!(s(&v, &["ok"]), &Json::Bool(true)); + let fin = parse(&read(&st)); let norms = s(&v, &["normals"]).as_obj().unwrap(); + assert_eq!(norms.iter().map(|(k, _)| k.as_str()).collect::>(), ["silence", "tempo", "tool_fail", "tool_latency"]); + let reads = |id: &str| day().iter().filter(|l| parse(l).get("senses").is_some_and(|x| x.get(id).is_some())).count() as f64; + for (id, n) in norms { + assert_eq!(s(n, &["mean"]), s(&fin, &["senses", "norm", id, "mean"]), "{id}"); assert_eq!(s(n, &["n"]), s(&fin, &["senses", "norm", id, "n"]), "{id}"); + assert_eq!(s(n, &["n"]).as_f64(), Some(reads(id)), "{id}: one count per reading"); + let m = s(n, &["max_move_50"]).as_f64().unwrap(); assert!(m > 0.0 && m <= 4.0, "{id}: {m}"); } + let bad = tmp("day-bad.strand"); std::fs::write(&bad, text.replacen(r#""tempo":25"#, r#""tempo":26"#, 1)).unwrap(); + let (c, v, _) = probbit(&["live", "verify", &bad]); assert_ne!(c, 0, "{v}"); assert_eq!(s(&parse(&v), &["ok"]), &Json::Bool(false)); + clean(&[&st, &strand, &bad, &ev]); +} + +/// Replay: a life split across two runs (the strand continued with the state after its last line) equals the life in one run, +/// byte for byte, strand and state +#[test] +fn a_sensed_life_split_across_runs_equals_one_run() { + let lines = day(); let all = events_file("all.jsonl", &lines); + let st1 = init(SENSED, 4, "one-state.json"); let one = tmp("one.strand"); clean(&[&one]); + let (c, out1, e) = live(SENSED, &st1, &all, &one, "5"); assert_eq!(c, 0, "{e}"); + for k in [1, 9, 17] { + let (a, b) = (events_file("a.jsonl", &lines[..k]), events_file("b.jsonl", &lines[k..])); + let st2 = init(SENSED, 4, "two-state.json"); let two = tmp("two.strand"); clean(&[&two]); + let (c, o1, e) = live(SENSED, &st2, &a, &two, "5"); assert_eq!(c, 0, "{e}"); + let (c, o2, e) = live(SENSED, &st2, &b, &two, "5"); assert_eq!(c, 0, "{e}"); + assert_eq!(read(&two), read(&one), "split at {k}: the strand"); assert_eq!(read(&st2), read(&st1), "split at {k}: the state"); + assert_eq!(format!("{o1}{o2}"), out1, "split at {k}: the stances"); + clean(&[&st2, &two, &a, &b]); + } + clean(&[&st1, &one, &all]); +} + +/// A persona without a senses block lists `senses` in `ignored`, as before, and `live` says so once on stderr, naming the first +/// event that carried it; no line without a `senses` key, and none for a persona with the block +#[test] +fn readings_sent_to_a_persona_without_the_block_are_named_once() { + let line = |i: usize| format!("probbit: live: events[{i}]: this persona has no senses block: `senses` is an undeclared input (listed in ignored), no reading is judged"); + let ev = events_file("tutor.jsonl", &[r#"{"elapsed_hours":1}"#.into(), r#"{"senses":{"tool_fail":true}}"#.into(), r#"{"senses":{"tempo":3},"error":true}"#.into()]); + let st = init(TUTOR, 2, "tutor-state.json"); let strand = tmp("tutor.strand"); clean(&[&strand]); + let (c, out, e) = live(TUTOR, &st, &ev, &strand, "0"); assert_eq!(c, 0, "{e}"); + assert_eq!(e.lines().filter(|l| l.contains("senses block")).collect::>(), [line(1).as_str()], "{e}"); + let docs: Vec = out.lines().map(parse).collect(); + assert_eq!((jw(s(&docs[0], &["ignored"])), jw(s(&docs[1], &["ignored"])), jw(s(&docs[2], &["ignored"]))), ("[]".into(), r#"["senses"]"#.into(), r#"["senses"]"#.into())); + assert!(docs.iter().all(|d| d.get("noticed").is_none() && d.get("senses").is_none()), "no new stance keys without the block"); + let quiet = events_file("tutor-quiet.jsonl", &[r#"{"elapsed_hours":1}"#.into(), r#"{"error":true}"#.into()]); + let st2 = init(TUTOR, 2, "tutor-state2.json"); let strand2 = tmp("tutor2.strand"); clean(&[&strand2]); + let (c, _, e) = live(TUTOR, &st2, &quiet, &strand2, "0"); assert_eq!(c, 0, "{e}"); assert!(!e.contains("senses block"), "{e}"); + let sev = events_file("sensed.jsonl", &day()[..3]); let st3 = init(SENSED, 2, "sensed-state3.json"); let strand3 = tmp("sensed3.strand"); clean(&[&strand3]); + let (c, _, e) = live(SENSED, &st3, &sev, &strand3, "0"); assert_eq!(c, 0, "{e}"); assert!(!e.contains("senses block"), "{e}"); + clean(&[&st, &strand, &ev, &quiet, &st2, &strand2, &sev, &st3, &strand3]); +} + +/// SplitMix64: the property tests' own seeded generator +struct Mix(u64); +impl Mix { + fn next(&mut self) -> u64 { self.0 = self.0.wrapping_add(0x9E37_79B9_7F4A_7C15); let mut z = self.0; z = (z ^ (z >> 30)).wrapping_mul(0xBF58_476D_1CE4_E5B9); z = (z ^ (z >> 27)).wrapping_mul(0x94D0_49BB_1331_11EB); z ^ (z >> 31) } + fn below(&mut self, k: usize) -> usize { (self.next() % k as u64) as usize } + fn unit(&mut self) -> f64 { (self.next() >> 11) as f64 / (1u64 << 53) as f64 } +} + +/// One random event for the sensed persona: sources (env, human, self, clock, missing, malformed), readings (declared and not, +/// in and out of range, flags that are not true/false, readings with their own source), feedback, elapsed hours (some negative) +fn random_event(r: &mut Mix) -> String { + // most events come from the instruments; the rest from a person, the individual itself, the clock, nowhere or a malformed one + const ENV: [&str; 3] = [r#""env""#, r#""env:runner""#, r#""env:host""#]; + const OTHER: [&str; 5] = [r#""human:ana""#, r#""self""#, r#""clock""#, r#""env:""#, "7"]; + let mut kv: Vec = vec![]; + match r.below(20) { k if k < 14 => kv.push(format!(r#""src":{}"#, ENV[r.below(3)])), k if k < 19 => kv.push(format!(r#""src":{}"#, OTHER[k as usize - 14])), _ => {} } + let mut rd: Vec = vec![]; + let num = |r: &mut Mix, lo: f64, hi: f64| -> String { match r.below(30) { 0 => format!("{}", lo - 1.0), 1 => format!("{}", hi + 1.0), 2 => r#""9""#.into(), _ => format!("{}", ((lo + r.unit() * (hi - lo)) * 1000.0).round() / 1000.0) } }; + if r.below(2) == 0 { rd.push(format!(r#""tool_fail":{}"#, match r.below(20) { 0 => "1", 1 => r#"{"v":true,"src":"self"}"#, 2 => r#"{"v":false,"src":"env:ci"}"#, k if k < 11 => "true", _ => "false" })); } + if r.below(2) == 0 { let v = num(r, 0.0, 30.0); rd.push(format!(r#""tool_latency":{v}"#)); } + if r.below(2) == 0 { let v = num(r, 0.0, 200.0); rd.push(if r.below(5) == 0 { format!(r#""tempo":{{"v":{v},"src":"env:chat"}}"#) } else { format!(r#""tempo":{v}"#) }); } + if r.below(3) == 0 { let v = num(r, 0.0, 40.0); rd.push(format!(r#""silence":{v}"#)); } + if r.below(25) == 0 { rd.push(r#""latency":3"#.into()); } + if !rd.is_empty() || r.below(20) == 0 { kv.push(format!(r#""senses":{{{}}}"#, rd.join(","))); } + if r.below(6) == 0 { kv.push(r#""praise":true"#.into()); } else if r.below(6) == 0 { kv.push(r#""criticism":true"#.into()); } + kv.push(format!(r#""elapsed_hours":{}"#, match r.below(40) { 0 => "-1".to_string(), 1 => "720".to_string(), _ => format!("{}", r.below(8) as f64 * 0.25) })); + format!("{{{}}}", kv.join(",")) +} + +/// P3s: a refused event changes nothing. 40 individuals x 300 random events mixing sources, readings, `self`, `clock` and +/// out-of-range values: the run with the refused events equals the run without them, byte for byte (every stance, the strand +/// with a checkpoint after each event, the final state) +#[test] +fn p3s_a_refused_event_changes_nothing() { + let (mut refused, mut accepted) = (0usize, 0usize); + for seed in 0..40u64 { + let mut r = Mix(0x5E45_E500 + seed); let evs: Vec = (0..300).map(|_| random_event(&mut r)).collect(); + let all = events_file("p3s-all.jsonl", &evs); + let st = init(SENSED, seed, "p3s-state.json"); let strand = tmp("p3s.strand"); clean(&[&strand]); + let (c, out, _) = live(SENSED, &st, &all, &strand, "1"); + let docs: Vec<&str> = out.lines().collect(); assert_eq!(docs.len(), 300, "seed {seed}: one line per event"); + let ok: Vec = (0..300).filter(|&i| !docs[i].starts_with(r#"{"error""#)).collect(); + assert_eq!(c, if ok.len() < 300 { 2 } else { 0 }, "seed {seed}"); + refused += 300 - ok.len(); accepted += ok.len(); + let kept = events_file("p3s-kept.jsonl", &ok.iter().map(|&i| evs[i].clone()).collect::>()); + let st2 = init(SENSED, seed, "p3s-state2.json"); let strand2 = tmp("p3s2.strand"); clean(&[&strand2]); + let (c, out2, e) = live(SENSED, &st2, &kept, &strand2, "1"); assert_eq!(c, 0, "seed {seed}: {e}"); + assert_eq!(out2, ok.iter().map(|&i| format!("{}\n", docs[i])).collect::(), "seed {seed}: the stances"); + assert_eq!(read(&strand2), read(&strand), "seed {seed}: the strand"); assert_eq!(read(&st2), read(&st), "seed {seed}: the state"); + clean(&[&st, &strand, &st2, &strand2, &all, &kept]); + } + eprintln!("p3s: {refused} refused, {accepted} accepted"); assert!(refused >= 1000 && accepted >= 4000, "a mix of both: {refused} refused, {accepted} accepted"); +} + +/// `probbit check` reuses the lint pipeline: on the sensed persona both habit rules are held by construction, and a sensed +/// strand replays +#[test] +fn probbit_check_holds_a_sensed_persona() { + let (c, out, e) = probbit(&["check", SENSED, "--props", SENSED_PROPS]); assert_eq!(c, 0, "{out}\n{e}"); + for id in ["no_bold_after_failure", "short_when_busy"] { + assert!(out.lines().any(|l| l.starts_with("rule ") && l.contains(id) && l.ends_with(" held_by_construction")), "{id}: {out}"); } + assert!(out.ends_with("check: held 2 · broken 0 · unproven 0 · strands 0/0\n"), "{out}"); + let ev = events_file("check.jsonl", &day()); let st = init(SENSED, 1, "check-state.json"); let strand = tmp("check.strand"); clean(&[&strand]); + let (c, _, e) = live(SENSED, &st, &ev, &strand, "8"); assert_eq!(c, 0, "{e}"); + let (c, out, e) = probbit(&["check", SENSED, "--props", SENSED_PROPS, "--seeds", "0-9", "--strand", &strand]); assert_eq!(c, 0, "{out}\n{e}"); + assert!(out.ends_with("check: held 2 · broken 0 · unproven 0 · strands 1/1\n"), "{out}"); + clean(&[&st, &strand, &ev]); +} diff --git a/probbit-cli/tests/persona.rs b/probbit-cli/tests/persona.rs index cde9f40..0020a88 100644 --- a/probbit-cli/tests/persona.rs +++ b/probbit-cli/tests/persona.rs @@ -119,6 +119,32 @@ fn stdout_matches_the_persona_goldens() { assert!(first[0] != first[1] && first[1] != first[2]); } +/// The sensed example (docs/persona.md §2.11) driven as a host drives it, as above: `init`, `compile` of turn 0, 24 `turn --state +/// FILE` calls with readings (bare and with their own source, a busy stretch, repeated tool failures, a 9 h silence, a 720 h gap, +/// feedback from a person and from CI), the state after them, `replay` of the same script, `lint` and `describe`. CI runs it on +/// Linux, macOS and Windows: the same bytes on each. +#[test] +fn stdout_matches_the_sensed_golden() { + let p = ex("sensed.yaml"); let g = |f: &str| read(&ex(&format!("golden/sensed/{f}"))); + let script = parse(&g("day.json")); let turns = script.as_arr().unwrap(); assert_eq!(turns.len(), 24); + let (c, s0, e) = probbit(&["persona", "init", &p], ""); assert_eq!(c, 0, "{e}"); assert_eq!(s0, g("state0.json"), "state0"); + let st = tmp("sensed-state.json"); std::fs::write(&st, &s0).unwrap(); + let (c, prog, e) = probbit(&["persona", "compile", &p, "--state", &st, "--inputs", &jw(&turns[0])], ""); assert_eq!(c, 0, "{e}"); + assert_eq!(prog, g("program-turn0.json"), "program of turn 0"); + let gold = g("day.jsonl"); let lines: Vec<&str> = gold.lines().collect(); assert_eq!(lines.len(), 24); + for (i, t) in turns.iter().enumerate() { + let (c, out, e) = probbit(&["persona", "turn", &p, "--state", &st, "--inputs", &jw(t)], ""); assert_eq!(c, 0, "{e}"); + assert_eq!(out.trim_end(), lines[i], "sensed turn {i}"); } + assert_eq!(read(&st), g("final-state.json"), "final state"); + let (c, rep, e) = probbit(&["persona", "replay", &p, "--script", &ex("golden/sensed/day.json")], ""); assert_eq!(c, 0, "{e}"); assert_eq!(rep, gold, "replay"); + let (c, lint, e) = probbit(&["persona", "lint", &p], ""); assert_eq!(c, 0, "{e}"); assert_eq!(lint, g("lint.json"), "lint"); + let (c, d, e) = probbit(&["persona", "describe", &p], ""); assert_eq!(c, 0, "{e}"); assert_eq!(d, g("describe.json"), "describe"); + // the past is named: the normal clause on the turns with readings, the learned clause once feedback moved a weight + assert!(lines[2].contains(r#""noticed":"tool_fail""#) && lines[2].contains("tool failures far above its normal (z +4.0 over 2 readings)"), "{}", lines[2]); + assert!(lines[13].contains("learned: caution -0.17 on careful (1 reward, 2 corrections)"), "{}", lines[13]); + let _ = std::fs::remove_file(&st); +} + /// `probbit persona --help` documents every subcommand and the exit codes; bad flags and subcommands exit 2. #[test] fn persona_help_and_flags() { diff --git a/python/test_mcp.py b/python/test_mcp.py index 9f36930..9bc9008 100644 --- a/python/test_mcp.py +++ b/python/test_mcp.py @@ -203,6 +203,23 @@ def test_persona_tools_answer_exactly_as_the_cli(self): e = self.call("probbit_persona_turn", args) self.assertTrue(e["isError"]); self.assertEqual(e["structuredContent"]["error"]["path"], where) + def test_readings_never_come_through_the_agents_channel(self): + # senses (docs/persona.md 2.11, S7): both turn tools refuse an event that carries readings for a persona with a senses + # block; the same event without readings is answered; a persona without the block lists `senses` in ignored, as before + self.legacy("2025-11-25") + path = os.path.join(EX, "persona", "sensed.yaml") + state = self.call("probbit_persona_init", {"persona_path": path, "seed": 3})["structuredContent"] + for tool, key in (("probbit_persona_turn", "inputs"), ("probbit_live_event", "event")): + args = {"persona_path": path, "state": state, key: {"senses": {"tool_fail": True}, "src": "env:runner"}} + e = self.call(tool, args) + self.assertTrue(e["isError"]); self.assertEqual(e["structuredContent"]["error"]["path"], "arguments.%s.senses" % key) + ok = self.call(tool, dict(args, **{key: {"praise": True, "src": "human:ana"}})) + self.assertFalse(ok["isError"]) + tutor = os.path.join(EX, "persona", "tutor.yaml") + t0 = self.call("probbit_persona_init", {"persona_path": tutor, "seed": 3})["structuredContent"] + r = self.call("probbit_persona_turn", {"persona_path": tutor, "state": t0, "inputs": {"senses": {"tool_fail": True}}}) + self.assertFalse(r["isError"]); self.assertEqual(r["structuredContent"]["stance"]["ignored"], ["senses"]) + def test_persona_fuzz_answers_exactly_as_the_cli(self): self.legacy("2025-11-25") tutor = os.path.join(EX, "..", "probbit-cli", "tests", "fixtures", "persona", "tutor-0.5.0.yaml") From 72fef111d9072ff695a561972b74b4081b893e4b Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 06:51:59 -0700 Subject: [PATCH 09/14] monitor: a row per sense, the moved-normal alert, the inputs panel named inputs Per declared sense: its normal as a tick over the range, this event's reading, z and n; an alert when a normal moved over drift_cap / 2 within 50 events (terminal board and page). The panel of the event's inputs was labelled SENSES; it is now INPUTS, so it does not collide with the senses block (the two pinned frames change by that label only). --- probbit-cli/src/monitor.html | 6 ++ probbit-cli/src/monitor.rs | 70 ++++++++++++++++--- .../fixtures/monitor/tutor-week-18.once.txt | 2 +- .../fixtures/monitor/tutor-week.once.txt | 2 +- probbit-cli/tests/monitor.rs | 17 +++++ 5 files changed, 87 insertions(+), 10 deletions(-) diff --git a/probbit-cli/src/monitor.html b/probbit-cli/src/monitor.html index 20a4427..29eb648 100644 --- a/probbit-cli/src/monitor.html +++ b/probbit-cli/src/monitor.html @@ -170,6 +170,12 @@ const d=f.doc,inputs=$('input-facts');inputs.replaceChildren(); for(const [k,v] of Object.entries(obj(d.inputs)||{}))fact(inputs,k,typeof v==='object'?JSON.stringify(v):String(v)); const h=get(f.given,'elapsed_hours');fact(inputs,'Raw clock',num(h)?hours(h)+' since previous event':'Not captured in this frame'); + for(const x of M?.senses||[]){const r=obj(get(d.senses,x.id)),nm=(f.normals||[]).find(v=>v.id===x.id)||{},mean=r?r.mean:nm.mean,n=r?r.n:nm.n; + const sc=v=>x.scale==='log1p'?Math.log1p(v):v,cell=v=>Math.round(Math.max(0,Math.min(1,(v-x.lo)/((x.hi-x.lo)||1)))*11); + const at=r?(typeof r.raw==='boolean'?(r.raw?1:0):sc(r.raw)):null,t=num(mean)?cell(mean):-1,c=at===null?-1:cell(at); + const bar=Array.from({length:12},(_,i)=>i===c?'●':i===t?'┃':'─').join(''),norm=x.kind==='flag'?'rate '+f2(mean):(x.scale==='log1p'?f2(Math.expm1(mean)):f2(mean))+' '+x.unit; + fact(inputs,'Sense · '+(x.say||x.id),bar+' '+(r?'read '+JSON.stringify(r.raw)+' · z '+(r.z<0?'−':'+')+Math.abs(r.z).toFixed(1):'not read')+' · normal '+norm+' over '+(num(n)?n:0)+' readings'); + if(num(nm.moved)&&nm.moved>x.drift_cap/2)fact(inputs,'⚠ Normal moved',(x.say||x.id)+': '+nm.moved+' within 50 events (over drift_cap / 2 = '+(x.drift_cap/2)+')');} const habits=$('habit-list');habits.replaceChildren();const hb=d.habits||{},active=hb.active||[],bound=hb.bound||[]; for(const name of active)mk('span','chip'+(bound.includes(name)?' on':''),habits,name+(bound.includes(name)?' · bound':'')); if(!active.length)mk('span','chip',habits,'No rules in force');mk('span','chip',habits,'Violations: '+(num(hb.violations)?hb.violations:'unreported')); diff --git a/probbit-cli/src/monitor.rs b/probbit-cli/src/monitor.rs index 83b01d3..1c34877 100644 --- a/probbit-cli/src/monitor.rs +++ b/probbit-cli/src/monitor.rs @@ -2,8 +2,10 @@ //! replays the strand with `live::Replay`, the rules `probbit live verify` uses, so it recomputes every stance document from //! the strand alone (no other log, any strand, any machine) and says whether the replay checks. It draws the latest event: the //! stance (each trait's levels as segments with their exact odds, the level taken highlighted, the phrase it says), the moods -//! with a sparkline of the last 50 events, the senses (the event's inputs and the history features), the habits in force and -//! the ones that bound, the learned deltas, the drives when the documents carry them (feature-detected), and the stance line. +//! with a sparkline of the last 50 events, the inputs (the event's inputs and the history features), the senses when the +//! persona declares them (§2.11: per sense its normal as a tick over the range, the reading, z and n, and an alert when a +//! normal moved over drift_cap / 2 within 50 events), the habits in force and the ones that bound, the learned deltas, the +//! drives when the documents carry them (feature-detected), and the stance line. //! `--serve` draws the same in a browser: one page embedded in the binary, fed by server-sent events from a server on //! 127.0.0.1. It changes no file (the demo's week goes through a temporary one, removed at once) and sends nothing anywhere. use crate::json::{self, Json}; @@ -45,9 +47,15 @@ fn strs(j: Option<&Json>) -> Vec { j.and_then(Json::as_arr).map(|a| a.it struct Var { id: String, levels: Vec, say: Vec } /// A declared input: its id, kind (flag | level | number) and, for a number, its max struct Input { id: String, kind: String, max: f64 } +/// A declared sense (§2.11), in declared order: its range on the scale its normal is kept on (a flag's is [0, 1]) +struct SenseRow { id: String, say: String, unit: String, flag: bool, log1p: bool, lo: f64, hi: f64, drift_cap: f64 } +impl SenseRow { + /// A reading or a range end on the normal's scale + fn scaled(&self, x: f64) -> f64 { if self.log1p { x.ln_1p() } else { x } } +} /// What the layout reads from the strand's header struct Meta { name: String, version: String, seed: u64, individual: String, engine: String, traits: Vec, moods: Vec, inputs: Vec, - history: Vec<(String, f64)>, learning: Option<(Vec, f64)>, caps: (f64, f64, f64), goals: Vec } + history: Vec<(String, f64)>, learning: Option<(Vec, f64)>, caps: (f64, f64, f64), goals: Vec, senses: Vec } impl Meta { fn of(r: &Replay) -> Meta { let d = persona::describe(&r.live.p); @@ -65,7 +73,14 @@ impl Meta { learning: d.get("learning").map(|l| (strs(l.get("traits")), l.get("total_cap").and_then(Json::as_f64).unwrap_or(1.0))), caps: (cap("wanting", "cap", 3.0), cap("afterglow", "cap", 2.0), cap("expectation", "pe_cap", 1.0)), // a drives block's goals, in the order of the levels of `pursue` (describe hides that trait; its learned row needs them) - goals: strs(d.get("drives").and_then(|x| x.get("goals"))) } + goals: strs(d.get("drives").and_then(|x| x.get("goals"))), + senses: persona::normals(&r.live.p, &r.live.st).into_iter().map(|(id, _, _, drift_cap)| { + let x = d.get("senses").and_then(|o| o.get(&id)); let f = |k: &str| x.and_then(|x| x.get(k)); + let range = f("range").and_then(Json::as_arr).map(|a| (a[0].as_f64().unwrap_or(0.0), a[1].as_f64().unwrap_or(1.0))); + let txt = |k: &str| f(k).and_then(Json::as_str).unwrap_or("").to_string(); + let (flag, log1p) = (txt("kind") == "flag", txt("scale") == "log1p"); + let (lo, hi) = range.unwrap_or((0.0, 1.0)); let sc = |v: f64| if log1p { v.ln_1p() } else { v }; + SenseRow { say: txt("say"), unit: txt("unit"), flag, log1p, lo: sc(lo), hi: sc(hi), drift_cap, id } }).collect() } } } @@ -150,6 +165,13 @@ fn nbar(s: &Style, v: f64, max: f64, hue: Col) -> String { let k = ((v / max.max(1e-12)).clamp(0.0, 1.0) * NBAR as f64).round() as usize; format!("{}{}{}{}", s.paint(DIM, s.g("▕", "[")), s.paint(hue, &s.g("█", "#").repeat(k)), s.paint(DIM, &s.g("░", ".").repeat(NBAR - k)), s.paint(DIM, s.g("▏", "]"))) } +/// A sense's range as `NBAR` cells with its normal as a tick and this event's reading as a dot (both on the normal's scale) +fn tick(s: &Style, lo: f64, hi: f64, mean: f64, at: Option) -> String { + let cell = |v: f64| (((v - lo) / (hi - lo).max(1e-12)).clamp(0.0, 1.0) * (NBAR - 1) as f64).round() as usize; + let (t, r) = (cell(mean), at.map(cell)); + let cells: String = (0..NBAR).map(|i| if Some(i) == r { s.bold(CYAN, s.g("●", "o")) } else if i == t { s.bold(AMBER, s.g("┃", "|")) } else { s.paint(DIM, s.g("─", "-")) }).collect(); + format!("{}{cells}{}", s.paint(DIM, s.g("▕", "[")), s.paint(DIM, s.g("▏", "]"))) +} /// A centred bar for a signed value within ±cap: `h` cells each side of the centre mark fn centred(s: &Style, v: f64, cap: f64, h: usize) -> String { let k = ((v.abs() / cap.max(1e-12)).clamp(0.0, 1.0) * h as f64).round() as usize; @@ -233,7 +255,7 @@ fn frame(w: Option<&Watch>, bad_head: Option<&(usize, String)>, path: &str, note let pick = v.levels.iter().position(|l| l == level); out.push(format!("{}{:, bad_head: Option<&(usize, String)>, path: &str, note (_, v) => { let l = v.and_then(Json::as_str).unwrap_or(""); chips.push(format!("{} {}", s.paint(GREY, &x.id), s.bold(CYAN, l))); } } } if let Some(g) = val("goals").filter(|g| !g.is_null()) { chips.push(format!("{} {}", s.paint(GREY, "goals"), persona::canon(g))); } - out.push(format!("{}{}", lab("SENSES"), chips.join(" "))); + out.push(format!("{}{}", lab("INPUTS"), chips.join(" "))); if let Some(h) = f.given.get("elapsed_hours").and_then(Json::as_f64) { nums.push(format!("clock {}", hours(h))); } if !nums.is_empty() { out.push(format!("{}{}", lab(""), nums.join(" "))); } let hist: Vec = m.history.iter().map(|(id, cap)| { let n = val(id).and_then(Json::as_f64).unwrap_or(0.0); format!("{id} {}/{}", whole(n), whole(*cap)) }).collect(); if !hist.is_empty() { out.push(format!("{}{} {}", lab(""), s.paint(GREY, "history"), hist.join(" "))); } if let Some(ig) = doc.get("ignored").and_then(Json::as_arr).filter(|a| !a.is_empty()) { out.push(format!("{}{} {}", lab(""), s.paint(GREY, "ignored"), strs(Some(&Json::Arr(ig.to_vec()))).join(" "))); } + // 3b. the senses (§2.11): per sense the normal as a tick over the range, this event's reading, z and n (the normal it was + // judged against); a sense not read keeps its normal; an alert when a normal moved over drift_cap / 2 within 50 events + let now = persona::normals(&w.rep.live.p, &w.rep.live.st); + let sw = m.senses.iter().map(|x| x.id.chars().count()).max().unwrap_or(4).clamp(4, 14); + for (k, x) in m.senses.iter().enumerate() { + let read = doc.get("senses").and_then(|r| r.get(&x.id)); + let g = |key: &str| read.and_then(|r| r.get(key)).and_then(Json::as_f64); + let (mean, n) = match read { Some(_) => (g("mean").unwrap_or(0.0), g("n").unwrap_or(0.0)), None => now.get(k).map_or((0.0, 0.0), |v| (v.1, v.2 as f64)) }; + let raw = read.and_then(|r| r.get("raw")); + let at = raw.and_then(|v| match v { Json::Bool(b) => Some(if *b { 1.0 } else { 0.0 }), _ => v.as_f64() }).map(|v| x.scaled(v)); + let norm = if x.flag { format!("normal rate {mean:.2}") } else if x.log1p { format!("normal {:.2} {}", mean.exp_m1(), x.unit) } else { format!("normal {mean:.2} {}", x.unit) }; + let what = match (raw, g("z")) { + (Some(v), Some(z)) => s.bold(CYAN, &format!("read {} z {z:+.1}", persona::canon(v))), + _ => s.paint(GREY, "not read"), + }; + out.push(format!("{}{: x.drift_cap / 2.0) { + let say = if x.say.is_empty() { x.id.replace('_', " ") } else { x.say.clone() }; + out.push(format!("{}{}", lab(""), s.bold(RED, &format!("{} {say}: the normal moved {mv} within 50 events (over drift_cap / 2 = {})", s.g("⚠", "!"), persona::r6(x.drift_cap / 2.0))))); } + } // 4. the habits: in force, the ones that bound highlighted, the violations counter (0 by construction) let hb = doc.get("habits"); let list = |k: &str| strs(hb.and_then(|h| h.get(k))); @@ -340,6 +382,11 @@ fn meta_json(w: Option<&Watch>, path: &str) -> Json { ("history", Json::Arr(m.history.iter().map(|(id, cap)| o(vec![("id", s(id)), ("cap", Json::Num(*cap))])).collect())), ("learning", m.learning.as_ref().map_or(Json::Null, |(t, cap)| o(vec![("traits", strs(t)), ("total_cap", Json::Num(*cap))]))), ("caps", o(vec![("wanting", Json::Num(m.caps.0)), ("afterglow", Json::Num(m.caps.1)), ("prediction_error", Json::Num(m.caps.2))])), ("goals", strs(&m.goals))]); + // the senses (§2.11), only when the persona declares them: their range on the normal's scale and the alert's cap + if !m.senses.is_empty() { + kv.push(("senses", Json::Arr(m.senses.iter().map(|x| o(vec![("id", s(&x.id)), ("say", s(&x.say)), ("unit", s(&x.unit)), ("kind", s(if x.flag { "flag" } else { "number" })), + ("scale", s(if x.log1p { "log1p" } else { "linear" })), ("lo", json::num(persona::r6(x.lo))), ("hi", json::num(persona::r6(x.hi))), ("drift_cap", Json::Num(x.drift_cap))])).collect()))); + } } o(kv) } @@ -350,10 +397,17 @@ fn frame_json(w: Option<&Watch>, bad_head: Option<&(usize, String)>, note: Optio let bad = bad_head.or_else(|| w.and_then(|w| w.bad.as_ref())); let spark = w.map_or(Json::Obj(vec![]), |w| Json::Obj(w.meta.moods.iter().zip(&w.spark).map(|(m, xs)| (m.id.clone(), Json::Arr(xs.iter().map(|x| Json::Num(persona::r6(*x))).collect()))).collect())); let of = |g: fn(&Frame) -> &Json| f.map_or(Json::Null, |f| g(f).clone()); - json::obj(vec![("n", Json::Num(f.map_or(0, |f| f.n) as f64)), ("doc", of(|f| &f.doc)), ("given", of(|f| &f.given)), ("learned", of(|f| &f.learned)), ("spark", spark), + let mut kv = vec![("n", Json::Num(f.map_or(0, |f| f.n) as f64)), ("doc", of(|f| &f.doc)), ("given", of(|f| &f.given)), ("learned", of(|f| &f.learned)), ("spark", spark), ("diverges", bad.map_or(Json::Null, |(l, why)| json::obj(vec![("line", Json::Num(*l as f64)), ("why", json::str(why))]))), ("note", note.map_or(Json::Null, json::str)), ("from_checkpoint", w.and_then(|w| w.rep.from).map_or(Json::Null, |n| json::num(n as f64))), - ("status", w.map_or(Json::Null, |w| json::str(w.rep.live.status.name())))]) + ("status", w.map_or(Json::Null, |w| json::str(w.rep.live.status.name())))]; + // the senses' normals now (§2.11), only when the persona declares them: mean, count and the largest move within 50 events + if let Some(w) = w.filter(|w| !w.meta.senses.is_empty()) { + let moved = &w.rep.normals().moved; + kv.push(("normals", Json::Arr(persona::normals(&w.rep.live.p, &w.rep.live.st).iter().enumerate().map(|(k, (id, mean, n, _))| json::obj(vec![("id", json::str(id)), + ("mean", json::num(*mean)), ("n", json::num(*n as f64)), ("moved", json::num(moved.get(k).copied().unwrap_or(0.0)))])).collect()))); + } + json::obj(kv) } /// A strand file read as it grows: whole lines (a line counts once its newline is written). It starts over when the diff --git a/probbit-cli/tests/fixtures/monitor/tutor-week-18.once.txt b/probbit-cli/tests/fixtures/monitor/tutor-week-18.once.txt index ea72ddc..a17a11a 100644 --- a/probbit-cli/tests/fixtures/monitor/tutor-week-18.once.txt +++ b/probbit-cli/tests/fixtures/monitor/tutor-week-18.once.txt @@ -13,7 +13,7 @@ STANCE warmth --################## cool 0.00 neutral 0.08 [warm 0.92] emoji ======############## none 0.30 [sparse 0.70] rich 0.00 one emoji at most MOODS valence =======##########=== down 0.35 [even 0.52] up 0.13 =-++***.=+-=+-++*- arousal =====########======= calm 0.25 [steady 0.39] keyed 0.36 ================== -SENSES sentiment neutral ( ) confused ( ) error (x) loss (x) praise ( ) criticism ( ) claim_done +INPUTS sentiment neutral ( ) confused ( ) error (x) loss (x) praise ( ) criticism ( ) claim_done stakes [........] 0.00 time_pressure [........] 0.00 clock +1.00 h history errors_in_row 0/3 confused_recently 0/3 HABITS [no_jokes_on_loss] flourish_budget no_formal_emoji check_last | violations 0 diff --git a/probbit-cli/tests/fixtures/monitor/tutor-week.once.txt b/probbit-cli/tests/fixtures/monitor/tutor-week.once.txt index 5cf7b02..45ba09f 100644 --- a/probbit-cli/tests/fixtures/monitor/tutor-week.once.txt +++ b/probbit-cli/tests/fixtures/monitor/tutor-week.once.txt @@ -13,7 +13,7 @@ STANCE warmth ----################ cool 0.02 neutral 0.18 [warm 0.80] emoji =-------############ none 0.06 sparse 0.35 [rich 0.59] emoji welcome MOODS valence ==---------######### down 0.11 even 0.46 [up 0.44] =-++***.=+-=+-++*-+*-+**-+*-+**-+*-+**-+*-+**-+*-+ arousal =====########======= calm 0.25 [steady 0.39] keyed 0.36 ================================================== -SENSES sentiment neutral ( ) confused ( ) error ( ) loss ( ) praise ( ) criticism ( ) claim_done +INPUTS sentiment neutral ( ) confused ( ) error ( ) loss ( ) praise ( ) criticism ( ) claim_done stakes [........] 0.00 time_pressure [........] 0.00 clock +1.00 h history errors_in_row 0/3 confused_recently 0/3 HABITS flourish_budget no_formal_emoji check_last | violations 0 diff --git a/probbit-cli/tests/monitor.rs b/probbit-cli/tests/monitor.rs index 9cc875f..ae1d139 100644 --- a/probbit-cli/tests/monitor.rs +++ b/probbit-cli/tests/monitor.rs @@ -30,6 +30,23 @@ fn monitor_has_help() { let (c, out, _) = probbit(&["--help"]); assert_eq!(c, 0); assert!(out.contains("\n monitor STRAND "), "the usage lists monitor"); } +/// docs/persona.md §2.11: one row per declared sense (the normal as a tick over the range, the reading, z, n) under SENSES, the +/// event's inputs under INPUTS, and an alert when a normal moved over drift_cap / 2 within 50 events: a harsh room moves the +/// failure rate's normal from 0.05 to 0.26 +#[test] +fn senses_rows_and_the_moved_normal_alert() { + let f = tmp("sensed"); let _ = std::fs::remove_file(&f); let _ = std::fs::remove_file(format!("{f}.lock")); + let (c, _, err) = probbit(&["live", "../examples/persona/sensed.yaml", "--seed", "0", "--clock", "fixed", "--events", "../bench/individuality/fixtures/lives/room-b.jsonl", "--strand", &f]); + assert_eq!(c, 0, "{err}"); + let (c, out, err) = probbit(&["monitor", &f, "--once", "--plain"]); assert_eq!(c, 0, "{err}"); assert!(out.is_ascii(), "{out}"); + let (i, k) = (out.lines().position(|l| l.starts_with("INPUTS ")).expect(&out), out.lines().position(|l| l.starts_with("SENSES ")).expect(&out)); assert!(i < k, "{out}"); + let rows: Vec<&str> = out.lines().skip(k).collect(); + assert!(rows[0].starts_with("SENSES tool_fail [") && rows[0].ends_with("read false z -0.6 normal rate 0.26 over 59 readings"), "{out}"); + assert_eq!(rows[1].trim_start(), "! tool failures: the normal moved 0.173294 within 50 events (over drift_cap / 2 = 0.125)", "{out}"); + for id in ["tool_latency", "tempo", "silence"] { assert!(rows.iter().any(|l| l.trim_start().starts_with(id) && l.contains(" z ")), "{id}: {out}"); } + let _ = std::fs::remove_file(&f); let _ = std::fs::remove_file(format!("{f}.lock")); +} + /// --once --plain: one frame in plain ASCII, byte for byte; the last event of the week and a failure turn (event 18: loss and /// praise lit, the bound habit in brackets, humour held at none) #[test] From 6191b8346bf0fd599c1ddc3e6b23eddeb3eab1fd Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 06:55:47 -0700 Subject: [PATCH 10/14] bench/individuality: run.py with metrics a, b, d and e twins.py (a: 40 individuals x rooms A and B, 20 probes each), habituation.py (b: the engine against an independent implementation of the sense step, surprise, genes, and the named past rendered from each document), replay.py (d: third and split copies byte for byte, live verify, the P0 strand), habits.py (e: every stance against the habits). run.py checks fixtures/MANIFEST first and exits 0 only when every gated bar passes. --- bench/individuality/.gitignore | 2 + bench/individuality/habits.py | 64 +++++++++ bench/individuality/habituation.py | 212 +++++++++++++++++++++++++++++ bench/individuality/replay.py | 59 ++++++++ bench/individuality/run.py | 113 +++++++++++++++ bench/individuality/twins.py | 104 ++++++++++++++ 6 files changed, 554 insertions(+) create mode 100644 bench/individuality/.gitignore create mode 100644 bench/individuality/habits.py create mode 100644 bench/individuality/habituation.py create mode 100644 bench/individuality/replay.py create mode 100644 bench/individuality/run.py create mode 100644 bench/individuality/twins.py diff --git a/bench/individuality/.gitignore b/bench/individuality/.gitignore new file mode 100644 index 0000000..923518a --- /dev/null +++ b/bench/individuality/.gitignore @@ -0,0 +1,2 @@ +result.json +__pycache__/ diff --git a/bench/individuality/habits.py b/bench/individuality/habits.py new file mode 100644 index 0000000..83a51c4 --- /dev/null +++ b/bench/individuality/habits.py @@ -0,0 +1,64 @@ +"""Metric e: zero habit breaks (Python 3.9, standard library only; post-processing only). + +Every stance of metrics a, b and d is checked twice: the engine's own counter (`habits.violations`) and an independent check +here: each habit's `when` evaluated on the logged inputs, with `sense..raw` and `.z` read from the stance's `senses`, +against the released levels. A zero is not vacuous: the stances where a habit bound (`habits.bound`) are counted. +""" +import json +import os + +import common + +# the habits of fixtures/sensed.yaml (and of its no-genes copy), as data +HABITS = [ + {"id": "no_bold_after_failure", "when": {"sense.tool_fail.raw": True}, "then": ("caution", "not", ["bold"])}, + {"id": "short_when_busy", "when": {"sense.tempo.raw": {"at_least": 20}}, "then": ("verbosity", "at_most", "short")}, +] +LEVELS = {"caution": ["bold", "measured", "careful"], "verbosity": ["terse", "short", "full"]} + + +def value(doc, key): + if key.startswith("sense."): + _, sid, field = key.split(".") + r = doc.get("senses", {}).get(sid) + return None if r is None else r[field] + return doc.get("inputs", {}).get(key) + + +def holds(cond, v): + if v is None: + return False # a condition on a sense not read this event is false + if isinstance(cond, dict): + return all((k == "at_least" and v >= x) or (k == "at_most" and v <= x) for k, x in cond.items()) + return v == cond + + +def broken(doc, habit): + if not all(holds(c, value(doc, k)) for k, c in habit["when"].items()): + return False + trait, op, arg = habit["then"] + st = doc["stance"].get(trait) + if not st or not st.get("released"): + return False + lv = LEVELS[trait] + level = st["level"] + if op == "not": + return level in arg + return lv.index(level) > lv.index(arg) + + +def metric(stances, bars): + stances = [d for d in stances if d and "stance" in d] + viol = sum(1 for d in stances if d["habits"]["violations"] > 0) + breaks = sum(1 for d in stances for h in HABITS if broken(d, h)) + bound = sum(1 for d in stances if d["habits"]["bound"]) + active = sum(1 for d in stances if d["habits"]["active"]) + r = {"scope": "every stance of metrics a, b and d", "stances": len(stances), "violations": viol, "breaks": breaks, + "bound": bound, "in_force": active} + r["pass"] = {"e": viol <= bars["e"]["violations_max"] and breaks <= bars["e"]["breaks_max"] and bound >= bars["e"]["bound_min"]} + return r + + +if __name__ == "__main__": + print(json.dumps(HABITS)) + print(os.path.basename(common.FIXTURES)) diff --git a/bench/individuality/habituation.py b/bench/individuality/habituation.py new file mode 100644 index 0000000..4a4db8d --- /dev/null +++ b/bench/individuality/habituation.py @@ -0,0 +1,212 @@ +"""Metric b: habituation and the named past (Python 3.9, standard library only). + +b1, b2 run on the copy with every sense gene spread at 0 and check the engine against an independent implementation of the +sense step below (RFC 0001 section A.3, every line rounded to 6 decimals). b3 runs on the persona with genes. b4 and b5 read +metric a's probe documents: a past clause in `why` is checked against its template rendered here from the document. +""" +import json +import math +import os +import shutil +import tempfile + +import common +from fixtures import lives + +NOGENES = os.path.join(common.FIXTURES, "sensed-nogenes.yaml") +GENES = os.path.join(common.FIXTURES, "sensed.yaml") +B3_SEEDS = list(range(100)) +r6 = common.r6 + + +def declared(persona): + """Per sense (in declared order): the describe document's fields.""" + code, out, err = common.run(["persona", "describe", persona]) + if code: + raise common.SetupError("describe: " + err) + d = json.loads(out) + order = [line.split("id:")[1].strip() for line in open(persona, encoding="utf-8") + if line.strip().startswith("- id:") and line.split("id:")[1].strip() in d.get("senses", {})] + return d, [(i, d["senses"][i]) for i in order] + + +def clip(x, lo, hi): + return max(lo, min(hi, x)) + + +def step(s, norm, reading, genes): + """RFC 0001 A.3 for one reading of sense `s` against `norm` {mean, var, n}: (z, zd, the normal after).""" + g_gain, g_thr, g_hab = genes + x = (1.0 if reading else 0.0) if s["kind"] == "flag" else (r6(math.log1p(reading)) if s["scale"] == "log1p" else reading) + h = r6(clip(s["half_life_events"] * g_hab, 1, 10000)) + a = r6(1 - 0.5 ** (1 / h)) + z = r6(clip((x - norm["mean"]) / math.sqrt(norm["var"] + s["var_floor"]), -s["zcap"], s["zcap"])) + d = r6(clip(s["dead_zone"] + g_thr, 0, s["zcap"] - 0.000001)) + zd = r6(math.copysign(max(abs(z) - d, 0.0), z)) if z else 0.0 + pm, dc = s["prior"]["mean"], s["drift_cap"] + mean = r6(clip(norm["mean"] + a * (x - norm["mean"]), pm - dc, pm + dc)) + var = r6(clip((1 - a) * (norm["var"] + a * (x - norm["mean"]) ** 2), 0, s["var_cap"])) + return z, zd, {"mean": mean, "var": var, "n": min(norm["n"] + 1, 1000000)} + + +def reading_of(v): + return v["v"] if isinstance(v, dict) else v + + +def check_life(persona, seed, events): + """Run a life with a checkpoint after every event; compare every reading's z, zd, judged mean and n, and the normal after + it, with step(). Returns (stances, values compared, values that differ).""" + d, senses = declared(persona) + tmp = os.path.join(tempfile.mkdtemp(prefix="pbit-hab-"), "life") + try: + st, strand = tmp + ".state.json", tmp + ".strand" + common.init(persona, seed, st) + code, docs, err = common.live(persona, events, state=st, strand=strand, checkpoint_every=1) + if code: + raise common.SetupError("live: " + err.strip()[-300:]) + states = [json.loads(line)["state"] for line in open(strand, encoding="utf-8") if line.startswith('{"checkpoint"')] + finally: + shutil.rmtree(os.path.dirname(tmp), ignore_errors=True) + norm = {i: {"mean": s["prior"]["mean"], "var": s["prior"]["var"], "n": 0} for i, s in senses} + compared = differ = 0 + for ev, doc, state in zip(events, docs, states): + genes = state.get("senses", {}).get("genes", {}) + g = lambda k, i, dflt: genes.get(k, {}).get(i, dflt) # noqa: E731 + for i, s in senses: + if i not in ev.get("senses", {}): + continue + z, zd, after = step(s, norm[i], reading_of(ev["senses"][i]), (g("gain", i, 1), g("threshold", i, 0), g("habituation", i, 1))) + got = doc["senses"][i] + pairs = [(z, got["z"]), (zd, got["zd"]), (norm[i]["mean"], got["mean"]), (norm[i]["n"], got["n"])] + pairs += [(after[k], state["senses"]["norm"][i][k]) for k in ("mean", "var", "n")] + compared += len(pairs) + differ += sum(1 for want, have in pairs if abs(want - have) > 5e-7) + norm[i] = after + return docs, compared, differ + + +def zd_series(persona, seed, events, sink): + code, docs, err = common.live(persona, events, seed=seed) + if code: + raise common.SetupError("live: " + err.strip()[-300:]) + sink.extend(docs) + return [doc["senses"]["tool_fail"] for doc in docs] + + +# ------------------------------------------------------------------------------------------------- the named past (b4, b5) +def plural(n, one): + return "%d %s%s" % (n, one, "" if n == 1 else "s") + + +def z1(z): + return "%+.1f" % z + + +def normal_clause(doc, senses, genes): + """The RFC A.5 normal clause rendered from the document's `senses`: (sense id, text) or None.""" + read = [(i, s) for i, s in senses if i in doc.get("senses", {})] + gain = lambda i: genes.get("gain", {}).get(i, 1) # noqa: E731 + best = None + for i, s in read: + push = abs(gain(i) * doc["senses"][i]["zd"]) + if push > 0 and (best is None or push > best[0]): + best = (push, i, s) + say = lambda i, s: s.get("say") or i.replace("_", " ") # noqa: E731 + if best: + _, i, s = best + r = doc["senses"][i] + side = ("far " if abs(r["z"]) >= 2 else "") + ("above" if r["z"] > 0 else "below") + return i, "%s %s its normal (z %s over %s)" % (say(i, s), side, z1(r["z"]), plural(r["n"], "reading")) + best = None + for i, s in read: + r = doc["senses"][i] + raw = r["raw"] + x = (1.0 if raw else 0.0) if s["kind"] == "flag" else (r6(math.log1p(raw)) if s["scale"] == "log1p" else raw) + z0 = r6(clip((x - s["prior"]["mean"]) / math.sqrt(s["prior"]["var"] + s["var_floor"]), -s["zcap"], s["zcap"])) + gap = abs(z0) - abs(r["z"]) + if gap >= 1 and (best is None or gap > best[0]): + best = (gap, i, s, z0) + if best: + _, i, s, z0 = best + r = doc["senses"][i] + return i, "%s usual for it now (z %s over %s, %s against its prior)" % (say(i, s), z1(r["z"]), plural(r["n"], "reading"), z1(z0)) + return None + + +def learned_clause(doc, state, d): + """The RFC A.5 learned clause rendered from the state's `learned` and `learned_from`: (trait, Δ, text) or None.""" + best = None + for t, deltas in sorted((state.get("learned") or {}).items()): + st = doc["stance"].get(t) + if not st or not st.get("released"): + continue + k = d["traits"][t]["levels"].index(st["level"]) + if abs(deltas[k]) >= 0.05 and (best is None or abs(deltas[k]) > abs(best[1])): + best = (t, deltas[k], st["level"]) + if not best: + return None + t, delta, level = best + lf = state["learned_from"][t] + return t, delta, "learned: %s %+.2f on %s (%s, %s)" % (t, delta, level, plural(lf["rewards"], "reward"), plural(lf["corrections"], "correction")) + + +def named_past(lv): + """b4 and b5 over metric a's divergent probes.""" + d, senses = declared(GENES) + decisions = backed = probes = cited_differ = 0 + for s in sorted({k[0] for k in lv}): + a, b = lv[(s, "A")], lv[(s, "B")] + sa, sb = (json.load(open(x["state"], encoding="utf-8")) for x in (a, b)) + for pa, pb in zip(a["probes"], b["probes"]): + if pa["stance"]["caution"]["level"] == pb["stance"]["caution"]["level"]: + continue + probes += 1 + cited = [] + for doc, state in ((pa, sa), (pb, sb)): + decisions += 1 + nc = normal_clause(doc, senses, state.get("senses", {}).get("genes", {})) + lc = learned_clause(doc, state, d) + why = doc.get("why", "") + ok_n = nc is not None and doc.get("noticed") == nc[0] and nc[1] in why + ok_l = lc is not None and lc[2] in why + backed += 1 if (ok_n or ok_l) else 0 + r = doc["senses"].get(nc[0]) if nc else None + cited.append(((nc[0], r["z"], r["mean"], r["n"]) if nc else None, (lc[0], lc[1]) if lc else None)) + cited_differ += 1 if cited[0] != cited[1] else 0 + return {"divergent_probes": probes, "decisions": decisions, "b4": r6(backed / decisions) if decisions else None, + "b5": r6(cited_differ / probes) if probes else None} + + +def metric(lv, bars, sink): + """Metric b; every stance it reads is appended to `sink` (metric e).""" + hab = lives.load("habituation") + docs, n1, bad1 = check_life(NOGENES, 0, hab) + sink.extend(docs) + zd = [doc["senses"]["tool_fail"]["zd"] for doc in docs] + b1 = r6(zd[19] / zd[0]) + # every reading of every sense: the two rooms and the surprise streams on the no-genes copy + n_all, bad_all = n1, bad1 + for evs in (lives.load("room-a") + lives.load("tail"), lives.load("room-b") + lives.load("tail"), + lives.load("surprise-quiet"), lives.load("surprise-rate")): + more, n, bad = check_life(NOGENES, 0, evs) + sink.extend(more) + n_all, bad_all = n_all + n, bad_all + bad + zq = zd_series(NOGENES, 0, lives.load("surprise-quiet"), sink)[-1]["z"] + zr = zd_series(NOGENES, 0, lives.load("surprise-rate"), sink)[-1]["z"] + b2 = r6(zq / zr) + below = 0 + for s in B3_SEEDS: + series = zd_series(GENES, s, hab, sink) + below += 1 if series[19]["zd"] < series[0]["zd"] else 0 + b3 = r6(below / len(B3_SEEDS)) + past = named_past(lv) + r = {"scope": "b1 b2: fixtures/sensed-nogenes.yaml, individual 0; b3: fixtures/sensed.yaml, individuals 0-99; " + "b4 b5: metric a's divergent probes", + "b1": b1, "b1_zd_reading_1": zd[0], "b1_zd_reading_20": zd[19], "b1_values_compared": n_all, "b1_values_differing": bad_all, + "b2": b2, "b2_z_after_quiet": zq, "b2_z_after_rate_0_3": zr, "b3": b3} + r.update(past) + r["pass"] = {"b1": b1 <= bars["b1"]["ratio_max"] and bad_all <= bars["b1"]["differing_values_max"], + "b2": b2 >= bars["b2"]["ratio_min"], "b3": b3 >= bars["b3"]["share_min"], + "b4": past["b4"] is not None and past["b4"] >= bars["b4"]["share_min"], + "b5": past["b5"] is not None and past["b5"] >= bars["b5"]["share_min"]} + return r diff --git a/bench/individuality/replay.py b/bench/individuality/replay.py new file mode 100644 index 0000000..dcd5185 --- /dev/null +++ b/bench/individuality/replay.py @@ -0,0 +1,59 @@ +"""Metric d: replay (Python 3.9, standard library only). + +Every life of metric a is lived twice more from the same persona, seed and events: once in one run (a third copy) and once +split at a seeded event into two runs (`--state` plus the strand continued). Both must equal the original strand byte for +byte, and every strand must pass `live verify`. The P0 tutor strand recorded with the released 0.8.2 binary must verify, +and 20 committed events must append the recorded bytes. +""" +import os +from concurrent.futures import ThreadPoolExecutor + +import common +import gen +import p0 +import twins + + +def copies(tmp, life): + """(differing bytes against the third copy, against the split copy, verify exit codes of the three strands).""" + seed, room = life["seed"], life["room"] + evs = twins.events(room) + with open(life["strand"], "rb") as f: + orig = f.read() + tag = os.path.join(tmp, "d-s%d-%s" % (seed, room)) + st3, s3 = tag + "-3.state.json", tag + "-3.strand" + common.init(twins.PERSONA, seed, st3) + common.live(twins.PERSONA, evs, state=st3, strand=s3, checkpoint_every=twins.CHECKPOINT_EVERY) + k = gen.rng_for("replay", str(seed), room).randrange(1, len(evs)) + stx, sx = tag + "-x.state.json", tag + "-x.strand" + common.init(twins.PERSONA, seed, stx) + common.live(twins.PERSONA, evs[:k], state=stx, strand=sx, checkpoint_every=twins.CHECKPOINT_EVERY) + common.live(twins.PERSONA, evs[k:], state=stx, strand=sx, checkpoint_every=twins.CHECKPOINT_EVERY) + out = [] + for path in (s3, sx): + with open(path, "rb") as f: + data = f.read() + out.append(sum(1 for a, b in zip(orig, data) if a != b) + abs(len(orig) - len(data))) + codes = [common.verify(p)[0] for p in (life["strand"], s3, sx)] + return out[0], out[1], codes + + +def metric(lv, tmp, bars): + with ThreadPoolExecutor(twins.WORKERS) as ex: + res = list(ex.map(lambda life: copies(tmp, life), [lv[k] for k in sorted(lv)])) + third = sum(r[0] for r in res) + split = sum(r[1] for r in res) + codes = [c for r in res for c in r[2]] + sdir = os.path.join(p0.P0, "strands") + vcode, vdoc = common.verify(os.path.join(sdir, "tutor-s0-0.strand")) + code, appended, _ = p0.continue_tutor(os.path.join(sdir, "tutor-s0-0.strand"), os.path.join(sdir, "tutor-s0-0.state.json"), + os.path.join(sdir, "tutor-continue.jsonl")) + with open(os.path.join(sdir, "tutor-s0-0.appended"), "rb") as f: + equal = f.read() == appended and code == 0 + r = {"scope": "metric a's 80 lives (third copy + split copy each); the P0 tutor strand (released 0.8.2)", + "strands": len(codes), "differing_bytes_third_copy": third, "differing_bytes_split_copy": split, + "verify_failures": sum(1 for c in codes if c != 0), "p0_strand_verifies": vcode == 0 and bool((vdoc or {}).get("ok")), + "p0_appended_equal": equal} + r["pass"] = {"d": third + split <= bars["d"]["differing_bytes_max"] and r["verify_failures"] <= bars["d"]["verify_failures_max"] + and r["p0_strand_verifies"] and equal == bars["d"]["p0_strand_appended_equal"]} + return r diff --git a/bench/individuality/run.py b/bench/individuality/run.py new file mode 100644 index 0000000..a9317df --- /dev/null +++ b/bench/individuality/run.py @@ -0,0 +1,113 @@ +"""bench/individuality: run the metrics, check every gated bar (Python 3.9, standard library only). + + python3 run.py [--only a,b,d,e] [--out result.json] + +The binary is PROBBIT_BIN, else `probbit` on PATH. Exit 0: every gated bar of the metrics run passes; 1: one fails (or the +wall time is over its bar); 2: a setup error (no binary, a fixture that differs from fixtures/MANIFEST). Metric c (credit) +and f (lineage) need blocks this release does not have and are skipped with a note. +""" +import json +import os +import shutil +import sys +import tempfile +import time + +HERE = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, os.path.join(HERE, "fixtures")) +sys.path.insert(0, HERE) +import common # noqa: E402 + +KNOWN = ["a", "b", "c", "d", "e", "f"] +LATER = {"c": "credit accuracy needs the learning.credit block (not in this release)", + "f": "lineage drift needs signed rewards and a lineage block (not in this release)"} + + +def manifest(): + """Every file fixtures/MANIFEST lists has its recorded sha256 and size.""" + bad = [] + with open(os.path.join(common.FIXTURES, "MANIFEST"), encoding="utf-8") as f: + for line in f: + if line.startswith("#") or not line.strip() or line.startswith("binary "): + continue + sha, size, path = line.split() + full = os.path.join(common.FIXTURES, path) + if not os.path.exists(full): + bad.append(path + " (missing)") + continue + with open(full, "rb") as g: + data = g.read().replace(b"\r\n", b"\n") + if common.sha256_bytes(data) != sha or len(data) != int(size): + bad.append(path) + return bad + + +def main(argv): + only, out = KNOWN, os.path.join(HERE, "result.json") + args = list(argv) + while args: + a = args.pop(0) + if a == "--only" and args: + only = [x.strip() for x in args.pop(0).split(",") if x.strip()] + elif a == "--out" and args: + out = args.pop(0) + else: + common.fail("usage: python3 run.py [--only a,b,d,e] [--out FILE]") + unknown = [m for m in only if m not in KNOWN] + if unknown: + common.fail("unknown metric(s): " + ", ".join(unknown)) + t0 = time.time() + try: + b = common.binary() + bad = manifest() + if bad: + raise common.SetupError("fixtures differ from fixtures/MANIFEST: " + ", ".join(bad)) + with open(os.path.join(common.FIXTURES, "bars.json"), encoding="utf-8") as f: + bars = json.load(f) + import habits + import habituation + import replay + import twins + result = {"probbit": common.version(b), "metrics": {}, "skipped": {}} + tmp = tempfile.mkdtemp(prefix="pbit-bench-") + try: + lv = twins.run_lives(tmp) if set(only) & {"a", "b", "d", "e"} else {} + stances = [d for life in lv.values() for d in life["stances"] + life["probes"]] + if "a" in only: + result["metrics"]["a"] = twins.metric(lv, bars) + if "b" in only or "e" in only: + rb = habituation.metric(lv, bars, stances) + if "b" in only: + result["metrics"]["b"] = rb + if "d" in only: + result["metrics"]["d"] = replay.metric(lv, tmp, bars) + if "e" in only: + result["metrics"]["e"] = habits.metric(stances, bars) + finally: + shutil.rmtree(tmp, ignore_errors=True) + for m in only: + if m in LATER: + result["skipped"][m] = LATER[m] + except common.SetupError as e: + common.fail(str(e)) + wall = round(time.time() - t0, 1) + result["wall_seconds"] = wall + gates = {k: v for m in result["metrics"].values() for k, v in m["pass"].items()} + gates["wall"] = wall <= bars["wall_seconds_max"] + result["pass"] = gates + with open(out, "w", encoding="utf-8", newline="\n") as f: + f.write(json.dumps(result, indent=1, sort_keys=True) + "\n") + for m, r in sorted(result["metrics"].items()): + shown = {k: v for k, v in r.items() if k not in ("pass", "scope")} + print("%s %s" % (m, json.dumps(shown, sort_keys=True))) + print(" scope: %s" % r["scope"]) + for m, why in sorted(result["skipped"].items()): + print("%s skipped: %s" % (m, why)) + failed = sorted(k for k, ok in gates.items() if not ok) + print("bars: %d/%d pass%s · wall %.1f s · probbit %s · %s" % (len(gates) - len(failed), len(gates), + "" if not failed else " (failed: %s)" % ", ".join(failed), wall, result["probbit"], os.path.relpath(out, os.getcwd()))) + return 1 if failed else 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff --git a/bench/individuality/twins.py b/bench/individuality/twins.py new file mode 100644 index 0000000..9d306c2 --- /dev/null +++ b/bench/individuality/twins.py @@ -0,0 +1,104 @@ +"""Metric a: twins distinguishability (Python 3.9, standard library only). + +Individuals 0-39 each live room A and room B (60 events), then a month away and 8 calm events; 20 probes are then answered +by `persona turn` from the saved post-life state, so probes never see each other. The host action is the caution level. +""" +import os +import shutil +import tempfile +from concurrent.futures import ThreadPoolExecutor + +import common +from fixtures import lives + +PERSONA = os.path.join(common.FIXTURES, "sensed.yaml") +SEEDS = list(range(40)) +ROOMS = ["A", "B"] +CHECKPOINT_EVERY = 10 +WORKERS = 4 + + +def events(room): + return lives.load("room-" + room.lower()) + lives.load("tail") + + +def one_life(tmp, persona, seed, room): + """One life: (stances, strand path, final state path, probe documents).""" + st = os.path.join(tmp, "s%d-%s.state.json" % (seed, room)) + strand = os.path.join(tmp, "s%d-%s.strand" % (seed, room)) + common.init(persona, seed, st) + code, docs, err = common.live(persona, events(room), state=st, strand=strand, checkpoint_every=CHECKPOINT_EVERY) + if code != 0: + raise common.SetupError("live s%d %s: %s" % (seed, room, err.strip()[-300:])) + probes = [] + out = os.path.join(tmp, "s%d-%s.probe.json" % (seed, room)) + for p in lives.load("probes"): + code, doc, err = common.turn(persona, st, p, out) + if code != 0: + raise common.SetupError("probe s%d %s: %s" % (seed, room, err.strip()[-300:])) + probes.append(doc) + return {"seed": seed, "room": room, "stances": docs, "strand": strand, "state": st, "probes": probes} + + +def run_lives(tmp, persona=PERSONA, seeds=SEEDS): + with ThreadPoolExecutor(WORKERS) as ex: + futs = {(s, r): ex.submit(one_life, tmp, persona, s, r) for s in seeds for r in ROOMS} + return {k: f.result() for k, f in futs.items()} + + +def action(doc): + return doc["stance"]["caution"]["level"] + + +def traits(doc): + return sorted(doc["stance"]) + + +def compare(pa, pb): + """(share of probes whose host action differs, share of (probe, trait) levels that differ, mean TV over probes and traits)""" + d = sum(action(a) != action(b) for a, b in zip(pa, pb)) / len(pa) + cells = [(a["stance"][t], b["stance"][t]) for a, b in zip(pa, pb) for t in traits(a)] + lvl = sum(x["level"] != y["level"] for x, y in cells) / len(cells) + tv = sum(common.tv(x["odds"], y["odds"]) for x, y in cells) / len(cells) + return d, lvl, tv + + +def metric(lv, bars): + d_life, l_life, tv_life = [], [], [] + for s in SEEDS: + d, lvl, tv = compare(lv[(s, "A")]["probes"], lv[(s, "B")]["probes"]) + d_life.append(d) + l_life.append(lvl) + tv_life.append(tv) + seed_pairs = {} + for room in ROOMS: + ds, tvs = [], [] + for i in range(0, len(SEEDS), 2): + d, _, tv = compare(lv[(SEEDS[i], room)]["probes"], lv[(SEEDS[i + 1], room)]["probes"]) + ds.append(d) + tvs.append(tv) + seed_pairs[room] = (sum(ds) / len(ds), sum(tvs) / len(tvs)) + mean = lambda xs: sum(xs) / len(xs) # noqa: E731 + lo, hi = common.bootstrap(d_life) + tlo, thi = common.bootstrap(tv_life) + r = { + "scope": "fixtures/sensed.yaml, individuals 0-39, rooms A and B (60 events + 720 h + 8 calm), 20 probes each", + "d_life": common.r6(mean(d_life)), "d_life_ci95": [common.r6(lo), common.r6(hi)], + "l_life": common.r6(mean(l_life)), "tv_life": common.r6(mean(tv_life)), "tv_life_ci95": [common.r6(tlo), common.r6(thi)], + "d_seed_A": common.r6(seed_pairs["A"][0]), "tv_seed_A": common.r6(seed_pairs["A"][1]), + "d_seed_B": common.r6(seed_pairs["B"][0]), "tv_seed_B": common.r6(seed_pairs["B"][1]), + "tv_seed_B_over_A": common.r6(seed_pairs["B"][1] / seed_pairs["A"][1]) if seed_pairs["A"][1] else None, + } + a1 = r["d_life"] >= bars["a1"]["d_life_mean_min"] and r["d_life_ci95"][0] >= bars["a1"]["d_life_ci_low_min"] + a2 = r["tv_life"] >= min(r["tv_seed_A"], r["tv_seed_B"]) + r["pass"] = {"a1": a1, "a2": a2} + return r + + +if __name__ == "__main__": + import json + tmp = tempfile.mkdtemp(prefix="pbit-twins-") + try: + print(json.dumps(metric(run_lives(tmp), json.load(open(os.path.join(common.FIXTURES, "bars.json")))), indent=1)) + finally: + shutil.rmtree(tmp, ignore_errors=True) From 6f752a3353c6f82f26b4f47507f3e700409a6fa6 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 06:59:00 -0700 Subject: [PATCH 11/14] =?UTF-8?q?docs:=20senses=20(persona.md=20=C2=A72.11?= =?UTF-8?q?),=20the=20RFC,=20CHEATSHEET,=20CHANGELOG=200.9.0,=20BENCHMARKS?= =?UTF-8?q?=20=C2=A710,=20the=20bench=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit persona.md: §2.11 Senses (schema, refusals, the sense step, rules S1-S7, the stance and why), and senses in §3 step 2, §4, §5.1, §5.6, §5.7 and §7; §5.8 names the inputs panel and adds the senses rows; §6 adds the limit. The RFC is docs/rfcs/0001-senses-and-reward.md. BENCHMARKS §10 and the bench README record the measured bars, metric a's failure included. --- BENCHMARKS.md | 27 +++ CHANGELOG.md | 17 ++ bench/individuality/README.md | 168 ++++++++++++++ bench/individuality/fixtures/MANIFEST | 2 +- bench/individuality/p0.py | 2 +- docs/CHEATSHEET.md | 13 ++ docs/persona.md | 150 ++++++++++++- docs/rfcs/0001-senses-and-reward.md | 302 ++++++++++++++++++++++++++ 8 files changed, 672 insertions(+), 9 deletions(-) create mode 100644 bench/individuality/README.md create mode 100644 docs/rfcs/0001-senses-and-reward.md diff --git a/BENCHMARKS.md b/BENCHMARKS.md index c0216de..bb4642e 100644 --- a/BENCHMARKS.md +++ b/BENCHMARKS.md @@ -1114,3 +1114,30 @@ fun (85 % of turns); the engine and the Python prototype end every individual in adversaries or floors (a floor holds by construction under the soundness condition of docs/persona.md §2.9 and `prove` reports it; this run measures it once); a bound on gaps when higher-priority habits preempt; anything about the words a model writes; the times on another machine or an idle one. + +## §10 Senses: individuality, habituation, replay and habits (`python3 bench/individuality/run.py --only a,b,d,e`, stdlib, 10.0 s; development build of 0.9.0) + +The benchmark's spec, fixtures and bars are in [bench/individuality/README.md](bench/individuality/README.md); the fixtures and +bars were frozen with their sha256 (`bench/individuality/fixtures/MANIFEST`) before any run. One run on an Apple M4: + +| metric | measured | bar | | +|---|---|---|---| +| a1 twins: share of 20 probes whose host action differs between an individual's two lives (40 individuals) | 0.145 (95 % interval 0.096 to 0.199) | >= 0.30, interval low >= 0.20 | fails | +| a2 twins: mean odds distance between two lives vs between two individuals in one room | 0.1307 vs 0.1329 (room A), 0.1411 (room B) | >= the smaller | fails | +| b1 habituation: zd at reading 20 / reading 1 (no genes); values against an independent Python sense step | 0.304149; 4,522 compared, 0 differ | <= 0.35; 0 | passes | +| b2 surprise: z after 40 quiet readings / after 40 at rate 0.3 | 6 / 1.75286 = 3.422977 | >= 2 | passes | +| b3 genes: individuals 0-99 whose zd at reading 20 is below reading 1 | 100 % | 100 % | passes | +| b4 named past: divergent decisions whose `why` clause equals its template rendered from the document | 100 % of 232 | >= 95 % | passes | +| b5 named past: divergent probes where a cited value differs between the two lives | 100 % of 116 | >= 95 % | passes | +| d replay: differing bytes, third and split copies of 80 lives; `live verify` failures (240 strands); the 0.8.2 strand | 0; 0; verifies, 20 events append the recorded bytes | 0; 0; equal | passes | +| e habits: violations and independent breaks over 9,442 stances; stances where a habit bound | 0 and 0; 72 | 0 and 0; >= 50 | passes | + +Reading it. Habituation, surprise, the named past, replay and habits hold as specified. The twins bar does not: in this release +rewards pay the previous stance, and at these settings a different individual (another seed in the same room: 0.25 and 0.345 +of probes) moves the host action more than a different life does (0.145). The bars are not changed after the fact; metric a is +re-measured when action-addressed feedback (RFC 0001 Design B, metric c) lands. + +**P0** (`bench/individuality/p0.py check`, 77 s): 653 outputs of the released 0.8.2 binary over 8 personas without a senses +block (9,600 live turns and as many replayed, `describe`, `lint --seeds 0-99`, `fuzz` and `prove` documents): 0 differ. 629 are +byte-identical; 24 are the stderr of `live` runs whose scripts send a `senses` key, identical once the one line naming it is +removed. All 8 recorded strands verify, and the tutor's continues with the recorded bytes. diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cf206e..7aecd35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,23 @@ All notable changes to this project are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). +## 0.9.0 - unreleased + +### Added +- **Senses** (docs/persona.md §2.11): an optional `senses` block. The host sends measured readings in declared units with + a named source; each is judged against a learned normal per sense (mean, variance, count; half-life in events; drift and + variance caps anchored to a declared prior) and moves moods and traits by its capped z-score; `why` names the normal and + what the learned weights came from. Readings from `self` or through MCP are refused. A persona without the block gives + byte-identical documents. +- `live verify` summarises the normals (`normals`: mean, count and the largest move within 50 events); `monitor` draws a row + per sense and an alert when a normal moved over `drift_cap / 2` within 50 events. `examples/persona/sensed.yaml` (with its + golden and rules) and `bench/individuality/` (benchmark metrics a, b, d and e; the P0 corpus) are new. Design notes: + `docs/rfcs/0001-senses-and-reward.md`. + +### Changed +- `live` says once on stderr when a persona without a senses block receives a `senses` key (still an undeclared input, + listed in `ignored`). The monitor's panel of the event's inputs is labelled INPUTS (it was SENSES). + ## 0.8.3 - unreleased ### Added diff --git a/bench/individuality/README.md b/bench/individuality/README.md new file mode 100644 index 0000000..5403295 --- /dev/null +++ b/bench/individuality/README.md @@ -0,0 +1,168 @@ +# Benchmark: individuality, senses and credit (`bench/individuality/`) + +This benchmark defines "done" for RFC 0001 ([docs/rfcs/0001-senses-and-reward.md](../../docs/rfcs/0001-senses-and-reward.md)) +with numbers a test can see. It runs on Python 3.9 (standard library only) and the probbit binary, in under 60 s on one +machine; `run.py` exits 1 when any gated bar fails. Every number it prints carries its scope: the persona, the seeds and the +events. + +``` +PROBBIT_BIN=target/release/probbit python3 bench/individuality/run.py --only a,b,d,e # writes result.json next to run.py +PROBBIT_BIN=target/release/probbit python3 bench/individuality/p0.py check # P0: byte-identical documents +``` + +**This release** ships senses (RFC 0001 Design A) and metrics a, b, d and e. Metric c (credit) needs action-addressed feedback +(Design B) and metric f a lineage budget (Design C); `run.py` skips both with a note. Without the credit block, rewards pay the +stance just before them, so the streams below carry no `await` or `for` keys. + +**Freezing.** The fixtures, generators and bars are committed with their sha256 in `fixtures/MANIFEST` before any run. +`run.py` checks every listed file before it measures anything (exit 2 when one differs). Any later change is logged at the end +of this file with its reason, and the old result stays in the history. + +## Layout + +``` +bench/individuality/ + run.py the metrics -> result.json; exit 0 every gated bar passes, 1 one fails, 2 setup error + common.py binary lookup (PROBBIT_BIN, else PATH), canonical JSON, live/turn/verify wrappers, TV distance, + percentile bootstrap (2,000 resamples, random.Random(20261014)) + p0.py P0: the documents of personas without the new blocks, recorded with the released 0.8.2 binary + fixtures/ + sensed.yaml 4 traits, 2 moods, 4 senses, 2 habits, learning on caution, reward_from + sensed-nogenes.yaml the same with every sense gene spread at 0 + lives.py the seeded generator of the streams; its outputs are committed in lives/ and checked against MANIFEST + bars.json the gated bars + gen.py, p0/ the P0 corpus: personas, scripts, the recorded outputs and strands + twins.py habituation.py replay.py habits.py +``` + +## Shared fixtures + +**`sensed.yaml`** (a copy of `examples/persona/sensed.yaml`). Traits `caution` (bold, measured, careful), `initiative` +(follow, suggest, lead), `verbosity` (terse, short, full), `warmth` (cool, neutral, warm); moods `valence`, `arousal` +(half-life 6 h). Senses, all with gene spreads 0.3: + +| sense | kind, unit, range, scale | prior (mean, var) | drift_cap | effects per unit of z | +|---|---|---|---|---| +| `tool_fail` | flag, event | 0.05, 0.05 | 0.25 | caution +0.8, valence −0.4 | +| `tool_latency` | number, seconds, 0..3600, log1p | 0.405, 0.1 | 0.7 | arousal +0.5, verbosity −0.3 | +| `tempo` | number, messages in 10 min, 0..200, linear | 1, 1 | 2 | verbosity −0.4, arousal +0.3 | +| `silence` | number, hours, 0..1e6, log1p | 0.69, 0.5 | 1.0 | warmth +0.4, initiative +0.3 | + +Habits: `no_bold_after_failure` (`when: {sense.tool_fail.raw: true}`, `then: {caution: {not: [bold]}}`) and +`short_when_busy` (`when: {sense.tempo.raw: {at_least: 20}}`, `then: {verbosity: {at_most: short}}`). Learning on `caution` +(rate 0.3, step_cap 0.1, total_cap 0.4); `reward_from: [human, env]`. **Host action** (the gated decision): caution bold → +"go ahead", measured → "show the plan, then go", careful → "show the diff and wait". + +**Two stimulus streams** (`fixtures/lives.py`, 60 events each, 0.5 h apart, one stream per room shared by every individual): +- Room A, quiet and praised: tool failures at rate 0.02, latency 0.1–0.3 s, tempo 0–2, silence 0.5 h; every 6th event + `praise` from `human:a` (its readings keep the instrument's source, `env:host`). +- Room B, harsh: failures at rate 0.3, latency 1–8 s, tempo 5–30, silence 0.5 h with a 9 h silence every 10th event; every + 7th event `criticism` from `human:b`. + +Both lives then get one event with `elapsed_hours: 720` and no readings, and 8 calm events at room A's medians, so moods relax +and history features roll out of their window. **Probes**: 20 events, each with a reading for every sense (a seeded subset of +tool_fail both ways × latency 0.2, 2, 8 s × tempo 1, 10 × silence 0.5, 30 h), each answered by `persona turn` from the same +saved post-life state, so probes never see each other. **Seed control**: individuals 0–39; pairs (0, 1), (2, 3) … (38, 39) +share a room. + +## Metric a: twins distinguishability + +Measures whether one individual's life moves its decisions as far as being a different individual does. + +- **Statistics.** Per seed s: `d_life(s)` = share of the 20 probes whose host action differs between life A and life B; + `l_life(s)` = share of (probe, trait) whose taken level differs; `tv_life(s)` = mean over probes and traits of the total + variation distance between the odds (docs/persona.md section 5.4). Per room, the same over the 20 seed pairs: `d_seed_A`, + `tv_seed_A`, `d_seed_B`, `tv_seed_B`. Means over seeds, with bootstrap 95 % intervals over seeds. +- **Pass bars.** a1: mean `d_life` ≥ 0.30, and the lower end of its interval ≥ 0.20. a2: mean `tv_life` ≥ the smaller of + `tv_seed_A` and `tv_seed_B` (in at least one room a different life moves an individual as far as a different seed does). +- **Reported, not gated.** `tv_seed_B / tv_seed_A`. +- **Script.** `twins.py`: 80 `live` runs (`--clock fixed --strand`, `--state` written at the end), 1,600 probe turns. + +## Metric b: habituation and the named past + +Measures whether the same reading lands differently after a learned normal, and whether `why` says so. + +- **Fixture.** `sensed-nogenes.yaml` for b1 and b2; streams: 20 identical tool failures from init (habituation), and 40 quiet + readings vs 40 readings at rate 0.3 (failures at 0, 3 and 6 of every 10), each followed by one failure (surprise); b3 runs + `sensed.yaml` over individuals 0–99; b4 and b5 read metric a's probe documents. +- **Statistics.** b1: `senses.tool_fail.zd` at reading 20 over reading 1, and the engine's z, zd, judged mean and count, and + the normal after each reading (mean, variance, count) against an independent Python implementation of RFC section A.3 (every + reading of every sense in the habituation, surprise and room streams, to 6 decimals). b2: z of the failure after the quiet + stream over z after the rate-0.3 stream. b3: across individuals 0–99 with genes, the share whose zd at reading 20 is below + reading 1. b4: of the divergent decisions of metric a (a probe whose host action differs gives two decisions), the share + whose `why` holds a past clause its document backs: `noticed` names a sense read this turn and the clause equals the RFC A.5 + template rendered in Python from `senses`, or the learned clause equals its template rendered from `learned_from`. b5: of + the divergent probes, the share where a cited value (z, mean or n of the normal clause, or Δ of the learned clause) differs + between the two lives. +- **Pass bars.** b1 ≤ 0.35 (0.30 by the RFC arithmetic) with 0 differing values; b2 ≥ 2 (3.4 by the arithmetic); b3 = 100 %; + b4 ≥ 95 %; b5 ≥ 95 %. +- **Script.** `habituation.py`. + +## Metric c: credit accuracy (with RFC Design B; skipped in this release) + +Measures whether a late, reordered or cancelled outcome credits the decision it was for: an act-or-ask policy, 10 individuals +× 300 events, outcomes delivered on time and up to 6 events late (10 % cancelled, 5 % sent twice, 2 % paying a turn never +opened), against an independent Python learner. Bars: c1 ≥ 99 % of the applied step equal to the oracle's, c2 = 100 % of +events with the oracle's Δ, c3 ≥ 99 % of open outcomes accepted, c4 = 100 % of duplicates, late payments and unknown turns +refused, each refused run byte-identical to the run without the refused events. + +## Metric d: replay + +Measures whether an individual is reproducible from its log. + +- **Fixture.** The lives of metric a, and the P0 strand of the shipped tutor recorded with the released 0.8.2 binary. +- **Statistics.** Differing bytes between each strand and a third copy (the same persona, seed and events) and a split copy + (the same life split at a seeded event into two runs: `--state` plus the strand continued); `live verify` exit codes; for the + 0.8.2 strand, verify under this build and the bytes it appends for 20 committed events against the recorded bytes. +- **Pass bars.** 0 differing bytes; every verify exit 0; the 0.8.2 strand verifies and the appended bytes are equal (P0). +- **Script.** `replay.py`. + +## Metric e: zero habit breaks + +Measures whether habits hold in every decision, whatever the life. + +- **Fixture.** Every stance of metrics a, b and d. Control: `habits.bound` lists the habits that changed the stance, so a zero + is not vacuous. +- **Statistics.** Stances with `habits.violations` > 0; stances that break a habit by an independent Python check (each + habit's `when` evaluated on the logged inputs, with `sense..raw` read from the stance's `senses`, against the released + levels); stances where a habit bound. +- **Pass bars.** 0 and 0 breaks; at least 50 bound stances. +- **Script.** `habits.py`, post-processing only. + +## Metric f: lineage drift (with RFC Design C; skipped in this release) + +Measures whether a lineage that absorbs learned weights into its prior stays within a declared budget: every generation over +the budget refused, no benign generation refused. + +## P0: personas without the new blocks + +`p0.py` recorded, before any code change and with the released 0.8.2 binary (sha256 in `fixtures/MANIFEST`), 653 outputs: 8 +personas without the new blocks × seeds 0–2 × 4 committed random scripts of 100 events, through `persona replay` and `live` +(9,600 live turns: stances, final states, strands with the engine string and the hashes chained from it masked), plus `check`, +`describe`, `init`, `compile`, `lint --seeds 0-99`, and `lint`, `prove` and `fuzz` documents of the shipped rules. `p0.py +check` exits 0 when every output equals its record. One line may differ, on stderr only: a script that sends a `senses` key +to a persona without the block gets `live`'s one line naming it (scripts k=1, at their earliest such event); the check accepts +exactly that line there and counts those outputs apart. + +## What this benchmark cannot see + +- Whether a reading or a reward is true: a forged env label passes every metric. +- Whether a host acts on the stance, or a model writes in it. +- Natural lives: every life here comes from a seeded generator, and sequential turns of one life are correlated. +- Other personas, longer lives (none here exceeds 100 events before its probes), other hardware (timings come from one + machine; bytes match wherever the floating-point maths agrees, docs/persona.md section 5.3). +- Whether any of this is like anything from the inside. No metric here can see it, and none claims it. + +## Results + +One run on an Apple M4 (development build, 10.0 s): a1 0.145 (interval 0.096–0.199) and a2 0.1307 against 0.1329 fail their +bars; b1 0.304149 with 0 of 4,522 values differing, b2 3.422977, b3 100 %, b4 100 % of 232 decisions, b5 100 % of 116 probes, +d 0 differing bytes over 240 strands, e 0 violations and 0 breaks over 9,442 stances with 72 bound pass. See BENCHMARKS.md §10. + +## Changes after freezing + +- `p0.py` (listed in MANIFEST since the P0 record): `check` accepts the one stderr line `live` writes when a script sends a + `senses` key to a persona without the block, only on such a script, once, at its earliest such event, and reports those + outputs apart (`stderr_senses_warning_only`). The recorded outputs, scripts and strands are unchanged. Reason: the line is + part of the senses release (an undeclared key is named once); it is not a document, and every document stays + byte-identical. MANIFEST's p0.py line was updated with the change. diff --git a/bench/individuality/fixtures/MANIFEST b/bench/individuality/fixtures/MANIFEST index 2df1ae6..ea3e8ef 100644 --- a/bench/individuality/fixtures/MANIFEST +++ b/bench/individuality/fixtures/MANIFEST @@ -53,7 +53,7 @@ a88d3b20b41e9843f2b9ac9b117d5b462ec6b1095c762da531cb98481ff48432 43389 p0/strand 615978432a80e6b8be7fdf6e2382438516dc67acae56c562221c89654cae479e 6815 p0/strands/tutor-s0-0.appended cf9073507dad98bedc4f09ca2e49f34862919240c64c548b7a1dcf58fda4804b 1160 p0/strands/tutor-s0-0.state.json 4db5f3d83a0e6df0ea632c35957cdb0970665422af9054fa50e5468e13a888ab 55008 p0/strands/tutor-s0-0.strand -88fe315ae9968ea6ec604fd35f8b334b5f84a63efc5b989d46f71a6b68a9a0a7 12369 ../p0.py +81b67a8364ac4aa3a884ca1ff8222ac4904e3493cc66cb6d8c8246e8760dcf14 12370 ../p0.py # # Metrics a, b, d and e: frozen 2026-10-14 before their first run (personas, generator, streams, bars). # Re-generate the streams: python3 lives.py (gives these bytes). diff --git a/bench/individuality/p0.py b/bench/individuality/p0.py index 95b0d16..31a2f8e 100644 --- a/bench/individuality/p0.py +++ b/bench/individuality/p0.py @@ -52,7 +52,7 @@ def masked_err(err): # The one line 0.9.0 adds to a corpus output: `live` says once per run, on stderr, that a persona without a senses block # got a `senses` key (an undeclared input, listed in `ignored` as before). Only the scripts that carry `senses` (k=1) get -# it, at their first such event; it is not a document: stdout, states and strands stay byte-identical. +# it, at the earliest such event; it is not a document: stdout, states and strands stay byte-identical. SENSES_WARNING = ("probbit: live: events[%d]: this persona has no senses block: `senses` is an undeclared input " "(listed in ignored), no reading is judged\n") diff --git a/docs/CHEATSHEET.md b/docs/CHEATSHEET.md index 96e69cb..d45a681 100644 --- a/docs/CHEATSHEET.md +++ b/docs/CHEATSHEET.md @@ -40,6 +40,19 @@ The exact tiers run before the sampler: - `status`: `ok` (exact or diagnostics_passed), `partial`, `refused` (the line: just the habits), `fallback`. - `pursue` (a persona with a `drives:` block): the goal that gets the next unit of effort, with exact odds under the habits; `drives`: per goal the wanting, afterglow, expectation, last prediction error, deadline and turns since it was pursued. +- `senses` (a persona with a `senses:` block, docs/persona.md §2.11): per sense read this turn its `raw` reading, `src`, `z` + and `zd`, and the `mean` and `n` of the normal it was judged against; `noticed`: the sense `why` names. + +## Senses (0.9.0, docs/persona.md §2.11) +- Event: `{"senses": {"tool_fail": true, "tool_latency": {"v": 2.4, "src": "env:runner"}}, "src": "env:host"}`: a bare + reading takes the event's `src`; each sense lists its sources (`env`, `human`; never `self` or `clock`). +- Per reading: z against the learned normal (mean, variance, count), capped at `zcap`; beyond the `dead_zone` it moves the + sense's `effects`. The mean stays within `prior.mean ± drift_cap`, the variance within `[0, var_cap]`. +- Rules read `sense..raw` (holds whatever the history) or `sense..z`, never the normal. +- Refused: undeclared senses, out-of-range numbers, flags that are not true/false, a source the sense does not list, readings + through the MCP turn tools. A refused event changes nothing. +- `live verify` summary: `normals` per sense (`mean`, `n`, `max_move_50`); `monitor`: a row per sense and an alert when a + normal moved over `drift_cap / 2` within 50 events. ## Exit codes - `decide`, `run`, `evaluate`: 0 answer (exact | diagnostics_passed | partial), 1 infeasible (a proof), 2 bad input (one diff --git a/docs/persona.md b/docs/persona.md index 9758f70..e4ec0ff 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -384,6 +384,111 @@ the agent's own reply as its evidence of success. `fuzz` and `prove` search over events of an accepted source. A persona without the key reads `src` as any undeclared input (listed in `ignored`), and every document it produces is the same, byte for byte, as before the key existed. +### 2.11 Senses (optional) + +A sense is a reading the host measures (a tool failure, a latency, a message tempo, a silence) in declared units, from a named +source. The engine keeps a learned **normal** per sense (mean, variance, count) and turns each reading into a capped z-score +against it, which moves moods and traits as any input does. The same reading moves two individuals differently once their +normals differ, and `why` names the normal a reading was judged against. Design notes and arithmetic: +[docs/rfcs/0001-senses-and-reward.md](rfcs/0001-senses-and-reward.md). + +```yaml +senses: # 1-24 senses; with the block, `src` is read on every event + - id: tool_fail # at most 32 characters; reserves the input ids sense_tool_fail_* + kind: flag # flag (the normal is a rate) | number (then `range: [lo, hi]` is required) + unit: event # 1-24 characters, in the digest: two units are two personas + scale: linear # linear | log1p (the normal is kept on ln(1 + reading); a number with range low >= 0) + src: [env] # env and/or human; default [env] + prior: {mean: 0.05, var: 0.05} # required: the normal at init, anchor of both caps (on the scale) + drift_cap: 0.25 # required: the mean stays within prior.mean ± drift_cap + var_cap: 0.2 # default 4 × prior.var: the variance stays within [0, var_cap] + half_life_events: 10 # default 10 (1-10000) + zcap: 6 # default 6 (1-20) + dead_zone: 0.5 # default 0.5 (0 <= dead_zone < zcap) + var_floor: 0.01 # default 0.01 (> 0) + say: tool failures # default: the id, _ as spaces + effects: {caution: 0.8, valence: -0.4} # ordinal shift per unit of z beyond the dead zone; negative z pushes back + gain_spread: 0.3 # gene: gain exp(N(0, s²)) on effects; default 0, range 0..3 (all three) + threshold_spread: 0.3 # gene: offset N(0, s²) on dead_zone; default 0 + habituation_spread: 0.3 # gene: multiplier exp(N(0, s²)) on half_life_events; default 0 +``` + +Why these defaults: a reading 10 events old counts half, so the normal follows a changed rate halfway within 10 readings; at +`zcap` 6 a failure after 40 quiet readings scores 3.4× the same failure after 40 readings at rate 0.3 (1.7× at `zcap` 3); +readings within half a standard deviation move nothing; `var_floor` keeps z finite when the variance collapses; at `var_cap` +4 × prior.var the spread at most doubles. `prior` and `drift_cap` have no default: no unit-free anchor is safe. + +**Refused when the persona is read** (exit 2, at the field's path): a taken `sense_` id (an input, history feature or goal +whose id starts with a sense's `sense__`), an effect on an unknown trait or mood, `src` naming `self` or `clock`, +`prior.mean` outside the scaled range, `prior.var` <= 0, `drift_cap` <= 0, `var_cap` < `prior.var`, `dead_zone` >= `zcap`, +`log1p` on a flag or on a range low below 0, a cap with more than 6 decimals, an unknown field, a number sense without a range, +two senses with one id, an empty block or more than 24 senses. + +**Events.** `{"senses": {"tool_fail": true, "tool_latency": {"v": 2.4, "src": "env:runner"}}, "src": "env:host"}`: a bare value +takes the event's `src`, `{v, src}` carries its own. `senses` is read, not compiled: it is not listed in `ignored` and comes back +in the stance's `inputs`. + +**The sense step**, after validation and before the drive step, per declared sense with a reading, in declared order (genes +g_gain, g_thr, g_hab; each line rounded to 6 decimals): + +``` +x = the reading (a flag: 1 or 0), or ln(1 + reading) for log1p +h = clip(half_life_events × g_hab, 1, 10000) +a = 1 − 0.5^(1/h) +z = clip((x − mean) / sqrt(var + var_floor), −zcap, +zcap) # against the past, before the update +d = clip(dead_zone + g_thr, 0, zcap − 0.000001) +zd = sign(z) × max(|z| − d, 0) +mean' = clip(mean + a × (x − mean), prior.mean − drift_cap, prior.mean + drift_cap) +var' = clip((1 − a) × (var + a × (x − mean)²), 0, var_cap) # with the mean before the update +n' = min(n + 1, 1000000) +``` + +The turn adds g_gain × zd times each effect (an ordinal shift, section 2.3) to its target's field or mood evidence (section 3), +as a number input does. It is lowered as drives' surprise is: two reserved number inputs, `sense__up` = max(zd, 0) carrying +the effects and `sense__down` = max(−zd, 0) carrying them negated, both in [0, zcap], gain g_gain. Genes follow section +5.4's z: `round(exp(gain_spread × z(name, seed, "sense", id, "gain")), 4)`, `round(threshold_spread × z(…, "threshold"), 4)`, +`round(exp(habituation_spread × z(…, "habituation")), 4)`; a spread of 0 means gain 1, offset 0, multiplier 1 and no stored +gene. At the defaults (a flag with prior 0.05/0.05) the same failure every event gives zd 3.38, then 1.03 from reading 6 on: +the push falls to 0.30× and stays there, because the drift cap keeps a chronic failure from becoming normal. + +**Rules the engine enforces.** + +| rule | what it means | +|---|---| +| S1 declared, in range | a reading for an undeclared sense, a number outside its range or a flag that is not true/false refuses the event at `inputs.senses.`; nothing is clipped | +| S2 provenance | each reading's source kind must be in its `src`; a missing or malformed source, `self` and `clock` refuse the event whole, and a refused event changes nothing | +| S3 the engine owns the normal | hosts send raw readings; `sense__*` inputs and a pre-judged z are refused; z, normals and genes come from logged readings only | +| S4 anchored | a state is refused, even with a recomputed digest, if a mean leaves prior ± drift_cap, a variance leaves [0, var_cap], n is not a whole number up to 1e6, the sense set differs from the persona's or a gene misses its seed | +| S5 no rule reads the normal | `when` takes `sense..raw` (true/false for a flag, declared units for a number) and `sense..z` (the z above, before dead zone and gain), never the mean or variance; a condition on a sense not read this event is false | +| S6 no clock decay | normals move only on readings; silence, idle hours and control lines leave them | +| S7 not through the agent's channel | the MCP turn tools refuse an event that carries readings (section 7) | + +A rule that must hold whatever the history reads `raw`: `prove` reads `sense__up/down` as boxes [0, zcap] × gain and each +sense condition both ways, so a habit on `sense.tool_fail.raw` holds by construction for a rule with the same condition. +`fuzz` adds readings: flags both ways, numbers on `--grid` × range, one reading repeated 1, 5 and 20 times, and the range ends +alternating. + +**The stance and `why`.** The stance gains `senses` (per sense read: `raw`, `src`, `z`, `zd`, and the `mean` and `n` it was +judged against) and `noticed` (the sense of the normal clause, or null). `why` becomes: the bound habits; the normal clause; +up to two other live inputs (sense inputs excluded); the learned clause; the engine status if not ok. + +- **Normal clause**, at most one: the read sense with the largest |g_gain × zd| > 0 (ties: declared order), + `tool failures far above its normal (z +6.0 over 40 readings)`: "far" at |z| >= 2, above or below by sign. Failing that, the + read sense with the largest |z0| − |z| >= 1, z0 being the reading judged against the prior: + `tool latency usual for it now (z +0.9 over 40 readings, +3.9 against its prior)`. +- **Learned clause**, at most one, with a learning block and `line.why_past` (default true with senses, false without, so + existing documents keep their bytes): the released learned trait with the largest |Δ| at its taken level, if >= 0.05, + `learned: caution +0.31 on careful (0 rewards, 4 corrections)`. The counts are state: `learned_from`, per learned trait, the + feedback turns that moved it, by sign. + +z prints with one signed decimal and Δ with two, rounded half to even from the stored value. + +What it guarantees, and what it does not. A persona without the block reads `senses` as any undeclared input (listed in +`ignored`; `live` says so once on stderr) and every document it produces is the same, byte for byte, as before the block +existed. A refused reading changes nothing (P3 holds with readings: 40 individuals × 300 random events mixing sources, +readings, `self`, `clock` and out-of-range values). A source is the host's word: a forged `env` label passes every check; +readings are logged and replayed, not shown true. + ## 3. Compilation: persona + state + inputs → one probbit IR program For turn t of an individual (seed s), with inputs x_t: @@ -395,7 +500,9 @@ For turn t of an individual (seed s), with inputs x_t: `h(v,l) = ln prior(l) + gene_v x c(l) + Δ_v(l) + sum over inputs i of gain_i x scale_i(x_t) x effect_i(v,l) + sum over history features f of min(value_f, cap_f) x effect_f(v,l)`, with `scale` = 1 for a true flag or the matching level, the value for a number input, 0 otherwise, and Δ_v the learned - weights after this turn's feedback (section 2.8; 0 for a trait that does not learn). + weights after this turn's feedback (section 2.8; 0 for a trait that does not learn). With a senses block (section 2.11) + the sense step runs first and its lowering joins the inputs: `sense__up` and `sense__down` are number inputs with + gain g_gain and the sense's effects (negated for `down`); a sense not read this turn adds nothing. 2b. **`pursue`** (a drives block, section 2.9): one more trait variable over the goal ids, after the declared traits. Its field per goal g is step 2's (prior from `interest`, learned weights if `pursue` learns, input and history effects on `pursue`) plus `interest gene_g + want x W_g + glow x A_g + deadline / (1 + D_g / tau)` (each term rounded to 6 decimals, @@ -478,7 +585,11 @@ child process). `probbit persona compile` prints it; `probbit run` with those fl this individual's resting level, (5) traits at rest, (6) agenda order — cut from the lowest priority until it fits `max_tokens`. Unconditional habits that did not bind are not repeated (the trait phrases already carry them). - `why`: the bound habits, then the two strongest live inputs with the two traits each pushes hardest, by direction - (`learner upset -> valence down, humour down`): a push is evidence, not the level the stance took. + (`learner upset -> valence down, humour down`): a push is evidence, not the level the stance took. With a senses block the + normal clause comes before the inputs and the learned clause after them (section 2.11). +- With a senses block (section 2.11): `"senses": {"tool_fail": {"raw": true, "src": "env:runner", "z": 3.878359, "zd": + 3.378359, "mean": 0.05, "n": 0}}` per sense read this turn (the `mean` and `n` it was judged against) and `"noticed": + "tool_fail"` (the normal clause's sense, or null); `inputs` echoes `senses` as given. - `held`: the unsure traits held at their `hold` level; such a trait also carries `odds_unheld`, its odds before the hold. - With a drives block (section 2.9), `pursue` leaves `stance` for its own object and the turn's drive values follow it: `"pursue": {"goal": "fun", "p": 0.44, "odds": {"chores": 0.10, "craft": 0.26, "fun": 0.44, "safety": 0.20}, "released": true, @@ -505,6 +616,9 @@ child process). `probbit persona compile` prints it; `probbit run` with those fl "drives": {"genes": {"interest": {"fun": 0.12}, "gain": {"fun": 1.08}}, # with a drives block (section 2.9), per goal: "want": {"fun": 0.61}, "glow": {"fun": 0}, "expect": {"fun": 0}, # wanting, afterglow, expectation, the last "surprise": {"fun": 0}, "deadline": {"fun": null}, "since": {"fun": 0}}, # error, deadline hours, turns since + "senses": {"genes": {"gain": {"tool_fail": 1.19}, "threshold": {"tool_fail": -0.17}, "habituation": {"tool_fail": 1.46}}, + "norm": {"tool_fail": {"mean": 0.3, "var": 0.2, "n": 10}}}, # with a senses block (section 2.11): per sense + "learned_from": {"caution": {"rewards": 3, "corrections": 2}}, # with learning and line.why_past: feedback turns by sign "digest": "sha256:..."} ``` @@ -512,8 +626,10 @@ The state is plain JSON the host stores between turns (a file, a database row, a whose persona digest differs from the persona file, whose own digest does not match, or whose genes do not match its seed, and (with a learning block) learned weights outside ±total_cap or credits outside ±1, (with a drives block) drive genes that do not match the seed, a drive value outside its box (wanting, afterglow and expectation within their caps, the error within ±pe_cap, -deadlines 0 to 1e6 hours or null, `since` a whole number >= 0) or a goal set that differs from the persona's, even with a -recomputed digest. +deadlines 0 to 1e6 hours or null, `since` a whole number >= 0) or a goal set that differs from the persona's, and (with a +senses block, rule S4) a mean outside prior ± drift_cap, a variance outside [0, var_cap], a count that is not a whole number up +to 1e6, a sense set that differs from the persona's or sense genes that do not match the seed, even with a recomputed digest. +Each normal starts at its prior with n = 0; a persona without the block refuses a state with a `senses` field. ### 5.2 Canonical JSON and the number rule @@ -657,6 +773,12 @@ input. JSON: `--json` (`probbit_persona_fuzz: 1`, `probbit_persona_prove: 1`); t `replay` or `explain` command unless a synthetic source is explicitly authorized with `--fixture-src env:synthetic` (or `human:synthetic`, where allowed). The exporter strictly replays that labelled script; it rejects incompatible source rules, records `fixture_provenance`, and never bypasses the production source check. +With a senses block the labels cover readings too (a bare reading takes the event's synthetic `src`). + +**Senses in fuzz and prove** (section 2.11). `fuzz` adds readings to its events (nested in `senses`): flags both ways, +numbers on `--grid` × the range, one reading repeated 1, 5 and 20 times, and the range ends alternating. `prove` reads each +`sense__up/down` input as a box [0, zcap] × gain and each sense condition both ways, so a habit on `sense..raw` holds +by construction for a rule with the same condition. A rule reads the sense conditions the persona's habits use. The Python `persona_fuzz` and MCP fuzz tool accept `fixture_src` too. See the [host regression example](../examples/agent-harness/README.md). Synthetic observations are not production evidence. @@ -794,6 +916,12 @@ and the whole state after it, chained like the others. A full `verify` replays f against the replay (its `"checkpoints": N` is in the summary); `verify --from-checkpoint` reads the header, checks the last checkpoint against the event line before it (prev, the stance digest, the state digest, the state read as any state is) and replays only what follows (`"from_checkpoint": n`); the lines before it are trusted, so run a full `verify` to check them. + +**Senses in live** (section 2.11). An event carries `senses` as `persona turn` does; the strand logs each reading as used, with +its source, and `verify` recomputes the normals from the logged readings: its summary adds `"normals": {"": {"mean", "n", +"max_move_50"}}`, the normal now and the largest move of its mean within 50 events (the monitor alerts above drift_cap / 2). A +persona without the block lists `senses` in `ignored`, as before, and `live` says so once on stderr, at the earliest event +that carries it: `probbit: live: events[i]: this persona has no senses block: ...`. The documents and the strand are unchanged. `monitor` starts at the last checkpoint and draws its event at once. A strand that ends in a checkpoint line is continued from the state it carries. Before continuation or a control append, the stored chain and lifecycle are checked from the header: a checkpoint cannot hide a retired status, an invalid transition or a broken preceding hash link. This structural scan @@ -828,8 +956,10 @@ probbit monitor --demo drives --open # eight synthetic events with g **What it shows.** The latest event (or a selected historical event in the browser). In the terminal, a header: persona and version, seed, the individual's digest, the event number, the hours since the event before, the replay badge. The stance: one row per trait, its levels as segments sized by their odds, the level -taken in colour and the phrase it says. The moods, with a sparkline of the last 50 events. The senses: the event's inputs as the -turn used them (flags lit, numbers as bars, levels by name, the clock) and the history features against their caps. The habits +taken in colour and the phrase it says. The moods, with a sparkline of the last 50 events. The inputs: the event's inputs as the +turn used them (flags lit, numbers as bars, levels by name, the clock) and the history features against their caps. The senses, +with a senses block (section 2.11): one row per sense, its normal as a tick over the range, this event's reading, z and n (a +sense not read keeps its normal), and an alert when a normal moved over drift_cap / 2 within 50 events. The habits in force, the ones that bound in colour, and the violations counter (0 by construction, section 2.5). The learned deltas per level as centred bars within ±total_cap (with a learning block, section 2.8). The drives, when a document carries `pursue` or `drives`: documents without them draw no row, so a strand of a later engine lights them up. The stance line, and why. @@ -933,6 +1063,9 @@ flag, a port that cannot be had, or a file that cannot be read or is not a stran and the stance reads. They see what the host labels (a wrong `win` gives a confidently wrong afterglow), their magnitudes are the author's scale, not measured value, and `pursue` says where the next unit of effort should go: the host decides whether to act on it, and a goal floor is not a safety gate. +- A sense is arithmetic, not an inner state: a normal is a mean, a variance and a count, kept by fixed arithmetic from the + readings the host logs. A reading is the host's word (a forged `env` label passes every check), and a normal follows what it is shown: + the drift cap bounds how far, it does not make the readings true. No test can see an inner state, and none is claimed. - It does not guarantee the model follows the line. Whether a given model writes in the stance it is given has to be measured per model (the stance is model-independent; the obedience is not). @@ -952,7 +1085,7 @@ store the new state. On `refused` or `fallback`, use the line as given (habits o | `probbit persona lint PERSONA [--props FILE \| --never RULE] [--seeds 0-99] [--threads N]` | contradicting habits and planned levels that are not their trait's most likely one (section 5.5); with rules, prove them and fuzz the unknown ones (section 5.6); with a drives block, `floors`: the habits that can exclude a floor goal and the floors whose lift can reach 50; exit 1 if a contradiction is unresolved or a rule breaks, 3 if a rule is unproven (unknown, no counterexample found) | | `probbit persona fuzz PERSONA (--never RULE \| --props FILE) [--seeds 0-99] [--fuzz-seed N] [--scripts N] [--depth N] [--beam N] [--grid LIST] [--hours LIST] [--threads N] [--json]` | search event scripts for each individual's shortest counterexample to a character property, shrunk and replayable (section 5.6); exit 1 if one is found | | `probbit persona prove PERSONA (--never RULE \| --props FILE) [--seeds 0-99] [--threads N] [--json]` | per rule: held by construction, proved for every event sequence, or unknown with the cell that failed (section 5.6); exit 1 if one is unknown | -| `probbit persona check PERSONA` / `describe PERSONA` | valid, its digest and sizes / its traits, moods, inputs, habits and agenda | +| `probbit persona check PERSONA` / `describe PERSONA` | valid, its digest and sizes / its traits, moods, inputs, habits and agenda (and senses: unit, range, scale, sources, prior, caps, spreads, reserved ids) | | `probbit persona compile PERSONA --state STATE [--inputs ...]` | the turn's probbit-ir program; its sha256 is the stance's `engine.program` | | `probbit live PERSONA [--seed N \| --state FILE] [--strand FILE] [--events FILE [--watch]] [--clock real\|fixed]` | a resident individual: JSONL events in, one stance per event out, `elapsed_hours` stamped by the clock, the life logged to a strand (section 5.7); `--state` is rewritten after every event | | `probbit live PERSONA --demo week [--seed N] [--strand FILE] [--plain]` | one individual's scripted week on the fixed clock: learning to its cap, a quiet night, habits that hold (section 5.7) | @@ -974,6 +1107,9 @@ never change a document. The persona's own `engine.chains` is used whatever `PRO individual (`event` is its inputs, `elapsed_hours` from the host's clock, quantised to 1e-6 h; with `strand_path` the event is logged to that strand on the server's disk, a new file getting the header, and the answer gets `strand: {path, events, head}`); `probbit_live_verify {strand | strand_path}` -> `live verify`'s document (section 5.7; a divergence is an answer). + For a persona with a senses block, `probbit_persona_turn` and `probbit_live_event` refuse an event that carries readings + (rule S7, section 2.11: readings come from the host's instruments, never through the agent's channel); a persona without + the block lists `senses` in `ignored`, as before. A persona with a drives block takes `goals` in `inputs` / `event` (section 2.9); the schemas declare it. Stateless; the documents are the CLI's. A refusal, a fallback, a counterexample or a divergent strand is an answer; a bad persona, state, input, event or rule is a tool error carrying the error object. diff --git a/docs/rfcs/0001-senses-and-reward.md b/docs/rfcs/0001-senses-and-reward.md new file mode 100644 index 0000000..64ec68e --- /dev/null +++ b/docs/rfcs/0001-senses-and-reward.md @@ -0,0 +1,302 @@ +# RFC 0001: Senses and reward + +Status: draft for review · Target: probbit 0.9.0 · Changes: docs/persona.md (format 1, additive) + +## Summary + +1. Two optional blocks (`senses`, `learning.credit`) and four event keys (`senses`, `await`, `for`, `cancel`). Without the + blocks every document is byte for byte 0.8's. +2. `senses`: the host sends measured readings in declared units with a named source; the engine keeps a learned normal per + reading and turns each reading into a capped z-score against it, which moves moods and traits like any input. +3. `why` names the past: the normal a reading was judged against, and what the learned weights came from. +4. `learning.credit`: a reward names the decision it pays for (`for: `); late, reordered and cancelled outcomes credit + the right decision or are refused. +5. Moods and drives stay what they are: capped, replayable numbers that change behaviour for printed reasons. + +## Motivation + +Two measured facts (our tests, synthetic fixtures, probbit 0.8): + +- **The past changes decisions but is never named.** One 4-trait persona, one seed, two scripted lives of 40 host-measured + events, the same final message: two different stances, a third copy replayed byte for byte, 0 habit breaks. After a 720-hour + gap and 8 calm events the two still differed (mean odds distance 0.154), yet both `why` lines were the same text, since `why` + cites only present inputs and history inside its window. With scheduled process measurements, 40/40 life turns differed and + a blind classifier separated the lives on 400/400 lines, yet taken levels converged after an idle interval: moods relax, + history rolls out of its window, and only learned weights persist, which only feedback moves. +- **Late outcomes pay the wrong decision.** 0.8 credits a reward to the stance just before it. One act-or-ask policy, 5 + individuals × 300 events, outcomes 1–3 events late: 36–39 % of rewards credited a decision at a different level, and the + share of `act` in the last 100 events fell from 0.60 to 0.38 (delay 3). Dropping mismatched rewards restores 0.59 but + discards 40–41 % of them; one outstanding action per context removes the hole and serialises the agent. + +## Non-goals + +Reading text; idle actions; time-of-day curves; one individual's stance as another's reading; host-normalised readings; +authenticated readings; an exploration policy; any claim about inner states, which no test can see. + +## Design A: senses + +### A.1 Schema + +```yaml +senses: # optional, 1-24 senses; with the block, `src` is read on every event + - id: tool_fail # at most 32 characters; reserves the input ids sense_tool_fail_* + kind: flag # flag (the normal is a rate) | number (then `range: [lo, hi]` is required) + unit: event # 1-24 characters, in the digest: two units are two personas + scale: linear # linear | log1p (the normal is kept on ln(1 + reading); numbers with range low >= 0) + src: [env] # env and/or human; default [env] + prior: {mean: 0.05, var: 0.05} # required: the normal at init, anchor of both caps (scaled units) + drift_cap: 0.25 # required: the mean stays within prior.mean ± drift_cap + var_cap: 0.2 # default 4 × prior.var: the variance stays within [0, var_cap] + half_life_events: 10 # default 10 (1-10000) + zcap: 6 # default 6 (1-20) + dead_zone: 0.5 # default 0.5 (0 <= dead_zone < zcap) + var_floor: 0.01 # default 0.01 (> 0) + say: tool failures # default: the id, _ as spaces + effects: {caution: 0.8, valence: -0.4} # ordinal shift per unit of z beyond the dead zone; negative z pushes back + gain_spread: 0.3 # gene: gain exp(N(0, s²)) on effects; default 0, range 0..3 (all three) + threshold_spread: 0.3 # gene: offset N(0, s²) on dead_zone; default 0 + habituation_spread: 0.3 # gene: multiplier exp(N(0, s²)) on half_life_events; default 0 +``` + +Why these defaults. `half_life_events` 10: a reading 10 events old counts half, so the normal follows a changed rate halfway +within 10 readings. `zcap` 6: a failure after 40 quiet readings scores 3.4× the same failure after 40 readings at rate 0.3; +at zcap 3 the quiet case saturates and the ratio drops to 1.7. `dead_zone` 0.5: readings within half a standard deviation +move nothing, so a steady room stays quiet. `var_floor` 0.01 keeps z finite when the variance collapses, and moves z under +10 % while the variance is ≥ 0.05. `var_cap` 4 × prior.var: the spread at most doubles, so it alone never shrinks a z below +about half. `src` [env]: readings come from instruments unless people are named. Spreads 0, as every gene in the format. +24 senses keep the step small (it is linear in senses); 32-character ids keep `sense__down` within the 48-character +identifier limit. `prior` and `drift_cap` have no default: no unit-free anchor is safe. + +Refused on read (exit 2): a taken `sense_` id, an effect on an unknown target, `src` naming `self` or `clock`, `prior.mean` +outside the scaled range, `prior.var` ≤ 0, `drift_cap` ≤ 0, `var_cap` < `prior.var`, `dead_zone` ≥ `zcap`, `log1p` on a flag +or a negative range low, a cap with more than 6 decimals. + +### A.2 Events + +```json +{"senses": {"tool_fail": true, "tool_latency": {"v": 2.4, "src": "env:runner"}}, "src": "env:host", "elapsed_hours": 0.2} +``` + +A bare value takes the event's `src`. Without the block, `senses` is an undeclared input in `ignored`, as in 0.8. + +### A.3 The sense step + +After validation and before the drive step, per declared sense with a reading, in declared order (genes g_gain, g_thr, +g_hab; each line rounded to 6 decimals): + +``` +x = reading (flag: 1 or 0), or ln(1 + reading) for log1p +h = clip(half_life_events × g_hab, 1, 10000) +a = 1 − 0.5^(1/h) +z = clip((x − mean) / sqrt(var + var_floor), −zcap, +zcap) # against the past, before the update +d = clip(dead_zone + g_thr, 0, zcap − 0.000001) +zd = sign(z) × max(|z| − d, 0) +mean' = clip(mean + a × (x − mean), prior.mean − drift_cap, prior.mean + drift_cap) +var' = clip((1 − a) × (var + a × (x − mean)²), 0, var_cap) # the mean before the update +n' = min(n + 1, 1000000) +``` + +The turn adds g_gain × zd times each effect (an ordinal shift, section 2.3) to its target's field or mood evidence (section +3), as a number input does. Lowering follows drives' `surprise`: reserved number inputs `sense__up` = max(zd, 0) carrying +the effects and `sense__down` = max(−zd, 0) carrying them negated, both in [0, zcap], gain g_gain. Genes, with section +5.4's z: `round(exp(gain_spread × z(name, seed, "sense", id, "gain")), 4)`, `round(threshold_spread × z(…, "threshold"), 4)`, +`round(exp(habituation_spread × z(…, "habituation")), 4)`; spread 0 means gain 1, offset 0, multiplier 1 and no stored gene, +as in 0.8. State: `senses: {genes: {gain: {id: g}, threshold: {…}, habituation: {…}}, norm: {id: {mean, var, n}}}`, each +`norm` starting at the prior with n = 0. + +At the defaults (flag prior 0.05/0.05) the same failure every event gives zd 3.38, then 1.03 from reading 6 on: the push +falls to 0.30× and stays there, because the drift cap keeps a chronic failure from becoming normal. + +### A.4 Rules the engine enforces + +- **S1 Declared, in range.** A reading for an undeclared sense, a number outside its range or a flag that is not true/false + refuses the event at `inputs.senses.`; nothing is clipped. +- **S2 Provenance.** Each reading's source kind must be in its `src`; missing, malformed, `self` and `clock` refuse the event + whole, and a refused event changes nothing. +- **S3 The engine owns the normal.** Hosts send raw readings; z, normals and genes come from logged readings only. +- **S4 Anchored.** A state is refused, even with a recomputed digest, if a mean leaves prior ± drift_cap, a variance leaves + [0, var_cap], n is not a whole number up to 1e6, the sense set differs from the persona's or a gene misses its seed. +- **S5 No rule reads the normal.** `when` takes `sense..raw` (true/false for a flag, declared units for a number) and + `sense..z` (A.3's z, before dead zone and gain), never the mean or variance; a condition on a sense not read this event + is false. A rule that must hold whatever the history reads `raw`. +- **S6 No clock decay.** Normals move only on readings; silence and control lines leave them. +- **S7 Not through the agent's channel.** MCP tools refuse events that carry readings. + +`prove` reads `sense__up/down` as boxes [0, zcap] × gain and each sense condition both ways, so a habit on +`sense..raw` holds by construction for a rule with the same condition. `fuzz` adds readings: flags both ways, numbers on +`--grid` × range, one reading repeated 1, 5 and 20 times, and alternating range ends. + +### A.5 The stance and `why` + +The stance gains `senses` (per sense read: `raw`, `src`, `z`, `zd`, and the `mean` and `n` it was judged against) and +`noticed` (the normal clause's sense, or null); `inputs` echoes `senses`. `why` becomes: bound habits; the normal clause; up to +two other live inputs (the 0.8 rule, sense inputs excluded); the learned clause; the engine status if not ok. + +- **Normal clause**, at most one: the read sense with the largest |g_gain × zd| > 0 (ties: declared order), + `tool failures far above its normal (z +6.0 over 40 readings)`, "far" at |z| ≥ 2 (two standard deviations), above or below + by sign. Failing that, the read sense with the largest |z0| − |z| ≥ 1 (the smallest gap worth citing), z0 being the reading + judged against the prior: `tool failures usual for it now (z +0.9 over 40 readings, +3.9 against its prior)`. +- **Learned clause**, at most one, with a learning block and `line.why_past` (default true with `senses`, false without, so 0.8 + documents keep their bytes): the released learned trait with the largest |Δ| at its taken level, if ≥ 0.05 (odds × 1.05), + `learned: caution +0.31 on careful (0 rewards, 4 corrections)`. The counts are state: `learned_from`, per learned trait, + the feedback turns that moved it, by sign. + +z prints with one signed decimal and Δ with two, rounded half to even from the stored value. + +## Design B: action-addressed feedback + +### B.1 Schema and event keys + +```yaml +learning: # the 0.8 block, unchanged + from: [praise, criticism] + traits: [action] + rate: 0.3 + step_cap: 0.05 + total_cap: 0.4 + credit: # optional + max_open: 8 # decisions awaiting an outcome at once (1-64) + half_life_events: 32 # eligibility halves per 32 events of delay (1-10000) +``` + +`max_open` 8 covers 8 tool results in flight and keeps the state to a few KB. `half_life_events` 32: a reward 3 events late +keeps 0.94 of its step, 10 events late 0.81. A decision expires after 4 half-lives (128 events), where a payment would move at +most 1/16 of `step_cap`. + +Event keys: `await: true` (the host will act on this turn's stance and report its outcome); `for: n` (this feedback pays the +decision whose stance has `turn` n); `cancel: [n, …]` (no outcome will come; needs an env or human `src`). They are read, not +compiled, and echoed in `inputs`. + +### B.2 The credit step + +After the drive step (its surprise joins the sign), before compile; t is this event's turn. Feedback means a `learning.from` +flag is on, or (with drives) κ × surprise ≠ 0. B.3 is checked against the open set after this event's expiry and cancels. + +``` +expire each open n with t − n − 1 ≥ 4 × half_life_events (closed: expired) +close each n in cancel (closed: cancelled) +if feedback: + sign = the 0.8 sign: +1 reward, −1 correction, 0 both; with drives clip(sign + κ × surprise, −1, 1) + paid = for if given, else t − 1 + c = open[paid].credit, or the state's credit when paid = t − 1 is not open + e = 0.5^((t − paid − 1) / half_life_events), rounded to 6 decimals (1 for the previous stance) + step(l) = e × clip(sign × rate × c(l), −step_cap, +step_cap) + step(l) = step(l) − mean over levels of step + Δ(l) = round(clip(Δ(l) + step(l), −total_cap, +total_cap), 6) + close paid (closed: paid) +-- compile and solve with Δ -- +credit = onehot(level) − odds per released learned trait (the 0.8 rule) +if await: open[t] = {credit, stance digest}; beyond max_open close the oldest (closed: evicted) +``` + +Eligibility scales the capped step, so a stale reward always moves less than a fresh one, and at e = 1 the step is 0.8's +exactly. Paying a stance a habit forced moves nothing and is marked `absorbed`. A control line closes every open decision +(closed: control): in 0.8 no credit crosses one. State: `open_credit: [{turn, credit, stance}]` (turns increasing, at most +`max_open`, credits within ±1). Stance: `credit: {paid: {turn, e, sign, absorbed, stance} | null, closed: [{turn, as}], +open: [turns]}`. + +### B.3 Refusals + +Refused whole (one `{"error"}` at its path, no turn, no state change; exit 2 for `persona turn`, at the end of a `live` run): + +- **B-R1** feedback without `for` while a decision other than t − 1 is open; +- **B-R2** `for` naming a decision neither open nor t − 1 (paid, cancelled, expired, evicted, never opened, future); +- **B-R3** `for` on an event without feedback; +- **B-R4** `cancel` naming a decision not open, twice, or the one `for` pays; +- **B-R5** malformed: `for` not a whole number, `cancel` not a list of at most `max_open` whole numbers, `await` not + true/false, a `cancel` without an env or human `src`. + +`reward_from` checks run before these, unchanged. + +### B.4 Coexistence with "previous stance" + +Without `for`, feedback pays t − 1, as in 0.8, whenever that is unambiguous: no decision is open, or only t − 1 is. A host +that never sends `await` keeps 0.8 learning exactly; only the new keys appear. Without the block, `await`, `for` and `cancel` +are undeclared inputs in `ignored` (`live` warns on stderr), so P0 holds. + +## Design C (follow-on, not in 0.9.0): receipts and a lineage drift budget + +Receipts: signers in `reward_from` (`{praise: {kinds: [env], signers: [ci]}}`) and `receipt: {id, signer, sig}` on the event, +signing the persona digest, seed, `for`, the paid stance digest and the flags; since Design B pays a decision once, a replayed +receipt fails B-R2. Open: a signature scheme under the zero-dependency rule (a shared-key HMAC puts the key in `verify`) and +key rotation. Drift budget: `lineage: {m0_digest, probe_set, max_drift}` in a persona whose priors absorbed a parent's learned +weights; `verify --lineage M0` refuses a generation whose probe odds sit further than `max_drift` from M0's. In our tests one +policy absorbing its learned weights each generation moved 0.460 in 10 generations, against about 0.20 for one life. Open: +what counts as a generation, and where the check runs. + +## Invariants + +- **P0.** No new block: every stance, state, compiled program and fuzz/prove/lint/describe document is byte-identical to 0.8; + a strand differs only in its header's `engine` string and the hashes chained from it; every 0.8 strand verifies. +- **Replay.** A turn stays a pure function of (persona, state, inputs, engine version). Normals, `open_credit` and + `learned_from` are state derived from logged inputs by fixed arithmetic rounded to 6 decimals; genes come from name, seed + and id; `live verify` recomputes them. +- **Caps.** Mean within prior ± drift_cap; variance within [0, var_cap]; Δ within ±total_cap; at most `max_open` open; e ≤ 1. +- **Refusal.** A refused event changes nothing: the run equals the run without it, byte for byte. +- **Proof coverage.** Rules proved on 0.8 stay proved: the learned box is unchanged, sense pushes enter as boxes. + +## CLI and MCP surface + +| surface | change | +|---|---| +| `persona describe` | senses (unit, range, scale, sources, prior, caps, spreads, reserved ids) and the credit block | +| `persona turn`, `live` | event keys `senses`, `await`, `for`, `cancel`; stance keys `senses`, `noticed`, `credit` | +| `live verify` | recomputes normals and open decisions; summary adds `normals: {id: {mean, n, max_move_50}}` and `open` | +| `live verify --actions FILE` | lines `{"turn", "action": {trait: level}}`: the earliest turn whose host action differs from the released level | +| `monitor` | per sense the normal as a tick over the range, the reading, z, n; an alert when a mean moved over drift_cap/2 within 50 events; open decisions with e | +| `fuzz`, `prove` | A.4; `fuzz` adds late, reordered, duplicated, cancelled and unknown payments | +| MCP | `probbit_persona_turn` and `probbit_live_event` refuse readings and `cancel` | + +`prove --witness` is independent of this RFC and gets its own proposal. + +## Migration + +Existing personas, states and strands are untouched. A 0.8 strand continues under 0.9.0 with its header unchanged, and 0.9.0 +appends the lines 0.8 would. Adding a block changes the persona digest: a new individual on a new strand (retire the old one +with `live control retire`). A 0.8 binary refuses the new blocks as unknown fields and never replays them wrongly. + +## Test plan + +- Unit: closed form (n identical readings: mean_n = x + (1 − a)^n (mean_0 − x), within 1e-5 before caps); habituation (zd + at reading 20 ≤ 0.35 × reading 1; 0.30 at defaults); surprise ratio ≥ 2 (3.4); 100,000 adversarial readings inside the drift + cap; var_cap; eligibility; every lint and refusal row. +- Property: P0 over every golden and a recorded corpus of 7,200 shipped-persona turns; refusal over 40 individuals × 300 + random events mixing sources, readings and payments; replay, and a life split across runs equal to one run; genes + unchanged when an unrelated sense is edited. +- Fuzz/prove: the example sensed persona's rules held or proved over seeds 0–99; fuzz with readings and payments finds nothing. +- Acceptance: `bench/individuality/` (twins, habituation and named past, credit accuracy, replay, habit breaks), each metric + with a pass bar. + +## Failure modes and guards + +| failure | guard | +|---|---| +| A normal is taught: a chronic failure drifts into "normal" | drift cap anchored to the prior (push floor zd ≈ 1.0 at defaults); habits read raw readings; `monitor` and `verify` flag a mean that moved over drift_cap/2 within 50 events | +| Alternating extremes make every reading look ordinary | var_cap: the spread at most doubles | +| The agent supplies its own readings | `self` refused; MCP refuses readings; hosts set `src` in their own code | +| A forged env label | the honest limit: a source is the host's word, logged and replayed, not shown true; Design C covers rewards, readings stay unauthenticated | +| Unit drift (ms vs s) | unit in the digest; out-of-range readings refused | +| A stale reward pays an older self | eligibility; expiry after 4 half-lives | +| Outcomes never settled | `max_open`, expiry, `open` in every stance | +| A duplicated or replayed payment | the decision is closed: B-R2 | +| The agent cancels to dodge a correction | `cancel` needs env or human; MCP refuses it | +| A restored state repeats turn numbers | `paid.stance` names the paid stance's digest for the host to compare | + +## Alternatives considered + +- Senses as plain number inputs (0.8): no normal, no habituation, no per-reading provenance, no past in `why`. +- Host-computed z: the normal leaves the log, and a host can hand in a pre-judged surprise. +- Clock decay of normals: silence would erase the durable difference. +- A familiarity ramp for new individuals: the declared prior is already the starting normal; widen `prior.var` instead. +- Every turn opens a decision: unaddressed feedback would almost always be ambiguous; `await` keeps 0.8 hosts unchanged. +- Credit spread over recent stances without addressing: still misattributes. +- Refusing `await` at `max_open`: blocks the agent's turn on bookkeeping; eviction is recorded instead. + +## Open questions for contributors + +1. Should open decisions survive pause and resume? Closing them matches 0.8, but outcomes landing during a pause are lost. +2. Should `for` carry the stance digest (`for: {turn, stance}`) so a restored state cannot pay a different decision? +3. Should eligibility decay by events, by clock hours, or not at all until expiry? +4. Should `human` readings teach a normal, or only move the stance? +5. Should 0.9.0 ship `persona migrate OLD NEW --state S` to carry moods, history and learned weights into a persona that only + adds blocks? From c2ba3cd758169775dc16c26a40558670d1d02482 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 07:12:58 -0700 Subject: [PATCH 12/14] persona: a test comment names the RFC's arithmetic, not an internal file; docs wording --- docs/persona.md | 2 +- probbit-cli/src/persona.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/persona.md b/docs/persona.md index e4ec0ff..e6acad5 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -501,7 +501,7 @@ For turn t of an individual (seed s), with inputs x_t: + sum over history features f of min(value_f, cap_f) x effect_f(v,l)`, with `scale` = 1 for a true flag or the matching level, the value for a number input, 0 otherwise, and Δ_v the learned weights after this turn's feedback (section 2.8; 0 for a trait that does not learn). With a senses block (section 2.11) - the sense step runs first and its lowering joins the inputs: `sense__up` and `sense__down` are number inputs with + the sense step runs before this one and its lowering joins the inputs: `sense__up` and `sense__down` are number inputs with gain g_gain and the sense's effects (negated for `down`); a sense not read this turn adds nothing. 2b. **`pursue`** (a drives block, section 2.9): one more trait variable over the goal ids, after the declared traits. Its field per goal g is step 2's (prior from `interest`, learned weights if `pursue` learns, input and history effects on diff --git a/probbit-cli/src/persona.rs b/probbit-cli/src/persona.rs index 2b76551..ece0d6a 100644 --- a/probbit-cli/src/persona.rs +++ b/probbit-cli/src/persona.rs @@ -2887,7 +2887,7 @@ mod tests { (ss, out) } - /// RFC 0001 A.3 against the lab arithmetic (ARITH-CHECK.json): habituation (zd 3.378359 -> 1.027525 from reading 6 on, the + /// RFC 0001 A.3 against its arithmetic, computed independently in Python: habituation (zd 3.378359 -> 1.027525 from reading 6 on, the /// ratio 0.304 at reading 20), surprise (6.0 vs 1.75286 after 40 quiet / 40 readings at rate 0.3: 3.42 at zcap 6, 1.71 at zcap /// 3), the closed form of n identical readings within 1e-5 over 12 readings, the variance cap after alternating range ends #[test] From 9709656bc3f705a6f53fce7709716c3ddc6dd8a8 Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Wed, 14 Oct 2026 07:13:32 -0700 Subject: [PATCH 13/14] examples, docs: plainer wording of what a sense does --- docs/persona.md | 4 ++-- examples/persona/sensed.yaml | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/persona.md b/docs/persona.md index e6acad5..57e1bef 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -388,8 +388,8 @@ document it produces is the same, byte for byte, as before the key existed. A sense is a reading the host measures (a tool failure, a latency, a message tempo, a silence) in declared units, from a named source. The engine keeps a learned **normal** per sense (mean, variance, count) and turns each reading into a capped z-score -against it, which moves moods and traits as any input does. The same reading moves two individuals differently once their -normals differ, and `why` names the normal a reading was judged against. Design notes and arithmetic: +against it, which moves moods and traits as any input does; `why` names the normal a reading was judged against. Design +notes and arithmetic: [docs/rfcs/0001-senses-and-reward.md](rfcs/0001-senses-and-reward.md). ```yaml diff --git a/examples/persona/sensed.yaml b/examples/persona/sensed.yaml index f983729..38a5cc3 100644 --- a/examples/persona/sensed.yaml +++ b/examples/persona/sensed.yaml @@ -1,7 +1,6 @@ # A fictional persona with senses: an agent that runs tools for a person. probbit persona format 1 (docs/persona.md §2.11). -# Four readings the host measures (tool failures, tool latency, message tempo, silence) are judged against the normal this -# individual learns from its own log, so the same reading moves two lives differently, and `why` names the normal it was -# judged against. The host acts on caution: bold = go ahead, measured = show the plan, then go, careful = show the diff and wait. +# Four readings the host measures (tool failures, tool latency, message tempo, silence), each judged as a capped z-score +# against a normal (mean, variance, count) kept from this individual's earlier readings; `why` names the normal it used. The host acts on caution: bold = go ahead, measured = show the plan, then go, careful = show the diff and wait. probbit_persona: 1 identity: name: Vale From 55e0db619e0f78b3f17994fea74ff46fd54d117e Mon Sep 17 00:00:00 2001 From: BitmapAsset Date: Thu, 15 Oct 2026 16:30:40 -0700 Subject: [PATCH 14/14] RFC 0001 wave 2: action-addressed feedback (0.9.0) (#34) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * bench/individuality: p0 passes repository-relative paths; EXPECTED re-recorded with 0.8.2 A fuzz document that finds a counterexample names the persona path as given in its explain and replay strings, so fuzz/adaptive-fixture depended on the clone's location. Every command already runs at the repository root; personas and rules are now passed relative to it. Re-recorded with the same released 0.8.2 binary: one line changed (fuzz/adaptive-fixture, 43,646 bytes). Logged in the bench README. * persona: learning.credit read strictly; await/for/cancel read and echoed; the credit step and B-R1..B-R6 (WIP) * live: control lines close open decisions, verify summary open, verify --actions; mcp refuses cancel; the one stderr line for credit keys without the block; p0 check accepts it (WIP) * bench/individuality: MANIFEST p0.py line and the README log for the credit-keys stderr line * fuzz: payments resolved against each state (late, reordered, previous, closed, unknown, mismatch; cancels), refused ones change nothing, exported scripts concrete; monitor: open decisions with eligibility, the payment and closures (WIP) * examples/agent-harness: the addressed-outcome variant (addressed.json, late.py, its test) and its cross-OS golden * fuzz: re-running a shrunk counterexample with its payments resolved is not a searched turn, and a persona without a credit block keeps its script as found * persona, live: tests for action-addressed feedback: eligibility at ages 0/3/10/32/127, expiry at 128, eviction, every refusal row B-R1..B-R6 (and byte for byte in live), absorbed, the strict credit state, e = 1 equals 0.8 on every shipped learning persona, control lines, P3c 40 x 300 with a model of the bookkeeping, probbit check on a credit persona * docs: action-addressed feedback (persona.md §2.8 credit, §4 stance credit, §5.1 state, §5.6 payments in fuzz, §5.7 control lines and credit in live, §5.8 monitor, §7), CHEATSHEET, CHANGELOG, the RFC copy (question 2 decided, B-R6), man page for live verify --actions * bench/individuality: metric c frozen before its first run (dispatch.yaml with a credit block and its no-block twin, the seeded draws and their generator, bars-c.json; the plain-inputs control persona for metric a); credit.py and run.py run it * bench/individuality: credit.py runs its 50 host-driven runs side by side, re-runs only the runs that refused events, and reports evictions, expiries and payment ages per run (logged in the README) * bench/individuality: twins_addressed.py re-measures metric a with Design B on the frozen fixture and bars, with the plain-inputs control; BENCHMARKS.md §11 (metric c and the re-measured twins) * examples/agent-harness: README section for the addressed variant; docs, bench and comments: plainer wording (law check) * bench/individuality: README intro: this release runs metric c; metric a's frozen streams and twins_addressed.py * bench/individuality: record the frozen metric a result on this release --------- Co-authored-by: BitmapAsset --- BENCHMARKS.md | 44 ++ CHANGELOG.md | 13 + bench/individuality/README.md | 67 ++- bench/individuality/credit.py | 304 +++++++++++++ bench/individuality/fixtures/MANIFEST | 22 +- bench/individuality/fixtures/bars-c.json | 6 + .../fixtures/credit/draws-0.jsonl | 300 +++++++++++++ .../fixtures/credit/draws-1.jsonl | 300 +++++++++++++ .../fixtures/credit/draws-2.jsonl | 300 +++++++++++++ .../fixtures/credit/draws-3.jsonl | 300 +++++++++++++ .../fixtures/credit/draws-4.jsonl | 300 +++++++++++++ .../fixtures/credit/draws-5.jsonl | 300 +++++++++++++ .../fixtures/credit/draws-6.jsonl | 300 +++++++++++++ .../fixtures/credit/draws-7.jsonl | 300 +++++++++++++ .../fixtures/credit/draws-8.jsonl | 300 +++++++++++++ .../fixtures/credit/draws-9.jsonl | 300 +++++++++++++ bench/individuality/fixtures/credit_draws.py | 39 ++ .../fixtures/dispatch-noblock.yaml | 67 +++ bench/individuality/fixtures/dispatch.yaml | 70 +++ bench/individuality/fixtures/p0/EXPECTED | 2 +- .../individuality/fixtures/sensed-plain.yaml | 129 ++++++ bench/individuality/p0.py | 63 ++- bench/individuality/run.py | 16 +- bench/individuality/twins_addressed.py | 150 +++++++ docs/CHEATSHEET.md | 17 +- docs/persona.md | 99 ++++- docs/probbit.1 | 13 +- docs/rfcs/0001-senses-and-reward.md | 25 +- examples/agent-harness/README.md | 15 + examples/agent-harness/addressed.json | 78 ++++ examples/agent-harness/golden/describe.json | 1 + examples/agent-harness/golden/events.json | 75 ++++ .../agent-harness/golden/final-state.json | 1 + .../agent-harness/golden/program-turn0.json | 1 + examples/agent-harness/golden/state0.json | 1 + examples/agent-harness/golden/turns.jsonl | 16 + examples/agent-harness/late.py | 70 +++ examples/agent-harness/test_harness.py | 13 + probbit-cli/src/fuzz.rs | 37 +- probbit-cli/src/live.rs | 44 ++ probbit-cli/src/main.rs | 31 +- probbit-cli/src/mcp.rs | 18 +- probbit-cli/src/monitor.html | 3 + probbit-cli/src/monitor.rs | 19 +- probbit-cli/src/persona.rs | 404 ++++++++++++++++-- probbit-cli/tests/live.rs | 147 ++++++- probbit-cli/tests/persona.rs | 27 ++ 47 files changed, 5036 insertions(+), 111 deletions(-) create mode 100644 bench/individuality/credit.py create mode 100644 bench/individuality/fixtures/bars-c.json create mode 100644 bench/individuality/fixtures/credit/draws-0.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-1.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-2.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-3.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-4.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-5.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-6.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-7.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-8.jsonl create mode 100644 bench/individuality/fixtures/credit/draws-9.jsonl create mode 100644 bench/individuality/fixtures/credit_draws.py create mode 100644 bench/individuality/fixtures/dispatch-noblock.yaml create mode 100644 bench/individuality/fixtures/dispatch.yaml create mode 100644 bench/individuality/fixtures/sensed-plain.yaml create mode 100644 bench/individuality/twins_addressed.py create mode 100644 examples/agent-harness/addressed.json create mode 100644 examples/agent-harness/golden/describe.json create mode 100644 examples/agent-harness/golden/events.json create mode 100644 examples/agent-harness/golden/final-state.json create mode 100644 examples/agent-harness/golden/program-turn0.json create mode 100644 examples/agent-harness/golden/state0.json create mode 100644 examples/agent-harness/golden/turns.jsonl create mode 100644 examples/agent-harness/late.py diff --git a/BENCHMARKS.md b/BENCHMARKS.md index bb4642e..023fb7a 100644 --- a/BENCHMARKS.md +++ b/BENCHMARKS.md @@ -1141,3 +1141,47 @@ re-measured when action-addressed feedback (RFC 0001 Design B, metric c) lands. block (9,600 live turns and as many replayed, `describe`, `lint --seeds 0-99`, `fuzz` and `prove` documents): 0 differ. 629 are byte-identical; 24 are the stderr of `live` runs whose scripts send a `senses` key, identical once the one line naming it is removed. All 8 recorded strands verify, and the tutor's continues with the recorded bytes. + +## §11 Action-addressed feedback: credit accuracy, and the twins re-measured (`python3 bench/individuality/run.py --only c,d,e`, `python3 bench/individuality/twins_addressed.py`, stdlib; development build of 0.9.0) + +Metric c's fixtures, draws and bars were frozen in `bench/individuality/fixtures/MANIFEST` before it was ever run; three runs +gave the same values. Ten individuals of an act-or-ask policy (`fixtures/dispatch.yaml`: the shipped dispatch policy with a +credit block) make 300 decisions each; a host reads each stance's action, draws its outcome (good with probability 0.8 after +act, 0.4 after ask) and sends it back, on time (stream 1) or 0 to 6 events late with cancels, duplicates and payments of +turns never opened (stream 2). An independent Python learner replays RFC 0001 B.2 from the stance documents and the events. + +| metric | measured | bar | | +|---|---|---|---| +| c1 share of the applied step equal to the learner's (and the same paid turn and eligibility), over 8,393 accepted payments in 50 runs | 100 % | >= 99 % | passes | +| c2 events whose Δ equals the learner's, after every one of 15,000 accepted events | 100 % | 100 % | passes | +| c3 outcomes accepted, of the 3,802 whose decision was open on arrival (streams 1 and 2, addressed) | 100 % | >= 99 % | passes | +| c4 duplicates, outcomes after a cancel and unknown turns (addressed) and ambiguous unaddressed feedback refused; runs equal to the run without their refused events | 100 % of 2,793; 50 of 50 byte-identical | 100 %; all | passes | + +Also measured (not gated): the learner's open decisions equal the engine's `open_credit` after every event. Without the block +(0.8 semantics) 27 % of the outcomes credit a stance that took another level than the decision they were about, and all 138 +duplicates and unknown payments move the weights; the 0.8 workaround (keep an outcome only when the previous stance took the +paid level) keeps 72 % of them. Act rate in the last 100 decisions: 0.655 on time, 0.628 addressed, 0.424 under 0.8 +semantics, 0.657 with the workaround. + +Reading it. Every accepted payment moved exactly the step RFC 0001 B.2 gives for the decision it named, and every duplicate, +cancelled or unknown payment was refused without changing anything. The stream is busier than its design intended: each +decision yields a message and an event carries at most one, so messages queue (254 still undelivered at the end over the +ten individuals) and with every event awaiting, 67 % of the addressed decisions were evicted at `max_open` 8 before their +outcome arrived (1,710 such outcomes refused, B-R2); paid outcomes were 0 to 7 events late. The fixture is not changed after +the fact. + +**The twins re-measured with Design B** (`twins_addressed.py`, the frozen metric a fixture, streams, probes and bars; the +credit block and the addressed feedback added at run time: room A's praise names the decision 2 events earlier, room B's +criticism the one 3 events earlier): + +| run | a1 mean d_life (95 % interval) | a2 tv_life vs min(tv_seed_A, tv_seed_B) | | +|---|---|---|---| +| as frozen (rewards pay the previous stance) | 0.145 (0.096 to 0.199) | 0.1307 vs 0.1329 | fails | +| addressed (Design B) | 0.1725 (0.1175 to 0.235) | 0.1223 vs 0.1366 | fails | +| control: readings as plain 0.8 number inputs against a fixed prior, rewards unaddressed (reported) | 0.155 (0.099 to 0.219) | 0.0295 vs 0.1296 | — | + +Reading it. Addressing the rewards raises the share of probes whose action differs between two lives from 0.145 to 0.1725, +below the 0.30 bar. In both rooms the feedback still moves the learned caution weights away from `careful` (mean Δ careful +−0.32 after room A, −0.11 after room B), so the two lives drift the same way, and on the 10 probes with a tool failure the +habit and the failure's push make both lives careful or measured (23 of 400 actions differ). The control shows what the +normals add: with plain inputs the odds distance between two lives falls from 0.13 to 0.03. diff --git a/CHANGELOG.md b/CHANGELOG.md index 7aecd35..175e847 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,10 +15,23 @@ All notable changes to this project are documented here. The format follows per sense and an alert when a normal moved over `drift_cap / 2` within 50 events. `examples/persona/sensed.yaml` (with its golden and rules) and `bench/individuality/` (benchmark metrics a, b, d and e; the P0 corpus) are new. Design notes: `docs/rfcs/0001-senses-and-reward.md`. +- **Action-addressed feedback** (docs/persona.md §2.8): an optional `learning.credit` block. An event can mark its decision + as awaiting an outcome (`await`), a reward can name the decision it pays for (`for: `), and decisions can be + cancelled (`cancel`). Credit goes to the paid decision's own odds, scaled by an eligibility that halves per + `half_life_events` of delay; at most `max_open` decisions wait; ambiguous, duplicate, cancelled and unknown payments are + refused whole. Without `for`, feedback pays the previous stance as before. +- `for: {turn, stance}` binds the paid stance's digest (a mismatch is refused); every stance with a credit block carries + `credit` (the payment, the decisions closed, the ones still open, its own digest). A control line closes the open + decisions. `live verify` adds `open` to its summary, and `live verify --actions FILE` compares a host's action log with + the released levels; `monitor` draws the open decisions with their eligibility; `fuzz` adds late, reordered, duplicated, + cancelled and unknown payments; the MCP turn tools refuse `cancel`. `examples/agent-harness/addressed.json` (with + `late.py` and its golden) and benchmark metric c are new. ### Changed - `live` says once on stderr when a persona without a senses block receives a `senses` key (still an undeclared input, listed in `ignored`). The monitor's panel of the event's inputs is labelled INPUTS (it was SENSES). +- `live` says once on stderr when a persona without a credit block receives `await`, `for` or `cancel` (still undeclared + inputs, listed in `ignored`; feedback pays the previous stance). ## 0.8.3 - unreleased diff --git a/bench/individuality/README.md b/bench/individuality/README.md index 5403295..97c2188 100644 --- a/bench/individuality/README.md +++ b/bench/individuality/README.md @@ -10,9 +10,10 @@ PROBBIT_BIN=target/release/probbit python3 bench/individuality/run.py --only a,b PROBBIT_BIN=target/release/probbit python3 bench/individuality/p0.py check # P0: byte-identical documents ``` -**This release** ships senses (RFC 0001 Design A) and metrics a, b, d and e. Metric c (credit) needs action-addressed feedback -(Design B) and metric f a lineage budget (Design C); `run.py` skips both with a note. Without the credit block, rewards pay the -stance just before them, so the streams below carry no `await` or `for` keys. +**This release** ships senses (RFC 0001 Design A), action-addressed feedback (Design B) and metrics a, b, c, d and e. Metric f +needs a lineage budget (Design C); `run.py` skips it with a note. Metric a's frozen streams carry no `await` or `for` keys (the +fixture was frozen before Design B, so its rewards pay the stance just before them); `twins_addressed.py` re-measures it with +the credit block and addressed feedback added at run time. **Freezing.** The fixtures, generators and bars are committed with their sha256 in `fixtures/MANIFEST` before any run. `run.py` checks every listed file before it measures anything (exit 2 when one differs). Any later change is logged at the end @@ -32,7 +33,12 @@ bench/individuality/ lives.py the seeded generator of the streams; its outputs are committed in lives/ and checked against MANIFEST bars.json the gated bars gen.py, p0/ the P0 corpus: personas, scripts, the recorded outputs and strands - twins.py habituation.py replay.py habits.py + dispatch.yaml metric c: the shipped dispatch policy with a credit block; dispatch-noblock.yaml without it + credit_draws.py metric c's seeded draws per decision, committed in credit/ and checked against MANIFEST + bars-c.json metric c's gated bars + sensed-plain.yaml metric a's reported control: the senses as plain 0.8 number inputs + twins.py habituation.py credit.py replay.py habits.py + twins_addressed.py metric a re-measured with Design B (and the control), on the frozen fixture and bars ``` ## Shared fixtures @@ -98,7 +104,7 @@ Measures whether the same reading lands differently after a learned normal, and b4 ≥ 95 %; b5 ≥ 95 %. - **Script.** `habituation.py`. -## Metric c: credit accuracy (with RFC Design B; skipped in this release) +## Metric c: credit accuracy (with RFC Design B) Measures whether a late, reordered or cancelled outcome credits the decision it was for: an act-or-ask policy, 10 individuals × 300 events, outcomes delivered on time and up to 6 events late (10 % cancelled, 5 % sent twice, 2 % paying a turn never @@ -106,6 +112,24 @@ opened), against an independent Python learner. Bars: c1 ≥ 99 % of the applied events with the oracle's Δ, c3 ≥ 99 % of open outcomes accepted, c4 = 100 % of duplicates, late payments and unknown turns refused, each refused run byte-identical to the run without the refused events. +- **Fixture.** `fixtures/dispatch.yaml` is the shipped dispatch policy (`examples/persona/dispatch-policy.yaml`) with a credit + block (`max_open` 8, `half_life_events` 32); `fixtures/dispatch-noblock.yaml` is the same without it, for variants (iii) + and (iv). `fixtures/credit_draws.py` draws, per individual from `random.Random(1000 + seed)`, each decision's blast radius + (0.05 to 0.65: no habit binds), its outcome draw, its delay, and whether it is cancelled, sent twice or joined by a payment + of a turn never opened; the draws are committed as `fixtures/credit/draws-.jsonl`. +- **Host.** `credit.py` drives one `probbit live --checkpoint-every 1` per run event by event: it reads each stance's action, + decides the outcome (good when the draw is below 0.8 after `act`, 0.4 after `ask`) and queues it. One message rides on + an event; a second one due on the same event moves to the next (the older decision goes ahead). A second copy of an outcome + is due one event after the original; for a cancelled decision the second copy is an outcome sent after the cancel. A payment + of a turn never opened names turn k + 1000. A refused event is followed by the same decision without its message, so + each run makes 300 decisions. Five runs per individual: stream 1, and on stream 2 (i) addressed, (ii) unaddressed, (iii) + 0.8 semantics (cancels not sent), (iv) the 0.8 workaround. +- **Statistics.** The oracle replays RFC section B.2 from the stance documents and the events, over all five runs: c1 weighs + each accepted payment by the oracle's applied step (and requires the engine's `paid` turn and `e` to match), c2 compares Δ + after every accepted event, c3 counts the outcomes of runs stream 1 and (i) whose decision was open on arrival, c4 the + duplicates, outcomes after a cancel and unknown turns of (i) and the ambiguous unaddressed feedback of (ii), and every run + is re-run without its refused events. + ## Metric d: replay Measures whether an individual is reproducible from its log. @@ -159,6 +183,17 @@ One run on an Apple M4 (development build, 10.0 s): a1 0.145 (interval 0.096–0 bars; b1 0.304149 with 0 of 4,522 values differing, b2 3.422977, b3 100 %, b4 100 % of 232 decisions, b5 100 % of 116 probes, d 0 differing bytes over 240 strands, e 0 violations and 0 breaks over 9,442 stances with 72 bound pass. See BENCHMARKS.md §10. +With action-addressed feedback (development build): c1, c2, c3 and c4 100 % (8,393 payments, 15,000 events, 3,802 open +outcomes, 2,793 refusable, 50 of 50 runs byte-identical without their refused events); metric a re-measured with Design B +(`twins_addressed.py`): a1 0.1725 (interval 0.1175–0.235), a2 0.1223 against 0.1366, both still below their bars; the +plain-inputs control 0.155 and 0.0295. See BENCHMARKS.md §11. + +Metric a fails its bars on this release: a1 0.1725 (interval 0.1175–0.235) against ≥ 0.30, a2 0.1223 against 0.1366. +The bars and the fixtures stay frozen and unchanged. Why they fail: the frozen fixture's readings and its feedback push the +same probes in opposite directions, so the two mechanisms cancel; and at the fixture's gene spread, two individuals differ in +odds more than one individual's two lives do. A pre-registered revision of the fixture is planned for 0.9.1; nothing will be +relabelled. + ## Changes after freezing - `p0.py` (listed in MANIFEST since the P0 record): `check` accepts the one stderr line `live` writes when a script sends a @@ -166,3 +201,25 @@ d 0 differing bytes over 240 strands, e 0 violations and 0 breaks over 9,442 sta outputs apart (`stderr_senses_warning_only`). The recorded outputs, scripts and strands are unchanged. Reason: the line is part of the senses release (an undeclared key is named once); it is not a document, and every document stays byte-identical. MANIFEST's p0.py line was updated with the change. +- `p0.py` and `fixtures/p0/EXPECTED`: the corpus now passes personas and rules by their paths relative to the repository + root, where every command runs. Reason: a fuzz document that finds a counterexample names the persona path as given in + its `explain` and `replay` strings, so `fuzz/adaptive-fixture` (43,726 bytes recorded from one clone) differed from a + clone at another path while the engine's bytes were the same. EXPECTED was re-recorded with the same released 0.8.2 + binary (sha256 in MANIFEST) using relative paths: one line changed (`fuzz/adaptive-fixture`, now 43,646 bytes); every + other output, the scripts and the strands are unchanged. MANIFEST's EXPECTED and p0.py lines were updated with the + change. +- `p0.py` (wave 2): `check` also accepts the one stderr line `live` writes when a script sends `await`, `for` or + `cancel` to a persona without a credit block (RFC 0001 B.4: undeclared inputs, listed in `ignored`, and `live` says + so), on the same terms as the senses line: only where the script carries those keys, once, at its earliest such event, + each mandated line present exactly once. The outputs equal but for these lines are reported apart as + `stderr_warnings_only` (the key was `stderr_senses_warning_only`). EXPECTED, the scripts and the strands are + unchanged; MANIFEST's p0.py line was updated. +- Metric c (wave 2): its fixtures, the draws generator, the draws and its bars (`fixtures/bars-c.json`, the bars of the + metric c section above) were added to MANIFEST in their own section before they were ever run; `run.py` runs metric c. + `fixtures/sensed-plain.yaml` (metric a's reported control: the senses replaced by plain 0.8 number inputs) was frozen in + the same section. No earlier fixture, stream or bar changed. +- `credit.py`, changed after it had run once (no fixture, bar or gated computation changed; every gated value was the same in each + run): the 50 runs go side by side (the host waits on each stance, so a run is latency-bound); a run that refused no + event is not re-run (without refused events it is the same run, and metric d replays every strand); the reported + eviction and expiry shares are given per run, with the age of the addressed payments. The numbers of the run before the change stay in + the history: c1, c2, c3 and c4 1.0, 50/50 pairs identical. diff --git a/bench/individuality/credit.py b/bench/individuality/credit.py new file mode 100644 index 0000000..6206047 --- /dev/null +++ b/bench/individuality/credit.py @@ -0,0 +1,304 @@ +"""Metric c: credit accuracy (Python 3.9, standard library only). + +Individuals 0-9 run fixtures/dispatch.yaml for 300 decisions each: every event is a decision on `action` (act or ask) with a +`blast` reading as a plain input. A host drives one `probbit live` per run event by event: it reads each stance's action, +draws its outcome from the frozen draws (fixtures/credit/, good with probability 0.8 after act, 0.4 after ask) and sends it +back later. Five runs per individual: stream 1 (each outcome on the next event, with `for`) and, on stream 2 (delays 0-6 +events, 10 % of decisions cancelled instead, 5 % of outcomes sent twice, 2 % of events paying a turn never opened; one message +per event, a second one due on the same event moves to the next), (i) addressed (`for`), (ii) unaddressed, (iii) 0.8 +semantics (fixtures/dispatch-noblock.yaml, outcomes unaddressed on arrival, cancels not sent) and (iv) the 0.8 workaround (an +outcome is kept only when the previous stance took the paid decision's level). A refused event is followed by the same +decision without its message, so every run makes 300 decisions. An independent learner replays RFC 0001 section B.2 from the +stance documents (levels, odds) and the events, and is compared with the state the strand checkpoints after every event. +""" +import json +import os +import shutil +import subprocess +import tempfile +from concurrent.futures import ThreadPoolExecutor + +import common + +BLOCK = os.path.join(common.FIXTURES, "dispatch.yaml") +NOBLOCK = os.path.join(common.FIXTURES, "dispatch-noblock.yaml") +SEEDS = list(range(10)) +DECISIONS = 300 +RUNS = ["stream1", "addressed", "unaddressed", "v08", "workaround"] +P_GOOD = {"act": 0.8, "ask": 0.4} +LEVELS = ["act", "ask"] +RATE, STEP_CAP, TOTAL_CAP, HALF_LIFE, MAX_OPEN = 0.3, 0.05, 0.4, 32, 8 +TOL = 1e-6 + 1e-12 +WORKERS = 50 # the host waits on each stance: the runs are latency-bound, so all 50 run side by side + + +def r6(x): + """6 decimals as the engine rounds (the exact binary value, printed to 6 places)""" + v = float("%.6f" % x) + return 0.0 if v == 0 else v + + +def clip(x, lo, hi): + return max(lo, min(hi, x)) + + +def draws(seed): + return common.read_jsonl(os.path.join(common.FIXTURES, "credit", "draws-%d.jsonl" % seed)) + + +class Host: + """One `probbit live` process driven event by event: the host sees each stance before it sends the next event.""" + + def __init__(self, persona, seed, strand, errf): + self.err = open(errf, "w") + self.p = subprocess.Popen([common.binary(), "live", persona, "--seed", str(seed), "--clock", "fixed", "--strand", strand, + "--checkpoint-every", "1"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=self.err, + cwd=common.REPO, universal_newlines=True, bufsize=1) + self.events, self.lines = [], [] + + def send(self, ev): + self.p.stdin.write(common.canon(ev) + "\n") + self.p.stdin.flush() + line = self.p.stdout.readline() + if not line: + raise common.SetupError("live ended before its events") + self.events.append(ev) + self.lines.append(line) + return json.loads(line) + + def close(self): + self.p.stdin.close() + self.p.stdout.read() + code = self.p.wait() + self.err.close() + return code + + +def compose(run, base, m, k, level): + """The event that carries message m at step k in this run, and whether the host sent the message or dropped it""" + ev = dict(base) + if m["kind"] == "cancel": + if run in ("v08", "workaround"): + return ev, "dropped" # 0.8 has no cancel + ev["cancel"] = [m["n"]] + ev["src"] = "env:executor" + return ev, "sent" + if run == "workaround" and (k == 0 or m["n"] not in level or level[k - 1] != level[m["n"]]): + return ev, "dropped" # kept only when the previous stance took the paid decision's level + ev["praise" if m["good"] else "criticism"] = True + ev["src"] = "env:outcome" + if run in ("stream1", "addressed"): + ev["for"] = m["n"] + return ev, "sent" + + +def one_run(tmp, seed, run): + """One host-driven run: the events and stance lines, the messages with their fate, the strand, the levels per decision""" + persona = NOBLOCK if run in ("v08", "workaround") else BLOCK + name = "s%d-%s" % (seed, run) + strand = os.path.join(tmp, name + ".strand") + h = Host(persona, seed, strand, os.path.join(tmp, name + ".err")) + dr, late = draws(seed), run != "stream1" + queue, level, msgs = {}, {}, [] + try: + for k in range(DECISIONS): + d = dr[k] + due = sorted(queue.pop(k, []), key=lambda m: (m["n"], m["order"])) + if late and d["unknown"]: + due.append({"kind": "unknown", "n": k + 1000, "order": 2, "good": d["unknown_good"]}) + if len(due) > 1: + queue.setdefault(k + 1, []).extend(due[1:]) # the later ones move to the next event + base = {"blast": d["blast"], "src": "env:host"} + if persona == BLOCK: + base["await"] = True + ev, m = base, (due[0] if due else None) + if m is not None: + ev, m["fate"] = compose(run, base, m, k, level) + m["step"] = k + msgs.append(m) + doc = h.send(ev) + if m is not None: + m["refused"] = "error" in doc + if "error" in doc: + doc = h.send(base) # the decision without its message + if "error" in doc: + raise common.SetupError("s%d %s step %d: the decision itself was refused: %s" % (seed, run, k, json.dumps(doc))) + if doc.get("turn") != k: + raise common.SetupError("s%d %s: turn %s at step %d" % (seed, run, doc.get("turn"), k)) + level[k] = doc["stance"]["action"]["level"] + good = d["u_out"] < P_GOOD[level[k]] + if not late: + queue.setdefault(k + 1, []).append({"kind": "outcome", "n": k, "order": 0, "good": good}) + elif d["cancel"]: + queue.setdefault(k + 1 + d["delay"], []).append({"kind": "cancel", "n": k, "order": 0, "good": good}) + if d["dup"]: + queue.setdefault(k + 2 + d["delay"], []).append({"kind": "stray", "n": k, "order": 1, "good": good}) + else: + queue.setdefault(k + 1 + d["delay"], []).append({"kind": "outcome", "n": k, "order": 0, "good": good}) + if d["dup"]: + queue.setdefault(k + 2 + d["delay"], []).append({"kind": "dup", "n": k, "order": 1, "good": good}) + finally: + code = h.close() + if code not in (0, 2): + raise common.SetupError("s%d %s: live exit %d" % (seed, run, code)) + return {"seed": seed, "run": run, "persona": persona, "block": persona == BLOCK, "strand": strand, "events": h.events, + "lines": h.lines, "msgs": msgs, "level": level, "unsettled": sum(len(v) for v in queue.values())} + + +def oracle(r): + """RFC 0001 B.2 in Python, over every event in order (a refused one changes nothing): per event the open decisions on + arrival (after expiry) and, when accepted, the payment, its eligibility, Δ after it and the step it applied""" + delta, credit, opened, out, t = [0.0, 0.0], {}, [], [], 0 + for ev, line in zip(r["events"], r["lines"]): + doc = json.loads(line) + live = [n for n in opened if t - n - 1 < 4 * HALF_LIFE] if r["block"] else [] + row = {"t": t, "accepted": "error" not in doc, "open": live} + out.append(row) + if not row["accepted"]: + continue + before, opened = list(delta), [n for n in live if n not in ev.get("cancel", [])] + sign = (1 if ev.get("praise") else 0) - (1 if ev.get("criticism") else 0) + paid = e = None + if sign != 0 and t > 0: + paid = ev.get("for", t - 1) if r["block"] else t - 1 + e = 1.0 if paid == t - 1 else r6(0.5 ** ((t - paid - 1) / HALF_LIFE)) + step = [e * clip(sign * RATE * x, -STEP_CAP, STEP_CAP) for x in credit[paid]] + mean = (step[0] + step[1]) / 2 + delta = [r6(clip(dv + (x - mean), -TOTAL_CAP, TOTAL_CAP)) for dv, x in zip(delta, step)] + opened = [n for n in opened if n != paid] + a = doc["stance"]["action"] + credit[t] = [r6((1.0 if lv == a["level"] else 0.0) - a["odds"][lv]) for lv in LEVELS] if a.get("released") else [0.0, 0.0] + if r["block"] and ev.get("await"): + opened.append(t) + opened = opened[-MAX_OPEN:] + row.update({"paid": paid, "e": e, "delta": delta, "step": [x - y for x, y in zip(delta, before)], "after": list(opened)}) + t += 1 + return out + + +def checkpoints(strand): + """The state after every event line (a checkpoint after each)""" + with open(strand, encoding="utf-8") as f: + return [j["state"] for j in (json.loads(x) for x in f if x.strip()) if "checkpoint" in j] + + +def rerun_identical(tmp, r): + """The same run with its refused events deleted: the same stance lines and the same strand, byte for byte""" + kept = [ev for ev, line in zip(r["events"], r["lines"]) if not line.startswith('{"error"')] + evf, strand2 = os.path.join(tmp, "s%d-%s.kept.jsonl" % (r["seed"], r["run"])), os.path.join(tmp, "s%d-%s.kept.strand" % (r["seed"], r["run"])) + common.write_jsonl(evf, kept) + code, out, err = common.run(["live", r["persona"], "--seed", str(r["seed"]), "--clock", "fixed", "--events", evf, "--strand", strand2, + "--checkpoint-every", "1"]) + lines = "".join(x for x in r["lines"] if not x.startswith('{"error"')) + with open(r["strand"], "rb") as a, open(strand2, "rb") as b: + return code == 0 and out.decode("utf-8") == lines and a.read() == b.read() + + +def evaluate(tmp, r): + """Per run: the oracle against the engine (c1, c2), the open outcomes paid (c3), the refusals and the re-run (c4)""" + o, states = oracle(r), checkpoints(r["strand"]) + acc = [x for x in o if x["accepted"]] + if len(states) != len(acc): + raise common.SetupError("s%d %s: %d checkpoints for %d accepted events" % (r["seed"], r["run"], len(states), len(acc))) + docs = [json.loads(x) for x in r["lines"] if not x.startswith('{"error"')] + s = {"events": len(acc), "delta_equal": 0, "step_total": 0.0, "step_equal": 0.0, "payments": 0, "open_mismatch": 0} + prev = [0.0, 0.0] + for row, st, doc in zip(acc, states, docs): + eng = st["learned"]["action"] + s["delta_equal"] += all(abs(x - y) <= TOL for x, y in zip(eng, row["delta"])) + if r["block"]: + s["open_mismatch"] += sorted(x["turn"] for x in st["open_credit"]) != sorted(row["after"]) + if row["paid"] is not None: + w = sum(abs(x) for x in row["step"]) + same = all(abs((x - y) - z) <= TOL for x, y, z in zip(eng, prev, row["step"])) + if r["block"]: + p = doc["credit"]["paid"] or {} + same = same and p.get("turn") == row["paid"] and p.get("e") == row["e"] + s["payments"] += 1 + s["step_total"] += w + s["step_equal"] += w if same else 0.0 + prev = eng + # the open decisions on arrival of each message: the oracle's row of the earliest event sent at its step (the one carrying it) + at, step = {}, 0 + for row in o: + at.setdefault(step, row) + step += row["accepted"] + for m in r["msgs"]: + m["open_on_arrival"] = m["n"] in at[m["step"]]["open"] + m["ambiguous"] = any(n != at[m["step"]]["t"] - 1 for n in at[m["step"]]["open"]) + s["refused_events"] = sum(1 for x in r["lines"] if x.startswith('{"error"')) + # without a refused event the run without them is the same run (metric d replays every strand) + s["identical"] = rerun_identical(tmp, r) if s["refused_events"] else True + s["reran"] = bool(s["refused_events"]) + return s + + +def metric(bars_c, tmp=None): + own = tmp is None + tmp = tmp or tempfile.mkdtemp(prefix="pbit-credit-") + try: + with ThreadPoolExecutor(WORKERS) as ex: + runs = list(ex.map(lambda sr: one_run(tmp, sr[0], sr[1]), [(s, r) for s in SEEDS for r in RUNS])) + stats = list(ex.map(lambda r: evaluate(tmp, r), runs)) + finally: + if own: + shutil.rmtree(tmp, ignore_errors=True) + tot = lambda k: sum(x[k] for x in stats) # noqa: E731 + by = lambda run: [r for r in runs if r["run"] == run] # noqa: E731 + msgs = lambda run, *kinds: [m for r in by(run) for m in r["msgs"] if m["kind"] in kinds and m["fate"] == "sent"] # noqa: E731 + c1 = tot("step_equal") / tot("step_total") if tot("step_total") else 1.0 + c2 = tot("delta_equal") / tot("events") + on_arrival = [m for run in ("stream1", "addressed") for m in msgs(run, "outcome") if m["open_on_arrival"]] + c3 = sum(not m["refused"] for m in on_arrival) / len(on_arrival) + bad = msgs("addressed", "dup", "stray", "unknown") + [m for m in msgs("unaddressed", "outcome", "dup", "stray", "unknown") if m["ambiguous"]] + c4 = sum(m["refused"] for m in bad) / len(bad) + pairs = sum(x["identical"] for x in stats) + # reported + v08 = [(r, m) for r in by("v08") for m in r["msgs"] if m["kind"] == "outcome" and m["fate"] == "sent"] + wrong = sum(r["level"][m["step"] - 1] != r["level"][m["n"]] for r, m in v08 if m["step"] > 0) + wk = [m for r in by("workaround") for m in r["msgs"] if m["kind"] == "outcome"] + act_rate = {run: common.r6(sum(r["level"][k] == "act" for r in by(run) for k in range(DECISIONS - 100, DECISIONS)) / (100 * len(SEEDS))) + for run in ("stream1", "addressed", "v08", "workaround")} + closed = {run: {"evicted": 0, "expired": 0} for run in ("stream1", "addressed", "unaddressed")} + ages = [] + for r in runs: + if r["block"]: + for line in r["lines"]: + c = json.loads(line).get("credit") or {} + for x in c.get("closed", []): + if x["as"] in closed[r["run"]]: + closed[r["run"]][x["as"]] += 1 + if r["run"] == "addressed" and c.get("paid"): + ages.append(json.loads(line)["turn"] - c["paid"]["turn"] - 1) + decisions = len(SEEDS) * DECISIONS + ages.sort() + kinds = {k: len(msgs("addressed", k)) for k in ("outcome", "cancel", "dup", "stray", "unknown")} + res = { + "scope": "fixtures/dispatch.yaml (dispatch-noblock.yaml for iii and iv), individuals 0-9, 300 decisions each, 5 runs; " + "stream 2: outcomes 0-6 events late, 10 % cancelled, 5 % sent twice, 2 % of events paying a turn never opened", + "c1": common.r6(c1), "c2": common.r6(c2), "c3": common.r6(c3), "c4": common.r6(c4), + "c1_payments": tot("payments"), "c2_events": tot("events"), "c3_outcomes_open_on_arrival": len(on_arrival), + "c4_refusable": len(bad), "c4_pairs_identical": "%d/%d" % (pairs, len(stats)), "c4_runs_rerun": tot("reran"), + "open_set_mismatches": tot("open_mismatch"), "refused_events": tot("refused_events"), + "addressed_messages": kinds, + "reported": { + "v08_outcomes_credited_at_another_level": common.r6(wrong / len(v08)) if v08 else None, + "v08_duplicates_strays_unknowns_accepted": len(msgs("v08", "dup", "stray", "unknown")), + "workaround_outcomes_kept": common.r6(sum(m["fate"] == "sent" for m in wk) / len(wk)) if wk else None, + "act_rate_last_100": act_rate, + "evicted_share": {k: common.r6(v["evicted"] / decisions) for k, v in closed.items()}, + "expired_share": {k: common.r6(v["expired"] / decisions) for k, v in closed.items()}, + "addressed_paid_age": {"max": ages[-1], "p50": ages[len(ages) // 2], "p95": ages[int(len(ages) * 0.95)], + "share_at_most_6": common.r6(sum(a <= 6 for a in ages) / len(ages))} if ages else None, + "addressed_outcomes_not_open_on_arrival": sum(not m["open_on_arrival"] for m in msgs("addressed", "outcome")), + "unsettled_at_end_addressed": sum(r["unsettled"] for r in by("addressed")), + }, + } + res["pass"] = {"c1": c1 >= bars_c["c1"]["share_min"], "c2": c2 >= bars_c["c2"]["share_min"], "c3": c3 >= bars_c["c3"]["share_min"], + "c4": c4 >= bars_c["c4"]["share_min"] and (pairs == len(stats) or not bars_c["c4"]["pairs_identical"])} + return res + + +if __name__ == "__main__": + with open(os.path.join(common.FIXTURES, "bars-c.json"), encoding="utf-8") as f: + print(json.dumps(metric(json.load(f)), indent=1, sort_keys=True)) diff --git a/bench/individuality/fixtures/MANIFEST b/bench/individuality/fixtures/MANIFEST index ea3e8ef..e1d89c4 100644 --- a/bench/individuality/fixtures/MANIFEST +++ b/bench/individuality/fixtures/MANIFEST @@ -6,7 +6,7 @@ binary probbit-0.8.2 2c3455ef93092fd5036be766b19e96954cc4d164c15773f1411759fc26b93669 # Re-record: PROBBIT_BIN=<0.8.2 binary> python3 ../p0.py record (gives these bytes); check: python3 ../p0.py check 82bb5b3d140739addac6dcde8e3d31e70d15e46bdb7ece9bb48e2a712286f744 7029 gen.py -c68f9d2dff98e57cf43ebaa91d6737b497e6c04d67d1efc04e5503e529f08d16 65059 p0/EXPECTED +ac483b0746c79c4b1cebca2f357b8b85a97c37c5de961d700bff6a4c8033ddcd 65059 p0/EXPECTED 82e6748f463f6ab7f93a1959176fcf2c7a1cc709d271dd20cae14e0eb731f783 1300 p0/personas/scout.json d7b6541670ac26f143c757f5bcf4ef3151db3452fb80d7a2d604497394f13875 102 p0/props/retry.json c4b513d05a1e0273e8e865104ac8185fcc0648f60319129fc9f49f6a3751f5ee 122 p0/props/tutor.json @@ -53,7 +53,7 @@ a88d3b20b41e9843f2b9ac9b117d5b462ec6b1095c762da531cb98481ff48432 43389 p0/strand 615978432a80e6b8be7fdf6e2382438516dc67acae56c562221c89654cae479e 6815 p0/strands/tutor-s0-0.appended cf9073507dad98bedc4f09ca2e49f34862919240c64c548b7a1dcf58fda4804b 1160 p0/strands/tutor-s0-0.state.json 4db5f3d83a0e6df0ea632c35957cdb0970665422af9054fa50e5468e13a888ab 55008 p0/strands/tutor-s0-0.strand -81b67a8364ac4aa3a884ca1ff8222ac4904e3493cc66cb6d8c8246e8760dcf14 12370 ../p0.py +344a54d4cb6bc9318caf82af6eeb776d774ef7ff1a4548bf9fb67a6061bf00e4 13470 ../p0.py # # Metrics a, b, d and e: frozen 2026-10-14 before their first run (personas, generator, streams, bars). # Re-generate the streams: python3 lives.py (gives these bytes). @@ -68,3 +68,21 @@ a61143fbc343b16ab4fc3a588417c726d3f02747b10f4a0fc3badd141eae1a63 7823 lives/room 4776a2f10511d3366070c3de96b6544ef188404d08855523dcde178684276b41 2787 lives/surprise-quiet.jsonl b27c8ecd32390c74442b6a6269b78df150dbef8f20e37101943f33e189ef1894 2775 lives/surprise-rate.jsonl 63e68a2e9d3ae7b084fc0d627a3a39387550639071f063f5b96e9927eeb4c478 910 lives/tail.jsonl +# +# Metric c, and metric a's re-measure control: frozen 2026-10-14 before their first run (personas, the draws generator, the +# draws, the bars). Re-generate the draws: python3 credit_draws.py (gives these bytes). +4ff28296970b96f4692bfee0ad5d47d156129894394a95c1bdf6080bee75d4cd 2188 dispatch.yaml +8ed7ba7c53ad5fcce38d59e89e39c2e174b84f88741acf62867267d43f53a4c1 2047 dispatch-noblock.yaml +a870ced67bb749e7f9a9ab89f200d050c46fb138fe767bb06df2c62a395e217a 1710 credit_draws.py +54dd7acc30e5a5f7c7b8bc097dd84b7b35940269642465e86a7d8dfcc89ab22b 33847 credit/draws-0.jsonl +73367908c1263e159a3bf69479859717f9ab29cbbaa33f0de016b4b954438fdf 33831 credit/draws-1.jsonl +6dd03598ed4e78477143b2efcb0d1ca935b0042eba838594c4ef001b926aa7c1 33828 credit/draws-2.jsonl +26e2f74b5dfe91a83b9ca5cdc0f2f466f9cfa604dedb4ee3a0e60047d8292047 33808 credit/draws-3.jsonl +bdf289dd7ac017bca7ca24e9a61aa03b9ec18aefc9c17ff31af2c0c2cdb827c6 33813 credit/draws-4.jsonl +9e5163de163f8288d9e960c422873ebe337870acd300b90b1059ed35ca98a36a 33845 credit/draws-5.jsonl +6612ff8b06fee52bf4e1a9498a5d9a5fdac4ff8efb02ec578289d68b4547b5d3 33844 credit/draws-6.jsonl +34991b43085bfc89285f55b3e92449be242bd6bf9de0ee3716286a169186af3e 33806 credit/draws-7.jsonl +4b010ef3db7076da72d610694b3ab43aff78ce3b52b1b8757896981d8869064a 33838 credit/draws-8.jsonl +69de4cbc7f383cee6cb03db47c735f8af2ab567a76562622e284b013cbd200ad 33799 credit/draws-9.jsonl +8dba56c14fcdde61398f52eedfb692b9bd1a07fc4ef0170fa44c6569172f0dab 138 bars-c.json +3033259caa5e227a14180124d88fe602715613a16316f3ab82a4c25bfaae1d0e 3992 sensed-plain.yaml diff --git a/bench/individuality/fixtures/bars-c.json b/bench/individuality/fixtures/bars-c.json new file mode 100644 index 0000000..ed9123f --- /dev/null +++ b/bench/individuality/fixtures/bars-c.json @@ -0,0 +1,6 @@ +{ + "c1": {"share_min": 0.99}, + "c2": {"share_min": 1.0}, + "c3": {"share_min": 0.99}, + "c4": {"share_min": 1.0, "pairs_identical": true} +} diff --git a/bench/individuality/fixtures/credit/draws-0.jsonl b/bench/individuality/fixtures/credit/draws-0.jsonl new file mode 100644 index 0000000..25934ec --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-0.jsonl @@ -0,0 +1,300 @@ +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":0,"u_out":0.669826,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":1,"dup":false,"k":1,"u_out":0.22182,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":0,"dup":false,"k":2,"u_out":0.458064,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":true,"delay":1,"dup":false,"k":3,"u_out":0.691531,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":1,"dup":false,"k":4,"u_out":0.983088,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":5,"dup":false,"k":5,"u_out":0.814172,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":2,"dup":false,"k":6,"u_out":0.292038,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":3,"dup":false,"k":7,"u_out":0.119701,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":1,"dup":false,"k":8,"u_out":0.011944,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":1,"dup":false,"k":9,"u_out":0.859377,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":2,"dup":false,"k":10,"u_out":0.3474,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":false,"k":11,"u_out":0.07373,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":4,"dup":false,"k":12,"u_out":0.323683,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":4,"dup":false,"k":13,"u_out":0.375556,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":14,"u_out":0.201046,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":0,"dup":false,"k":15,"u_out":0.557115,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":true,"delay":1,"dup":false,"k":16,"u_out":0.591078,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":6,"dup":false,"k":17,"u_out":0.019853,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":18,"u_out":0.784105,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":3,"dup":false,"k":19,"u_out":0.992715,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":2,"dup":false,"k":20,"u_out":0.700327,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":21,"u_out":0.214123,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":22,"u_out":0.605024,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":5,"dup":false,"k":23,"u_out":0.72516,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":3,"dup":false,"k":24,"u_out":0.254571,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":5,"dup":false,"k":25,"u_out":0.290251,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":26,"u_out":0.922404,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":true,"delay":6,"dup":false,"k":27,"u_out":0.805131,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":4,"dup":false,"k":28,"u_out":0.689869,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":6,"dup":false,"k":29,"u_out":0.424606,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":3,"dup":false,"k":30,"u_out":0.539918,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":3,"dup":false,"k":31,"u_out":0.741161,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":4,"dup":false,"k":32,"u_out":0.06371,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":6,"dup":false,"k":33,"u_out":0.029917,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":5,"dup":false,"k":34,"u_out":0.934856,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":35,"u_out":0.125765,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":2,"dup":false,"k":36,"u_out":0.221054,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":1,"dup":false,"k":37,"u_out":0.907541,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":true,"delay":0,"dup":false,"k":38,"u_out":0.682624,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":39,"u_out":0.84637,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":5,"dup":false,"k":40,"u_out":0.131055,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":true,"delay":1,"dup":false,"k":41,"u_out":0.372348,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":6,"dup":false,"k":42,"u_out":0.455571,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":43,"u_out":0.134852,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":44,"u_out":0.358244,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":true,"delay":4,"dup":false,"k":45,"u_out":0.168734,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":6,"dup":false,"k":46,"u_out":0.99494,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":6,"dup":false,"k":47,"u_out":0.358128,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":2,"dup":false,"k":48,"u_out":0.789003,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":49,"u_out":0.194642,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":6,"dup":false,"k":50,"u_out":0.902449,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":true,"delay":5,"dup":false,"k":51,"u_out":0.610117,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":52,"u_out":0.495507,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":53,"u_out":0.815594,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":54,"u_out":0.114216,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":0,"dup":true,"k":55,"u_out":0.62465,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":0,"dup":false,"k":56,"u_out":0.984966,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":57,"u_out":0.425219,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":58,"u_out":0.463796,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":59,"u_out":0.186831,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":60,"u_out":0.168246,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":61,"u_out":0.272755,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":5,"dup":false,"k":62,"u_out":0.505397,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":3,"dup":false,"k":63,"u_out":0.010989,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":6,"dup":false,"k":64,"u_out":0.462425,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":4,"dup":false,"k":65,"u_out":0.946341,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":66,"u_out":0.124434,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":67,"u_out":0.285906,"unknown":true,"unknown_good":false} +{"blast":0.6,"cancel":true,"delay":2,"dup":false,"k":68,"u_out":0.339219,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":6,"dup":false,"k":69,"u_out":0.263226,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":70,"u_out":0.953117,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":4,"dup":true,"k":71,"u_out":0.39953,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":3,"dup":false,"k":72,"u_out":0.682157,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":4,"dup":false,"k":73,"u_out":0.222809,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":true,"delay":6,"dup":false,"k":74,"u_out":0.442124,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":75,"u_out":0.231735,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":4,"dup":false,"k":76,"u_out":0.529838,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":77,"u_out":0.957139,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":78,"u_out":0.882711,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":79,"u_out":0.512634,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":80,"u_out":0.727982,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":81,"u_out":0.934703,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":82,"u_out":0.184085,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":0,"dup":false,"k":83,"u_out":0.284,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":1,"dup":false,"k":84,"u_out":0.971319,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":3,"dup":false,"k":85,"u_out":0.447021,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":2,"dup":false,"k":86,"u_out":0.818976,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":5,"dup":false,"k":87,"u_out":0.495469,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":5,"dup":false,"k":88,"u_out":0.871067,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":89,"u_out":0.528524,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":90,"u_out":0.72406,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":0,"dup":false,"k":91,"u_out":0.649974,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":6,"dup":false,"k":92,"u_out":0.018572,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":4,"dup":false,"k":93,"u_out":0.472967,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":6,"dup":false,"k":94,"u_out":0.995126,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":95,"u_out":0.115641,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":6,"dup":false,"k":96,"u_out":0.1125,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":3,"dup":false,"k":97,"u_out":0.272987,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":98,"u_out":0.015013,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":3,"dup":false,"k":99,"u_out":0.58955,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":0,"dup":false,"k":100,"u_out":0.161107,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":6,"dup":false,"k":101,"u_out":0.573963,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":3,"dup":false,"k":102,"u_out":0.137545,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":103,"u_out":0.53997,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":104,"u_out":0.555162,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":105,"u_out":0.824692,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":106,"u_out":0.466578,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":107,"u_out":0.401082,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":108,"u_out":0.869604,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":6,"dup":false,"k":109,"u_out":0.261421,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":110,"u_out":0.41614,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":111,"u_out":0.59267,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":4,"dup":false,"k":112,"u_out":0.087643,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":2,"dup":false,"k":113,"u_out":0.798286,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":114,"u_out":0.725695,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":115,"u_out":0.669945,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":0,"dup":false,"k":116,"u_out":0.311553,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":1,"dup":false,"k":117,"u_out":0.376577,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":5,"dup":false,"k":118,"u_out":0.320836,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":1,"dup":true,"k":119,"u_out":0.664602,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":3,"dup":false,"k":120,"u_out":0.45537,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":121,"u_out":0.403142,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":5,"dup":false,"k":122,"u_out":0.644092,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":5,"dup":false,"k":123,"u_out":0.731501,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":4,"dup":false,"k":124,"u_out":0.260472,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":125,"u_out":0.580573,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":0,"dup":false,"k":126,"u_out":0.412812,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":true,"delay":5,"dup":false,"k":127,"u_out":0.125659,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":true,"delay":0,"dup":false,"k":128,"u_out":0.366425,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":2,"dup":false,"k":129,"u_out":0.06775,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":0,"dup":false,"k":130,"u_out":0.965127,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":131,"u_out":0.870109,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":2,"dup":false,"k":132,"u_out":0.430471,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":133,"u_out":0.446819,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":true,"delay":6,"dup":false,"k":134,"u_out":0.766591,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":2,"dup":false,"k":135,"u_out":0.454248,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":136,"u_out":0.084407,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":4,"dup":false,"k":137,"u_out":0.611034,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":3,"dup":false,"k":138,"u_out":0.182923,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":139,"u_out":0.005204,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":0,"dup":false,"k":140,"u_out":0.505787,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":141,"u_out":0.251161,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":0,"dup":true,"k":142,"u_out":0.789048,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":143,"u_out":0.907424,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":6,"dup":false,"k":144,"u_out":0.533748,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":145,"u_out":0.788805,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":5,"dup":false,"k":146,"u_out":0.984778,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":0,"dup":false,"k":147,"u_out":0.21815,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":148,"u_out":0.068996,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":0,"dup":false,"k":149,"u_out":0.464932,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":3,"dup":false,"k":150,"u_out":0.938255,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":2,"dup":true,"k":151,"u_out":0.435022,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":3,"dup":false,"k":152,"u_out":0.761261,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":153,"u_out":0.048991,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":6,"dup":true,"k":154,"u_out":0.562629,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":155,"u_out":0.415156,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":156,"u_out":0.517704,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":157,"u_out":0.07008,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":0,"dup":false,"k":158,"u_out":0.58764,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":5,"dup":true,"k":159,"u_out":0.54869,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":2,"dup":false,"k":160,"u_out":0.349604,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":6,"dup":false,"k":161,"u_out":0.756625,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":2,"dup":false,"k":162,"u_out":0.546444,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":163,"u_out":0.792076,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":4,"dup":false,"k":164,"u_out":0.529684,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":165,"u_out":0.622743,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":6,"dup":false,"k":166,"u_out":0.645175,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":3,"dup":false,"k":167,"u_out":0.092445,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":3,"dup":false,"k":168,"u_out":0.88812,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":true,"delay":0,"dup":false,"k":169,"u_out":0.562383,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":170,"u_out":0.501222,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":171,"u_out":0.577507,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":0,"dup":true,"k":172,"u_out":0.859675,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":1,"dup":false,"k":173,"u_out":0.237995,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":3,"dup":false,"k":174,"u_out":0.794109,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":175,"u_out":0.835936,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":true,"delay":0,"dup":false,"k":176,"u_out":0.828097,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":177,"u_out":0.826235,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":6,"dup":false,"k":178,"u_out":0.550189,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":179,"u_out":0.890203,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":3,"dup":false,"k":180,"u_out":0.097337,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":2,"dup":false,"k":181,"u_out":0.104843,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":5,"dup":false,"k":182,"u_out":0.663891,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":183,"u_out":0.105212,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":true,"delay":5,"dup":false,"k":184,"u_out":0.689615,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":185,"u_out":0.241297,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":true,"delay":5,"dup":false,"k":186,"u_out":0.835479,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":5,"dup":false,"k":187,"u_out":0.304516,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":188,"u_out":0.760857,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":189,"u_out":0.580505,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":1,"dup":false,"k":190,"u_out":0.359699,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":2,"dup":false,"k":191,"u_out":0.830631,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":192,"u_out":0.980872,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":193,"u_out":0.83448,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":194,"u_out":0.07528,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":195,"u_out":0.773334,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":1,"dup":false,"k":196,"u_out":0.950157,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":5,"dup":false,"k":197,"u_out":0.042727,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":4,"dup":false,"k":198,"u_out":0.452372,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":4,"dup":false,"k":199,"u_out":0.2756,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":200,"u_out":0.451149,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":201,"u_out":0.112404,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":2,"dup":false,"k":202,"u_out":0.53729,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":0,"dup":false,"k":203,"u_out":0.827641,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":0,"dup":false,"k":204,"u_out":0.383101,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":0,"dup":false,"k":205,"u_out":0.008193,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":3,"dup":false,"k":206,"u_out":0.904151,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":207,"u_out":0.211625,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":208,"u_out":0.99691,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":209,"u_out":0.05421,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":true,"delay":0,"dup":false,"k":210,"u_out":0.220037,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":211,"u_out":0.037843,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":212,"u_out":0.427069,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":213,"u_out":0.187286,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":true,"delay":5,"dup":false,"k":214,"u_out":0.857639,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":4,"dup":false,"k":215,"u_out":0.905915,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":6,"dup":false,"k":216,"u_out":0.602975,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":217,"u_out":0.55527,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":218,"u_out":0.523707,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":1,"dup":false,"k":219,"u_out":0.224392,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":220,"u_out":0.073253,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":221,"u_out":0.731149,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":5,"dup":false,"k":222,"u_out":0.868582,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":3,"dup":false,"k":223,"u_out":0.736586,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":2,"dup":false,"k":224,"u_out":0.279945,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":225,"u_out":0.416285,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":3,"dup":false,"k":226,"u_out":0.790451,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":227,"u_out":0.073718,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":6,"dup":false,"k":228,"u_out":0.638545,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":229,"u_out":0.979678,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":5,"dup":false,"k":230,"u_out":0.289371,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":2,"dup":false,"k":231,"u_out":0.092924,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":0,"dup":false,"k":232,"u_out":0.808467,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":233,"u_out":0.779526,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":3,"dup":false,"k":234,"u_out":0.879923,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":true,"delay":2,"dup":false,"k":235,"u_out":0.138854,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":1,"dup":false,"k":236,"u_out":0.843851,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":237,"u_out":0.80904,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":5,"dup":false,"k":238,"u_out":0.445089,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":2,"dup":false,"k":239,"u_out":0.295927,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":3,"dup":false,"k":240,"u_out":0.379104,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":true,"delay":5,"dup":false,"k":241,"u_out":0.239865,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":242,"u_out":0.129021,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":243,"u_out":0.378932,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":true,"k":244,"u_out":0.215234,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":true,"delay":5,"dup":false,"k":245,"u_out":0.214343,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":1,"dup":false,"k":246,"u_out":0.778176,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":5,"dup":false,"k":247,"u_out":0.125137,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":248,"u_out":0.385384,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":2,"dup":false,"k":249,"u_out":0.820336,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":6,"dup":false,"k":250,"u_out":0.104167,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":3,"dup":false,"k":251,"u_out":0.99652,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":0,"dup":false,"k":252,"u_out":0.858317,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":253,"u_out":0.365652,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":true,"delay":0,"dup":false,"k":254,"u_out":0.821707,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":255,"u_out":0.74333,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":6,"dup":true,"k":256,"u_out":0.051307,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":257,"u_out":0.496678,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":258,"u_out":0.273438,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":true,"delay":5,"dup":false,"k":259,"u_out":0.540344,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":0,"dup":false,"k":260,"u_out":0.134356,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":4,"dup":false,"k":261,"u_out":0.278754,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":262,"u_out":0.538804,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":3,"dup":false,"k":263,"u_out":0.395665,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":6,"dup":false,"k":264,"u_out":0.230741,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":4,"dup":false,"k":265,"u_out":0.133821,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":0,"dup":false,"k":266,"u_out":0.146018,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":267,"u_out":0.794066,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":0,"dup":false,"k":268,"u_out":0.670464,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":3,"dup":false,"k":269,"u_out":0.211839,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":270,"u_out":0.881243,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":5,"dup":false,"k":271,"u_out":0.12433,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":2,"dup":false,"k":272,"u_out":0.944204,"unknown":true,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":2,"dup":false,"k":273,"u_out":0.071984,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":3,"dup":false,"k":274,"u_out":0.579089,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":275,"u_out":0.731169,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":276,"u_out":0.34726,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":true,"delay":3,"dup":false,"k":277,"u_out":0.199752,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":3,"dup":true,"k":278,"u_out":0.993569,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":279,"u_out":0.763899,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":true,"delay":0,"dup":false,"k":280,"u_out":0.322375,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":281,"u_out":0.998209,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":4,"dup":false,"k":282,"u_out":0.914069,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":283,"u_out":0.613329,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":284,"u_out":0.764067,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":285,"u_out":0.779018,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":3,"dup":false,"k":286,"u_out":0.90979,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":287,"u_out":0.741052,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":4,"dup":false,"k":288,"u_out":0.530185,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":289,"u_out":0.315675,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":2,"dup":false,"k":290,"u_out":0.227129,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":4,"dup":false,"k":291,"u_out":0.498402,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":true,"delay":4,"dup":false,"k":292,"u_out":0.352026,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":1,"dup":false,"k":293,"u_out":0.362221,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":294,"u_out":0.652348,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":true,"delay":4,"dup":false,"k":295,"u_out":0.702073,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":296,"u_out":0.357141,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":297,"u_out":0.850138,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":298,"u_out":0.168079,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":299,"u_out":0.744744,"unknown":false,"unknown_good":true} diff --git a/bench/individuality/fixtures/credit/draws-1.jsonl b/bench/individuality/fixtures/credit/draws-1.jsonl new file mode 100644 index 0000000..6c8b5f1 --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-1.jsonl @@ -0,0 +1,300 @@ +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":0,"u_out":0.058626,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":4,"dup":false,"k":1,"u_out":0.72198,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":2,"u_out":0.737088,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":5,"dup":false,"k":3,"u_out":0.909125,"unknown":true,"unknown_good":false} +{"blast":0.43,"cancel":true,"delay":1,"dup":false,"k":4,"u_out":0.406635,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":5,"u_out":0.792044,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":6,"u_out":0.005662,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":1,"dup":false,"k":7,"u_out":0.44365,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":4,"dup":true,"k":8,"u_out":0.688065,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":5,"dup":false,"k":9,"u_out":0.021379,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":6,"dup":false,"k":10,"u_out":0.901001,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":11,"u_out":0.116012,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":0,"dup":false,"k":12,"u_out":0.313867,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":13,"u_out":0.50243,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":14,"u_out":0.073156,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":15,"u_out":0.114486,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":16,"u_out":0.512587,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":true,"delay":4,"dup":false,"k":17,"u_out":0.781874,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":5,"dup":false,"k":18,"u_out":0.749175,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":true,"delay":5,"dup":false,"k":19,"u_out":0.448042,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":20,"u_out":0.721461,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":21,"u_out":0.689229,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":22,"u_out":0.958709,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":2,"dup":false,"k":23,"u_out":0.27964,"unknown":true,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":24,"u_out":0.544339,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":3,"dup":false,"k":25,"u_out":0.730661,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":26,"u_out":0.724891,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":27,"u_out":0.422568,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":4,"dup":false,"k":28,"u_out":0.866875,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":29,"u_out":0.616362,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":true,"delay":6,"dup":false,"k":30,"u_out":0.20311,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":3,"dup":false,"k":31,"u_out":0.821211,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":32,"u_out":0.675033,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":33,"u_out":0.628814,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":34,"u_out":0.737508,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":true,"delay":4,"dup":false,"k":35,"u_out":0.682195,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":4,"dup":false,"k":36,"u_out":0.618552,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":37,"u_out":0.90441,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":0,"dup":false,"k":38,"u_out":0.444864,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":4,"dup":false,"k":39,"u_out":0.393089,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":0,"dup":false,"k":40,"u_out":0.918343,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":0,"dup":false,"k":41,"u_out":0.700565,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":1,"dup":false,"k":42,"u_out":0.124071,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":3,"dup":false,"k":43,"u_out":0.443399,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":3,"dup":false,"k":44,"u_out":0.780593,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":45,"u_out":0.5426,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":5,"dup":false,"k":46,"u_out":0.03789,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":1,"dup":false,"k":47,"u_out":0.562166,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":48,"u_out":0.35687,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":true,"delay":1,"dup":false,"k":49,"u_out":0.875742,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":0,"dup":false,"k":50,"u_out":0.258444,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":3,"dup":false,"k":51,"u_out":0.441069,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":2,"dup":false,"k":52,"u_out":0.245095,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":0,"dup":false,"k":53,"u_out":0.209392,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":0,"dup":false,"k":54,"u_out":0.129243,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":6,"dup":false,"k":55,"u_out":0.519378,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":6,"dup":false,"k":56,"u_out":0.378453,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":6,"dup":false,"k":57,"u_out":0.105586,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":58,"u_out":0.180157,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":59,"u_out":0.087254,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":0,"dup":false,"k":60,"u_out":0.783317,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":61,"u_out":0.892389,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":0,"dup":false,"k":62,"u_out":0.359256,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":6,"dup":false,"k":63,"u_out":0.342772,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":64,"u_out":0.528781,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":4,"dup":false,"k":65,"u_out":0.284106,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":5,"dup":false,"k":66,"u_out":0.762287,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":6,"dup":false,"k":67,"u_out":0.50345,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":1,"dup":false,"k":68,"u_out":0.235002,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":2,"dup":false,"k":69,"u_out":0.60582,"unknown":true,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":5,"dup":false,"k":70,"u_out":0.346347,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":71,"u_out":0.733381,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":72,"u_out":0.861227,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":5,"dup":false,"k":73,"u_out":0.738165,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":5,"dup":false,"k":74,"u_out":0.199704,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":6,"dup":false,"k":75,"u_out":0.414731,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":76,"u_out":0.568918,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":77,"u_out":0.239211,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":5,"dup":false,"k":78,"u_out":0.537499,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":4,"dup":false,"k":79,"u_out":0.045891,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":6,"dup":false,"k":80,"u_out":0.002338,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":2,"dup":false,"k":81,"u_out":0.197489,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":5,"dup":false,"k":82,"u_out":0.397706,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":6,"dup":false,"k":83,"u_out":0.69764,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":5,"dup":false,"k":84,"u_out":0.047775,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":85,"u_out":0.831201,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":86,"u_out":0.514488,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":87,"u_out":0.439632,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":3,"dup":false,"k":88,"u_out":0.594701,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":89,"u_out":0.585274,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":4,"dup":false,"k":90,"u_out":0.180053,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":true,"delay":0,"dup":false,"k":91,"u_out":0.033026,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":92,"u_out":0.456887,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":6,"dup":false,"k":93,"u_out":0.684694,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":94,"u_out":0.833515,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":4,"dup":false,"k":95,"u_out":0.685997,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":6,"dup":true,"k":96,"u_out":0.418708,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":4,"dup":false,"k":97,"u_out":0.966773,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":98,"u_out":0.690746,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":99,"u_out":0.963849,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":3,"dup":false,"k":100,"u_out":0.618411,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":101,"u_out":0.247944,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":2,"dup":false,"k":102,"u_out":0.522201,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":103,"u_out":0.674308,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":104,"u_out":0.533439,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":105,"u_out":0.301317,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":3,"dup":false,"k":106,"u_out":0.906139,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":107,"u_out":0.762547,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":5,"dup":false,"k":108,"u_out":0.211481,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":2,"dup":false,"k":109,"u_out":0.2516,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":110,"u_out":0.858314,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":111,"u_out":0.446137,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":0,"dup":false,"k":112,"u_out":0.956423,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":113,"u_out":0.733478,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":2,"dup":false,"k":114,"u_out":0.14566,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":0,"dup":false,"k":115,"u_out":0.055903,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":1,"dup":false,"k":116,"u_out":0.674738,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":1,"dup":false,"k":117,"u_out":0.371144,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":118,"u_out":0.438257,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":true,"delay":5,"dup":false,"k":119,"u_out":0.042178,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":120,"u_out":0.851707,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":2,"dup":false,"k":121,"u_out":0.657138,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":true,"delay":1,"dup":false,"k":122,"u_out":0.903579,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":0,"dup":false,"k":123,"u_out":0.627777,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":5,"dup":false,"k":124,"u_out":0.902964,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":125,"u_out":0.393491,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":126,"u_out":0.103229,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":true,"delay":4,"dup":false,"k":127,"u_out":0.815837,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":4,"dup":false,"k":128,"u_out":0.479806,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":1,"dup":true,"k":129,"u_out":0.429922,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":true,"delay":5,"dup":true,"k":130,"u_out":0.881317,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":1,"dup":false,"k":131,"u_out":0.587901,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":5,"dup":false,"k":132,"u_out":0.725945,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":133,"u_out":0.157926,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":3,"dup":true,"k":134,"u_out":0.340632,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":135,"u_out":0.758356,"unknown":true,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":6,"dup":false,"k":136,"u_out":0.704654,"unknown":true,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":4,"dup":false,"k":137,"u_out":0.08867,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":138,"u_out":0.169775,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":true,"delay":0,"dup":false,"k":139,"u_out":0.706462,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":140,"u_out":0.694735,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":3,"dup":false,"k":141,"u_out":0.182073,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":142,"u_out":0.539501,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":143,"u_out":0.634227,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":1,"dup":false,"k":144,"u_out":0.451387,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":145,"u_out":0.297037,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":146,"u_out":0.196589,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":147,"u_out":0.167009,"unknown":true,"unknown_good":false} +{"blast":0.23,"cancel":true,"delay":0,"dup":false,"k":148,"u_out":0.45637,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":0,"dup":false,"k":149,"u_out":0.825921,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":2,"dup":false,"k":150,"u_out":0.1584,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":true,"delay":1,"dup":false,"k":151,"u_out":0.820568,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":0,"dup":false,"k":152,"u_out":0.402339,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":153,"u_out":0.344014,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":5,"dup":false,"k":154,"u_out":0.4576,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":155,"u_out":0.188661,"unknown":true,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":0,"dup":false,"k":156,"u_out":0.765682,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":157,"u_out":0.75104,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":158,"u_out":0.049852,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":159,"u_out":0.271714,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":2,"dup":false,"k":160,"u_out":0.496218,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":6,"dup":false,"k":161,"u_out":0.004357,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":3,"dup":true,"k":162,"u_out":0.068711,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":163,"u_out":0.606976,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":164,"u_out":0.317344,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":2,"dup":false,"k":165,"u_out":0.984965,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":3,"dup":false,"k":166,"u_out":0.324495,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":2,"dup":false,"k":167,"u_out":0.822031,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":4,"dup":true,"k":168,"u_out":0.084233,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":5,"dup":false,"k":169,"u_out":0.980718,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":3,"dup":true,"k":170,"u_out":0.864691,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":171,"u_out":0.832918,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":true,"delay":3,"dup":false,"k":172,"u_out":0.028334,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":173,"u_out":0.629973,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":3,"dup":false,"k":174,"u_out":0.205479,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":true,"delay":1,"dup":false,"k":175,"u_out":0.529057,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":true,"delay":3,"dup":false,"k":176,"u_out":0.628057,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":177,"u_out":0.058023,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":6,"dup":false,"k":178,"u_out":0.904477,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":0,"dup":false,"k":179,"u_out":0.356391,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":5,"dup":false,"k":180,"u_out":0.532921,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":5,"dup":false,"k":181,"u_out":0.355935,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":182,"u_out":0.204769,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":0,"dup":false,"k":183,"u_out":0.437053,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":184,"u_out":0.437777,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":6,"dup":false,"k":185,"u_out":0.836985,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":5,"dup":false,"k":186,"u_out":0.562701,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":5,"dup":false,"k":187,"u_out":0.83727,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":188,"u_out":0.244248,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":189,"u_out":0.381834,"unknown":true,"unknown_good":false} +{"blast":0.19,"cancel":true,"delay":3,"dup":false,"k":190,"u_out":0.871008,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":6,"dup":false,"k":191,"u_out":0.382974,"unknown":true,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":192,"u_out":0.762028,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":3,"dup":false,"k":193,"u_out":0.096947,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":2,"dup":false,"k":194,"u_out":0.700968,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":195,"u_out":0.845347,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":4,"dup":false,"k":196,"u_out":0.753387,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":2,"dup":false,"k":197,"u_out":0.810317,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":4,"dup":false,"k":198,"u_out":0.905727,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":199,"u_out":0.550866,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":2,"dup":false,"k":200,"u_out":0.061369,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":2,"dup":false,"k":201,"u_out":0.787826,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":2,"dup":false,"k":202,"u_out":0.239269,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":203,"u_out":0.799072,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":6,"dup":false,"k":204,"u_out":0.080126,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":4,"dup":false,"k":205,"u_out":0.132147,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":5,"dup":false,"k":206,"u_out":0.148099,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":6,"dup":false,"k":207,"u_out":0.015978,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":208,"u_out":0.70195,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":209,"u_out":0.695847,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":1,"dup":false,"k":210,"u_out":0.683022,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":211,"u_out":0.274174,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":212,"u_out":0.577093,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":2,"dup":false,"k":213,"u_out":0.470404,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":214,"u_out":0.895223,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":3,"dup":false,"k":215,"u_out":0.992278,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":3,"dup":false,"k":216,"u_out":0.886191,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":true,"delay":4,"dup":false,"k":217,"u_out":0.27789,"unknown":true,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":5,"dup":false,"k":218,"u_out":0.506489,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":219,"u_out":0.820065,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":5,"dup":false,"k":220,"u_out":0.834307,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":221,"u_out":0.101096,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":6,"dup":false,"k":222,"u_out":0.103472,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":5,"dup":false,"k":223,"u_out":0.406842,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":6,"dup":false,"k":224,"u_out":0.446055,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":6,"dup":false,"k":225,"u_out":0.751637,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":1,"dup":false,"k":226,"u_out":0.952249,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":3,"dup":false,"k":227,"u_out":0.359391,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":3,"dup":false,"k":228,"u_out":0.786428,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":229,"u_out":0.76221,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":6,"dup":false,"k":230,"u_out":0.139124,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":5,"dup":false,"k":231,"u_out":0.922587,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":2,"dup":false,"k":232,"u_out":0.759238,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":233,"u_out":0.537767,"unknown":true,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":1,"dup":true,"k":234,"u_out":0.146375,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":235,"u_out":0.062757,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":4,"dup":false,"k":236,"u_out":0.723789,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":6,"dup":false,"k":237,"u_out":0.641698,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":238,"u_out":0.784985,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":true,"delay":3,"dup":false,"k":239,"u_out":0.656199,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":240,"u_out":0.528351,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":1,"dup":false,"k":241,"u_out":0.617821,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":242,"u_out":0.669925,"unknown":true,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":243,"u_out":0.554601,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":244,"u_out":0.87104,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":0,"dup":false,"k":245,"u_out":0.788628,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":246,"u_out":0.215305,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":6,"dup":false,"k":247,"u_out":0.415698,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":2,"dup":false,"k":248,"u_out":0.820467,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":5,"dup":true,"k":249,"u_out":0.383975,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":2,"dup":false,"k":250,"u_out":0.721949,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":3,"dup":true,"k":251,"u_out":0.337923,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":252,"u_out":0.596807,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":true,"delay":3,"dup":false,"k":253,"u_out":0.199639,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":0,"dup":false,"k":254,"u_out":0.552028,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":true,"delay":2,"dup":false,"k":255,"u_out":0.90479,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":256,"u_out":0.414987,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":2,"dup":false,"k":257,"u_out":0.354905,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":0,"dup":false,"k":258,"u_out":0.073129,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":259,"u_out":0.797323,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":0,"dup":false,"k":260,"u_out":0.488511,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":3,"dup":false,"k":261,"u_out":0.357575,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":true,"delay":2,"dup":false,"k":262,"u_out":0.901643,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":3,"dup":false,"k":263,"u_out":0.83095,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":true,"delay":6,"dup":false,"k":264,"u_out":0.820651,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":4,"dup":false,"k":265,"u_out":0.228957,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":266,"u_out":0.84041,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":5,"dup":true,"k":267,"u_out":0.202694,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":268,"u_out":0.277773,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":2,"dup":false,"k":269,"u_out":0.003229,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":true,"delay":1,"dup":false,"k":270,"u_out":0.867305,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":6,"dup":false,"k":271,"u_out":0.245321,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":272,"u_out":0.237302,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":1,"dup":false,"k":273,"u_out":0.738421,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":274,"u_out":0.383681,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":6,"dup":false,"k":275,"u_out":0.954617,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":true,"delay":4,"dup":false,"k":276,"u_out":0.619478,"unknown":true,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":277,"u_out":0.290223,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":5,"dup":false,"k":278,"u_out":0.088396,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":3,"dup":false,"k":279,"u_out":0.157271,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":4,"dup":false,"k":280,"u_out":0.313623,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":4,"dup":false,"k":281,"u_out":0.176059,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":282,"u_out":0.061978,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":283,"u_out":0.325568,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":3,"dup":false,"k":284,"u_out":0.302315,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":0,"dup":false,"k":285,"u_out":0.547443,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":286,"u_out":0.255363,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":1,"dup":false,"k":287,"u_out":0.776586,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":true,"delay":4,"dup":false,"k":288,"u_out":0.265955,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":2,"dup":false,"k":289,"u_out":0.777636,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":true,"delay":4,"dup":false,"k":290,"u_out":0.997147,"unknown":true,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":291,"u_out":0.959153,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":2,"dup":false,"k":292,"u_out":0.240348,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":293,"u_out":0.78641,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":true,"delay":2,"dup":false,"k":294,"u_out":0.404297,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":5,"dup":false,"k":295,"u_out":0.246258,"unknown":true,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":5,"dup":false,"k":296,"u_out":0.196262,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":6,"dup":false,"k":297,"u_out":0.638475,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":5,"dup":false,"k":298,"u_out":0.870667,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":3,"dup":false,"k":299,"u_out":0.177495,"unknown":false,"unknown_good":false} diff --git a/bench/individuality/fixtures/credit/draws-2.jsonl b/bench/individuality/fixtures/credit/draws-2.jsonl new file mode 100644 index 0000000..de4ac08 --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-2.jsonl @@ -0,0 +1,300 @@ +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":0,"u_out":0.42125,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":true,"delay":4,"dup":false,"k":1,"u_out":0.995844,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":6,"dup":false,"k":2,"u_out":0.676404,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":3,"u_out":0.079963,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":true,"delay":6,"dup":false,"k":4,"u_out":0.289363,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":5,"u_out":0.808677,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":0,"dup":false,"k":6,"u_out":0.179197,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":7,"u_out":0.838121,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":true,"delay":1,"dup":false,"k":8,"u_out":0.083014,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":9,"u_out":0.472251,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":0,"dup":false,"k":10,"u_out":0.149975,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":5,"dup":true,"k":11,"u_out":0.710053,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":5,"dup":false,"k":12,"u_out":0.132346,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":4,"dup":false,"k":13,"u_out":0.031295,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":14,"u_out":0.640054,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":3,"dup":false,"k":15,"u_out":0.922994,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":16,"u_out":0.814523,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":17,"u_out":0.226294,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":18,"u_out":0.101614,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":5,"dup":false,"k":19,"u_out":0.435576,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":2,"dup":false,"k":20,"u_out":0.737509,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":3,"dup":false,"k":21,"u_out":0.433812,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":22,"u_out":0.103147,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":6,"dup":false,"k":23,"u_out":0.789564,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":2,"dup":false,"k":24,"u_out":0.319698,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":3,"dup":true,"k":25,"u_out":0.591268,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":true,"delay":6,"dup":false,"k":26,"u_out":0.365322,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":3,"dup":false,"k":27,"u_out":0.529748,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":1,"dup":false,"k":28,"u_out":0.953765,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":4,"dup":false,"k":29,"u_out":0.237336,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":0,"dup":false,"k":30,"u_out":0.180241,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":31,"u_out":0.183002,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":0,"dup":true,"k":32,"u_out":0.028811,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":33,"u_out":0.035472,"unknown":true,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":2,"dup":false,"k":34,"u_out":0.145027,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":1,"dup":true,"k":35,"u_out":0.870518,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":3,"dup":false,"k":36,"u_out":0.7215,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":6,"dup":false,"k":37,"u_out":0.610905,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":4,"dup":true,"k":38,"u_out":0.894843,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":39,"u_out":0.110486,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":1,"dup":false,"k":40,"u_out":0.77177,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":3,"dup":false,"k":41,"u_out":0.186997,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":2,"dup":false,"k":42,"u_out":0.945944,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":0,"dup":false,"k":43,"u_out":0.968134,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":44,"u_out":0.472607,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":true,"delay":0,"dup":false,"k":45,"u_out":0.341088,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":2,"dup":false,"k":46,"u_out":0.658286,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":3,"dup":false,"k":47,"u_out":0.205593,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":48,"u_out":0.884079,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":49,"u_out":0.281024,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":5,"dup":false,"k":50,"u_out":0.86226,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":5,"dup":false,"k":51,"u_out":0.926961,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":6,"dup":false,"k":52,"u_out":0.733243,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":53,"u_out":0.602315,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":54,"u_out":0.836866,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":55,"u_out":0.501466,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":5,"dup":false,"k":56,"u_out":0.979194,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":2,"dup":false,"k":57,"u_out":0.768906,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":58,"u_out":0.630137,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":3,"dup":false,"k":59,"u_out":0.283378,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":60,"u_out":0.387774,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":2,"dup":false,"k":61,"u_out":0.316947,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":1,"dup":false,"k":62,"u_out":0.106305,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":63,"u_out":0.25455,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":1,"dup":true,"k":64,"u_out":0.469171,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":65,"u_out":0.023702,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":66,"u_out":0.839026,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":67,"u_out":0.587451,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":5,"dup":false,"k":68,"u_out":0.681719,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":1,"dup":false,"k":69,"u_out":0.281885,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":1,"dup":false,"k":70,"u_out":0.080259,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":6,"dup":false,"k":71,"u_out":0.309949,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":72,"u_out":0.709694,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":5,"dup":false,"k":73,"u_out":0.347438,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":4,"dup":false,"k":74,"u_out":0.67769,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":6,"dup":false,"k":75,"u_out":0.147083,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":3,"dup":false,"k":76,"u_out":0.734766,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":1,"dup":false,"k":77,"u_out":0.435956,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":5,"dup":false,"k":78,"u_out":0.932829,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":true,"delay":2,"dup":false,"k":79,"u_out":0.505681,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":80,"u_out":0.898737,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":3,"dup":false,"k":81,"u_out":0.771575,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":3,"dup":false,"k":82,"u_out":0.897817,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":83,"u_out":0.826782,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":3,"dup":false,"k":84,"u_out":0.277187,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":85,"u_out":0.775939,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":86,"u_out":0.416615,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":87,"u_out":0.081354,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":88,"u_out":0.593543,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":0,"dup":false,"k":89,"u_out":0.583237,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":1,"dup":true,"k":90,"u_out":0.762198,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":91,"u_out":0.704939,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":6,"dup":false,"k":92,"u_out":0.796177,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":93,"u_out":0.529313,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":true,"delay":5,"dup":false,"k":94,"u_out":0.133288,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":true,"delay":0,"dup":false,"k":95,"u_out":0.265342,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":96,"u_out":0.890069,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":97,"u_out":0.772972,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":98,"u_out":0.897122,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":6,"dup":false,"k":99,"u_out":0.217298,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":3,"dup":true,"k":100,"u_out":0.710415,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":101,"u_out":0.113266,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":3,"dup":false,"k":102,"u_out":0.767549,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":3,"dup":true,"k":103,"u_out":0.274716,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":3,"dup":false,"k":104,"u_out":0.718181,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":1,"dup":false,"k":105,"u_out":0.703698,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":106,"u_out":0.03363,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":107,"u_out":0.869205,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":108,"u_out":0.124857,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":6,"dup":false,"k":109,"u_out":0.129449,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":110,"u_out":0.210914,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":111,"u_out":0.614734,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":112,"u_out":0.243964,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":113,"u_out":0.458887,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":6,"dup":true,"k":114,"u_out":0.185627,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":true,"delay":6,"dup":false,"k":115,"u_out":0.443734,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":0,"dup":false,"k":116,"u_out":0.540679,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":117,"u_out":0.327363,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":2,"dup":false,"k":118,"u_out":0.893568,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":5,"dup":false,"k":119,"u_out":0.98764,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":3,"dup":false,"k":120,"u_out":0.375463,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":121,"u_out":0.237241,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":122,"u_out":0.810707,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":123,"u_out":0.906743,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":6,"dup":false,"k":124,"u_out":0.318685,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":1,"dup":false,"k":125,"u_out":0.915339,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":126,"u_out":0.669426,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":true,"delay":1,"dup":false,"k":127,"u_out":0.976854,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":6,"dup":false,"k":128,"u_out":0.813634,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":129,"u_out":0.066002,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":3,"dup":false,"k":130,"u_out":0.159756,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":2,"dup":false,"k":131,"u_out":0.504792,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":132,"u_out":0.281226,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":3,"dup":false,"k":133,"u_out":0.235574,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":134,"u_out":0.778278,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":true,"delay":5,"dup":false,"k":135,"u_out":0.04254,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":4,"dup":false,"k":136,"u_out":0.785372,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":1,"dup":false,"k":137,"u_out":0.346562,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":138,"u_out":0.205985,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":139,"u_out":0.82968,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":1,"dup":false,"k":140,"u_out":0.587229,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":true,"k":141,"u_out":0.961572,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":142,"u_out":0.739026,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":4,"dup":false,"k":143,"u_out":0.912198,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":144,"u_out":0.760831,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":5,"dup":false,"k":145,"u_out":0.557187,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":5,"dup":false,"k":146,"u_out":0.209977,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":1,"dup":false,"k":147,"u_out":0.21657,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":3,"dup":false,"k":148,"u_out":0.301729,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":149,"u_out":0.8265,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":3,"dup":false,"k":150,"u_out":0.423667,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":3,"dup":false,"k":151,"u_out":0.78718,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":0,"dup":true,"k":152,"u_out":0.471326,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":153,"u_out":0.147784,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":4,"dup":false,"k":154,"u_out":0.173168,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":6,"dup":false,"k":155,"u_out":0.858779,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":5,"dup":false,"k":156,"u_out":0.733692,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":157,"u_out":0.694863,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":2,"dup":false,"k":158,"u_out":0.683075,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":1,"dup":false,"k":159,"u_out":0.624037,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":3,"dup":false,"k":160,"u_out":0.840943,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":0,"dup":false,"k":161,"u_out":0.567783,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":162,"u_out":0.777438,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":1,"dup":false,"k":163,"u_out":0.270187,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":4,"dup":false,"k":164,"u_out":0.944304,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":3,"dup":true,"k":165,"u_out":0.01795,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":1,"dup":false,"k":166,"u_out":0.361809,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":167,"u_out":0.895316,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":168,"u_out":0.538743,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":5,"dup":true,"k":169,"u_out":0.678089,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":6,"dup":false,"k":170,"u_out":0.455114,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":4,"dup":false,"k":171,"u_out":0.765572,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":0,"dup":false,"k":172,"u_out":0.004175,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":3,"dup":false,"k":173,"u_out":0.84536,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":1,"dup":false,"k":174,"u_out":0.078946,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":true,"delay":6,"dup":false,"k":175,"u_out":0.532887,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":6,"dup":false,"k":176,"u_out":0.666433,"unknown":true,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":4,"dup":false,"k":177,"u_out":0.840337,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":178,"u_out":0.56559,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":true,"delay":0,"dup":false,"k":179,"u_out":0.867135,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":true,"delay":6,"dup":false,"k":180,"u_out":0.042774,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":181,"u_out":0.676719,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":182,"u_out":0.578927,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":183,"u_out":0.332864,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":3,"dup":false,"k":184,"u_out":0.387204,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":185,"u_out":0.846196,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":6,"dup":false,"k":186,"u_out":0.230458,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":2,"dup":false,"k":187,"u_out":0.537837,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":188,"u_out":0.096006,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":4,"dup":false,"k":189,"u_out":0.238595,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":6,"dup":false,"k":190,"u_out":0.84283,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":191,"u_out":0.784037,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":192,"u_out":0.079411,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":0,"dup":true,"k":193,"u_out":0.510542,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":194,"u_out":0.452304,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":true,"delay":3,"dup":false,"k":195,"u_out":0.96257,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":5,"dup":false,"k":196,"u_out":0.482849,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":197,"u_out":0.176258,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":true,"delay":4,"dup":false,"k":198,"u_out":0.342648,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":199,"u_out":0.098607,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":3,"dup":false,"k":200,"u_out":0.606987,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":201,"u_out":0.925153,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":202,"u_out":0.917175,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":3,"dup":false,"k":203,"u_out":0.867186,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":6,"dup":false,"k":204,"u_out":0.255682,"unknown":true,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":3,"dup":false,"k":205,"u_out":0.809279,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":206,"u_out":0.728613,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":5,"dup":false,"k":207,"u_out":0.580553,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":true,"delay":2,"dup":false,"k":208,"u_out":0.737751,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":2,"dup":false,"k":209,"u_out":0.779065,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":0,"dup":false,"k":210,"u_out":0.336148,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":0,"dup":false,"k":211,"u_out":0.557675,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":0,"dup":false,"k":212,"u_out":0.088334,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":5,"dup":false,"k":213,"u_out":0.460382,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":1,"dup":false,"k":214,"u_out":0.755476,"unknown":true,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":6,"dup":false,"k":215,"u_out":0.440531,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":3,"dup":false,"k":216,"u_out":0.377238,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":5,"dup":false,"k":217,"u_out":0.681003,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":218,"u_out":0.843386,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":0,"dup":false,"k":219,"u_out":0.860661,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":1,"dup":false,"k":220,"u_out":0.059958,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":4,"dup":false,"k":221,"u_out":0.388107,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":1,"dup":false,"k":222,"u_out":0.386507,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":5,"dup":false,"k":223,"u_out":0.65137,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":4,"dup":false,"k":224,"u_out":0.299414,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":225,"u_out":0.461039,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":5,"dup":false,"k":226,"u_out":0.68357,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":4,"dup":false,"k":227,"u_out":0.713123,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":6,"dup":false,"k":228,"u_out":0.616984,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":229,"u_out":0.246349,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":1,"dup":false,"k":230,"u_out":0.636681,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":231,"u_out":0.39491,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":0,"dup":true,"k":232,"u_out":0.796391,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":233,"u_out":0.890978,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":5,"dup":false,"k":234,"u_out":0.2314,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":4,"dup":false,"k":235,"u_out":0.136414,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":1,"dup":false,"k":236,"u_out":0.611637,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":237,"u_out":0.423281,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":238,"u_out":0.56463,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":1,"dup":false,"k":239,"u_out":0.849439,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":240,"u_out":0.21632,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":3,"dup":false,"k":241,"u_out":0.583713,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":true,"delay":1,"dup":false,"k":242,"u_out":0.223873,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":243,"u_out":0.003664,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":244,"u_out":0.631637,"unknown":true,"unknown_good":true} +{"blast":0.47,"cancel":true,"delay":2,"dup":false,"k":245,"u_out":0.42975,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":246,"u_out":0.859542,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":0,"dup":false,"k":247,"u_out":0.692486,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":1,"dup":false,"k":248,"u_out":0.909281,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":249,"u_out":0.721482,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":true,"delay":6,"dup":false,"k":250,"u_out":0.780117,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":2,"dup":false,"k":251,"u_out":0.294124,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":6,"dup":false,"k":252,"u_out":0.240087,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":4,"dup":false,"k":253,"u_out":0.703319,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":2,"dup":false,"k":254,"u_out":0.681438,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":4,"dup":false,"k":255,"u_out":0.5681,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":6,"dup":false,"k":256,"u_out":0.154931,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":257,"u_out":0.097912,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":3,"dup":false,"k":258,"u_out":0.345745,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":259,"u_out":0.512453,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":6,"dup":false,"k":260,"u_out":0.221602,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":2,"dup":true,"k":261,"u_out":0.083083,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":262,"u_out":0.111741,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":263,"u_out":0.178214,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":1,"dup":false,"k":264,"u_out":0.058887,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":true,"delay":1,"dup":false,"k":265,"u_out":0.2191,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":5,"dup":false,"k":266,"u_out":0.239739,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":true,"delay":3,"dup":false,"k":267,"u_out":0.2076,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":268,"u_out":0.832816,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":1,"dup":false,"k":269,"u_out":0.850514,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":5,"dup":false,"k":270,"u_out":0.680119,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":5,"dup":false,"k":271,"u_out":0.440487,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":272,"u_out":0.807522,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":3,"dup":false,"k":273,"u_out":0.31935,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":0,"dup":false,"k":274,"u_out":0.36621,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":true,"delay":4,"dup":false,"k":275,"u_out":0.192937,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":1,"dup":false,"k":276,"u_out":0.03477,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":277,"u_out":0.810233,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":278,"u_out":0.031148,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":4,"dup":false,"k":279,"u_out":0.780029,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":6,"dup":false,"k":280,"u_out":0.661133,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":281,"u_out":0.22809,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":282,"u_out":0.126447,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":283,"u_out":0.424968,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":3,"dup":false,"k":284,"u_out":0.392686,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":285,"u_out":0.026572,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":true,"delay":1,"dup":false,"k":286,"u_out":0.356846,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":4,"dup":false,"k":287,"u_out":0.281621,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":3,"dup":false,"k":288,"u_out":0.052818,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":6,"dup":true,"k":289,"u_out":0.998458,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":3,"dup":false,"k":290,"u_out":0.039159,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":291,"u_out":0.810436,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":0,"dup":false,"k":292,"u_out":0.12398,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":false,"k":293,"u_out":0.540381,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":5,"dup":false,"k":294,"u_out":0.549618,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":295,"u_out":0.55031,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":296,"u_out":0.560844,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":297,"u_out":0.620992,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":298,"u_out":0.773446,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":4,"dup":false,"k":299,"u_out":0.740287,"unknown":false,"unknown_good":false} diff --git a/bench/individuality/fixtures/credit/draws-3.jsonl b/bench/individuality/fixtures/credit/draws-3.jsonl new file mode 100644 index 0000000..2c3a180 --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-3.jsonl @@ -0,0 +1,300 @@ +{"blast":0.35,"cancel":false,"delay":5,"dup":false,"k":0,"u_out":0.35999,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":true,"delay":4,"dup":false,"k":1,"u_out":0.502002,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":2,"u_out":0.898616,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":1,"dup":true,"k":3,"u_out":0.552496,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":1,"dup":false,"k":4,"u_out":0.267856,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":6,"dup":false,"k":5,"u_out":0.454211,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":0,"dup":false,"k":6,"u_out":0.250666,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":7,"u_out":0.51091,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":8,"u_out":0.239599,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":4,"dup":false,"k":9,"u_out":0.395975,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":5,"dup":false,"k":10,"u_out":0.341755,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":1,"dup":false,"k":11,"u_out":0.596866,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":true,"delay":2,"dup":false,"k":12,"u_out":0.942021,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":13,"u_out":0.006604,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":true,"delay":4,"dup":false,"k":14,"u_out":0.167799,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":3,"dup":false,"k":15,"u_out":0.679429,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":16,"u_out":0.085782,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":0,"dup":true,"k":17,"u_out":0.230254,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":18,"u_out":0.965725,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":6,"dup":false,"k":19,"u_out":0.075671,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":20,"u_out":0.422452,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":6,"dup":false,"k":21,"u_out":0.396376,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":true,"delay":6,"dup":false,"k":22,"u_out":0.040208,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":5,"dup":false,"k":23,"u_out":0.242562,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":0,"dup":false,"k":24,"u_out":0.166689,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":25,"u_out":0.18573,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":6,"dup":false,"k":26,"u_out":0.471023,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":6,"dup":false,"k":27,"u_out":0.111126,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":3,"dup":false,"k":28,"u_out":0.39084,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":29,"u_out":0.546095,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":4,"dup":false,"k":30,"u_out":0.587292,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":31,"u_out":0.190993,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":5,"dup":false,"k":32,"u_out":0.399314,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":33,"u_out":0.584451,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":34,"u_out":0.545115,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":6,"dup":false,"k":35,"u_out":0.739505,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":6,"dup":false,"k":36,"u_out":0.406283,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":37,"u_out":0.285733,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":1,"dup":false,"k":38,"u_out":0.01499,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":2,"dup":false,"k":39,"u_out":0.022704,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":1,"dup":false,"k":40,"u_out":0.3784,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":41,"u_out":0.458903,"unknown":true,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":42,"u_out":0.852984,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":3,"dup":false,"k":43,"u_out":0.519755,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":2,"dup":false,"k":44,"u_out":0.836826,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":0,"dup":false,"k":45,"u_out":0.585381,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":46,"u_out":0.428358,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":4,"dup":false,"k":47,"u_out":0.039565,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":48,"u_out":0.006912,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":49,"u_out":0.012974,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":6,"dup":false,"k":50,"u_out":0.088368,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":true,"delay":1,"dup":false,"k":51,"u_out":0.834886,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":0,"dup":false,"k":52,"u_out":0.871139,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":true,"delay":0,"dup":false,"k":53,"u_out":0.186971,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":54,"u_out":0.346279,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":2,"dup":false,"k":55,"u_out":0.962138,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":56,"u_out":0.754075,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":57,"u_out":0.924101,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":58,"u_out":0.935479,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":0,"dup":false,"k":59,"u_out":0.649461,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":true,"delay":2,"dup":false,"k":60,"u_out":0.30835,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":0,"dup":false,"k":61,"u_out":0.625207,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":6,"dup":false,"k":62,"u_out":0.331758,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":63,"u_out":0.757646,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":64,"u_out":0.372414,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":65,"u_out":0.318833,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":66,"u_out":0.888523,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":67,"u_out":0.480144,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":3,"dup":false,"k":68,"u_out":0.519031,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":69,"u_out":0.592266,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":70,"u_out":0.176116,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":71,"u_out":0.418599,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":72,"u_out":0.680886,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":6,"dup":false,"k":73,"u_out":0.821338,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":6,"dup":false,"k":74,"u_out":0.567712,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":5,"dup":false,"k":75,"u_out":0.774683,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":76,"u_out":0.61302,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":true,"delay":3,"dup":false,"k":77,"u_out":0.840272,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":true,"delay":3,"dup":false,"k":78,"u_out":0.927917,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":true,"delay":5,"dup":false,"k":79,"u_out":0.3677,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":80,"u_out":0.900318,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":4,"dup":false,"k":81,"u_out":0.669407,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":82,"u_out":0.683646,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":3,"dup":false,"k":83,"u_out":0.69078,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":84,"u_out":0.759409,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":85,"u_out":0.456549,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":4,"dup":false,"k":86,"u_out":0.275552,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":true,"delay":1,"dup":false,"k":87,"u_out":0.11179,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":1,"dup":false,"k":88,"u_out":0.763109,"unknown":true,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":3,"dup":false,"k":89,"u_out":0.909623,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":90,"u_out":0.304496,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":1,"dup":false,"k":91,"u_out":0.147807,"unknown":true,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":92,"u_out":0.14818,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":3,"dup":false,"k":93,"u_out":0.118905,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":5,"dup":false,"k":94,"u_out":0.775493,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":4,"dup":false,"k":95,"u_out":0.442071,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":3,"dup":false,"k":96,"u_out":0.218579,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":2,"dup":true,"k":97,"u_out":0.752254,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":3,"dup":false,"k":98,"u_out":0.072604,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":99,"u_out":0.55742,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":5,"dup":false,"k":100,"u_out":0.5099,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":4,"dup":false,"k":101,"u_out":0.736378,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":0,"dup":false,"k":102,"u_out":0.237575,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":3,"dup":false,"k":103,"u_out":0.027769,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":104,"u_out":0.565073,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":2,"dup":false,"k":105,"u_out":0.327012,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":106,"u_out":0.024594,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":107,"u_out":0.060709,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":108,"u_out":0.527662,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":2,"dup":false,"k":109,"u_out":0.749794,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":110,"u_out":0.696719,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":1,"dup":false,"k":111,"u_out":0.943918,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":true,"delay":3,"dup":false,"k":112,"u_out":0.629702,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":2,"dup":false,"k":113,"u_out":0.311669,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":3,"dup":false,"k":114,"u_out":0.126798,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":4,"dup":false,"k":115,"u_out":0.786846,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":116,"u_out":0.546196,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":117,"u_out":0.33665,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":118,"u_out":0.519908,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":2,"dup":false,"k":119,"u_out":0.726087,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":0,"dup":false,"k":120,"u_out":0.559866,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":1,"dup":false,"k":121,"u_out":0.776775,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":122,"u_out":0.809171,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":0,"dup":false,"k":123,"u_out":0.129251,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":5,"dup":false,"k":124,"u_out":0.84157,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":125,"u_out":0.724869,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":6,"dup":false,"k":126,"u_out":0.730204,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":127,"u_out":0.904422,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":128,"u_out":0.869352,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":0,"dup":false,"k":129,"u_out":0.795659,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":130,"u_out":0.287338,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":131,"u_out":0.409492,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":5,"dup":false,"k":132,"u_out":0.655861,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":133,"u_out":0.729786,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":2,"dup":false,"k":134,"u_out":0.671019,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":135,"u_out":0.64159,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":136,"u_out":0.251597,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":3,"dup":false,"k":137,"u_out":0.042946,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":3,"dup":false,"k":138,"u_out":0.952845,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":5,"dup":false,"k":139,"u_out":0.520976,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":true,"delay":2,"dup":false,"k":140,"u_out":0.223295,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":2,"dup":false,"k":141,"u_out":0.858151,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":142,"u_out":0.28369,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":143,"u_out":0.7452,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":3,"dup":false,"k":144,"u_out":0.891111,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":true,"delay":1,"dup":false,"k":145,"u_out":0.373077,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":2,"dup":false,"k":146,"u_out":0.933751,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":147,"u_out":0.671725,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":148,"u_out":0.795483,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":149,"u_out":0.895138,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":0,"dup":false,"k":150,"u_out":0.938489,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":2,"dup":false,"k":151,"u_out":0.681803,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":152,"u_out":0.290169,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":0,"dup":false,"k":153,"u_out":0.57279,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":6,"dup":false,"k":154,"u_out":0.010352,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":1,"dup":false,"k":155,"u_out":0.984349,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":156,"u_out":0.564888,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":157,"u_out":0.454398,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":4,"dup":false,"k":158,"u_out":0.900073,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":2,"dup":false,"k":159,"u_out":0.669187,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":true,"delay":1,"dup":false,"k":160,"u_out":0.486534,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":161,"u_out":0.7573,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":6,"dup":true,"k":162,"u_out":0.608587,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":5,"dup":false,"k":163,"u_out":0.732033,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":4,"dup":false,"k":164,"u_out":0.03799,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":4,"dup":false,"k":165,"u_out":0.125902,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":4,"dup":false,"k":166,"u_out":0.553362,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":6,"dup":false,"k":167,"u_out":0.789686,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":true,"delay":1,"dup":false,"k":168,"u_out":0.50566,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":0,"dup":false,"k":169,"u_out":0.729339,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":4,"dup":true,"k":170,"u_out":0.874704,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":3,"dup":false,"k":171,"u_out":0.229848,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":1,"dup":false,"k":172,"u_out":0.804182,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":true,"delay":1,"dup":false,"k":173,"u_out":0.71393,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":true,"delay":1,"dup":false,"k":174,"u_out":0.581778,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":true,"delay":2,"dup":false,"k":175,"u_out":0.660585,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":176,"u_out":0.369103,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":177,"u_out":0.152728,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":2,"dup":false,"k":178,"u_out":0.814927,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":true,"delay":5,"dup":false,"k":179,"u_out":0.10232,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":180,"u_out":0.190619,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":181,"u_out":0.465733,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":2,"dup":true,"k":182,"u_out":0.627761,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":183,"u_out":0.833144,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":5,"dup":true,"k":184,"u_out":0.077123,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":185,"u_out":0.871809,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":4,"dup":true,"k":186,"u_out":0.029829,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":2,"dup":false,"k":187,"u_out":0.722784,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":188,"u_out":0.717879,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":3,"dup":false,"k":189,"u_out":0.849251,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":0,"dup":false,"k":190,"u_out":0.407532,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":6,"dup":false,"k":191,"u_out":0.701528,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":true,"delay":2,"dup":false,"k":192,"u_out":0.43628,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":true,"delay":5,"dup":false,"k":193,"u_out":0.179317,"unknown":true,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":1,"dup":true,"k":194,"u_out":0.687412,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":2,"dup":true,"k":195,"u_out":0.503448,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":196,"u_out":0.227876,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":197,"u_out":0.185118,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":4,"dup":false,"k":198,"u_out":0.479929,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":199,"u_out":0.370492,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":0,"dup":false,"k":200,"u_out":0.198112,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":2,"dup":false,"k":201,"u_out":0.727026,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":true,"delay":2,"dup":false,"k":202,"u_out":0.636649,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":true,"delay":3,"dup":false,"k":203,"u_out":0.635134,"unknown":true,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":6,"dup":false,"k":204,"u_out":0.138408,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":205,"u_out":0.840956,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":5,"dup":false,"k":206,"u_out":0.884911,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":true,"delay":6,"dup":false,"k":207,"u_out":0.661317,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":208,"u_out":0.060699,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":209,"u_out":0.664714,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":210,"u_out":0.982518,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":211,"u_out":0.440361,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":4,"dup":false,"k":212,"u_out":0.014886,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":213,"u_out":0.381326,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":true,"delay":5,"dup":false,"k":214,"u_out":0.62246,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":215,"u_out":0.728109,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":0,"dup":false,"k":216,"u_out":0.122502,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":true,"delay":3,"dup":false,"k":217,"u_out":0.338315,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":4,"dup":false,"k":218,"u_out":0.751529,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":5,"dup":false,"k":219,"u_out":0.97519,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":5,"dup":false,"k":220,"u_out":0.422782,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":221,"u_out":0.014364,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":5,"dup":false,"k":222,"u_out":0.543646,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":223,"u_out":0.380164,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":5,"dup":false,"k":224,"u_out":0.888969,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":225,"u_out":0.509968,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":6,"dup":false,"k":226,"u_out":0.13711,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":2,"dup":false,"k":227,"u_out":0.554592,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":3,"dup":false,"k":228,"u_out":0.595303,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":6,"dup":false,"k":229,"u_out":0.796155,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":230,"u_out":0.455593,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":231,"u_out":0.801452,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":3,"dup":false,"k":232,"u_out":0.554197,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":true,"delay":5,"dup":false,"k":233,"u_out":0.254351,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":true,"delay":5,"dup":false,"k":234,"u_out":0.43562,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":6,"dup":false,"k":235,"u_out":0.222563,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":3,"dup":false,"k":236,"u_out":0.587902,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":237,"u_out":0.898978,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":true,"delay":4,"dup":true,"k":238,"u_out":0.572665,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":6,"dup":false,"k":239,"u_out":0.254963,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":4,"dup":false,"k":240,"u_out":0.205336,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":4,"dup":false,"k":241,"u_out":0.128054,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":242,"u_out":0.60032,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":243,"u_out":0.76012,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":5,"dup":false,"k":244,"u_out":0.007,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":245,"u_out":0.310183,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":0,"dup":false,"k":246,"u_out":0.691607,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":247,"u_out":0.993483,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":3,"dup":false,"k":248,"u_out":0.150209,"unknown":true,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":4,"dup":true,"k":249,"u_out":0.474234,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":true,"delay":5,"dup":false,"k":250,"u_out":0.324047,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":6,"dup":false,"k":251,"u_out":0.843916,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":true,"delay":4,"dup":false,"k":252,"u_out":0.646493,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":1,"dup":false,"k":253,"u_out":0.746505,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":true,"delay":4,"dup":true,"k":254,"u_out":0.3984,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":255,"u_out":0.476447,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":256,"u_out":0.381403,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":0,"dup":false,"k":257,"u_out":0.487576,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":6,"dup":false,"k":258,"u_out":0.106785,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":0,"dup":false,"k":259,"u_out":0.066821,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":260,"u_out":0.414805,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":0,"dup":false,"k":261,"u_out":0.037042,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":2,"dup":false,"k":262,"u_out":0.62411,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":6,"dup":false,"k":263,"u_out":0.432127,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":2,"dup":true,"k":264,"u_out":0.00496,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":265,"u_out":0.718786,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":true,"delay":1,"dup":false,"k":266,"u_out":0.170717,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":267,"u_out":0.438865,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":268,"u_out":0.270936,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":5,"dup":false,"k":269,"u_out":0.634918,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":270,"u_out":0.406956,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":271,"u_out":0.43332,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":5,"dup":false,"k":272,"u_out":0.469383,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":273,"u_out":0.083759,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":0,"dup":false,"k":274,"u_out":0.69269,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":true,"delay":1,"dup":false,"k":275,"u_out":0.818548,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":1,"dup":false,"k":276,"u_out":0.633071,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":2,"dup":true,"k":277,"u_out":0.22879,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":2,"dup":false,"k":278,"u_out":0.673627,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":279,"u_out":0.301887,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":true,"delay":6,"dup":false,"k":280,"u_out":0.023976,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":6,"dup":false,"k":281,"u_out":0.00403,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":282,"u_out":0.242505,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":283,"u_out":0.894149,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":2,"dup":false,"k":284,"u_out":0.958061,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":4,"dup":false,"k":285,"u_out":0.045144,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":0,"dup":false,"k":286,"u_out":0.9866,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":true,"delay":6,"dup":false,"k":287,"u_out":0.742633,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":4,"dup":false,"k":288,"u_out":0.698754,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":5,"dup":false,"k":289,"u_out":0.372399,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":0,"dup":false,"k":290,"u_out":0.633808,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":0,"dup":false,"k":291,"u_out":0.104052,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":2,"dup":false,"k":292,"u_out":0.174554,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":293,"u_out":0.345906,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":294,"u_out":0.564134,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":true,"delay":2,"dup":false,"k":295,"u_out":0.452897,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":5,"dup":false,"k":296,"u_out":0.943982,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":4,"dup":false,"k":297,"u_out":0.719934,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":2,"dup":false,"k":298,"u_out":0.397771,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":1,"dup":false,"k":299,"u_out":0.91522,"unknown":false,"unknown_good":true} diff --git a/bench/individuality/fixtures/credit/draws-4.jsonl b/bench/individuality/fixtures/credit/draws-4.jsonl new file mode 100644 index 0000000..ffbab77 --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-4.jsonl @@ -0,0 +1,300 @@ +{"blast":0.3,"cancel":false,"delay":4,"dup":false,"k":0,"u_out":0.976107,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":1,"u_out":0.774941,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":4,"dup":true,"k":2,"u_out":0.369585,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":3,"dup":false,"k":3,"u_out":0.512718,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":true,"delay":4,"dup":false,"k":4,"u_out":0.98371,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":5,"dup":false,"k":5,"u_out":0.444048,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":6,"u_out":0.440101,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":6,"dup":false,"k":7,"u_out":0.985794,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":5,"dup":false,"k":8,"u_out":0.389496,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":0,"dup":false,"k":9,"u_out":0.431486,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":10,"u_out":0.143365,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":11,"u_out":0.701106,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":12,"u_out":0.772707,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":6,"dup":false,"k":13,"u_out":0.209387,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":0,"dup":false,"k":14,"u_out":0.604841,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":2,"dup":false,"k":15,"u_out":0.763044,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":4,"dup":false,"k":16,"u_out":0.812376,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":3,"dup":false,"k":17,"u_out":0.241171,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":1,"dup":false,"k":18,"u_out":0.254859,"unknown":true,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":19,"u_out":0.834899,"unknown":true,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":20,"u_out":0.6686,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":4,"dup":false,"k":21,"u_out":0.071037,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":6,"dup":false,"k":22,"u_out":0.623823,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":0,"dup":false,"k":23,"u_out":0.406385,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":4,"dup":false,"k":24,"u_out":0.88285,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":25,"u_out":0.900075,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":2,"dup":false,"k":26,"u_out":0.686581,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":27,"u_out":0.73346,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":3,"dup":false,"k":28,"u_out":0.239552,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":true,"delay":1,"dup":false,"k":29,"u_out":0.028389,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":true,"delay":6,"dup":false,"k":30,"u_out":0.551974,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":4,"dup":false,"k":31,"u_out":0.397136,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":true,"delay":0,"dup":true,"k":32,"u_out":0.895011,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":6,"dup":false,"k":33,"u_out":0.608295,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":4,"dup":false,"k":34,"u_out":0.485786,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":35,"u_out":0.73365,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":6,"dup":false,"k":36,"u_out":0.080136,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":6,"dup":false,"k":37,"u_out":0.046652,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":0,"dup":false,"k":38,"u_out":0.444727,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":39,"u_out":0.818524,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":6,"dup":false,"k":40,"u_out":0.087236,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":true,"delay":2,"dup":false,"k":41,"u_out":0.726069,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":true,"delay":3,"dup":false,"k":42,"u_out":0.897923,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":5,"dup":false,"k":43,"u_out":0.666138,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":44,"u_out":0.817613,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":1,"dup":false,"k":45,"u_out":0.967617,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":46,"u_out":0.823601,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":0,"dup":false,"k":47,"u_out":0.749118,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":1,"dup":false,"k":48,"u_out":0.010364,"unknown":true,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":49,"u_out":0.627656,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":1,"dup":false,"k":50,"u_out":0.512336,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":true,"delay":3,"dup":false,"k":51,"u_out":0.600805,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":1,"dup":false,"k":52,"u_out":0.335354,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":53,"u_out":0.086629,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":6,"dup":false,"k":54,"u_out":0.103451,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":true,"delay":0,"dup":false,"k":55,"u_out":0.896111,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":true,"delay":1,"dup":false,"k":56,"u_out":0.898409,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":3,"dup":false,"k":57,"u_out":0.22332,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":0,"dup":false,"k":58,"u_out":0.506139,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":5,"dup":false,"k":59,"u_out":0.885542,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":3,"dup":false,"k":60,"u_out":0.94928,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":3,"dup":false,"k":61,"u_out":0.116313,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":true,"k":62,"u_out":0.061688,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":2,"dup":false,"k":63,"u_out":0.790468,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":5,"dup":false,"k":64,"u_out":0.336085,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":2,"dup":false,"k":65,"u_out":0.649808,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":66,"u_out":0.902232,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":2,"dup":false,"k":67,"u_out":0.484954,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":68,"u_out":0.864357,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":1,"dup":false,"k":69,"u_out":0.99012,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":5,"dup":false,"k":70,"u_out":0.984875,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":true,"delay":5,"dup":false,"k":71,"u_out":0.420982,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":4,"dup":false,"k":72,"u_out":0.008153,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":73,"u_out":0.356882,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":5,"dup":false,"k":74,"u_out":0.901412,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":2,"dup":false,"k":75,"u_out":0.578279,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":76,"u_out":0.0741,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":5,"dup":false,"k":77,"u_out":0.811696,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":78,"u_out":0.72444,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":5,"dup":false,"k":79,"u_out":0.710959,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":80,"u_out":0.04383,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":81,"u_out":0.378425,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":82,"u_out":0.229838,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":3,"dup":false,"k":83,"u_out":0.246005,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":6,"dup":false,"k":84,"u_out":0.654192,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":3,"dup":false,"k":85,"u_out":0.374384,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":6,"dup":false,"k":86,"u_out":0.846363,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":true,"delay":0,"dup":false,"k":87,"u_out":0.470817,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":88,"u_out":0.125066,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":6,"dup":false,"k":89,"u_out":0.59505,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":4,"dup":false,"k":90,"u_out":0.038541,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":0,"dup":false,"k":91,"u_out":0.931647,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":5,"dup":false,"k":92,"u_out":0.920359,"unknown":true,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":93,"u_out":0.109824,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":5,"dup":true,"k":94,"u_out":0.123604,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":4,"dup":false,"k":95,"u_out":0.385476,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":5,"dup":false,"k":96,"u_out":0.021283,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":6,"dup":false,"k":97,"u_out":0.819809,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":4,"dup":false,"k":98,"u_out":0.437287,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":3,"dup":false,"k":99,"u_out":0.823601,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":3,"dup":true,"k":100,"u_out":0.750969,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":3,"dup":true,"k":101,"u_out":0.926266,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":0,"dup":false,"k":102,"u_out":0.015184,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":103,"u_out":0.306081,"unknown":true,"unknown_good":false} +{"blast":0.59,"cancel":true,"delay":1,"dup":false,"k":104,"u_out":0.250197,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":0,"dup":false,"k":105,"u_out":0.521025,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":5,"dup":false,"k":106,"u_out":0.741816,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":4,"dup":false,"k":107,"u_out":0.26471,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":true,"delay":4,"dup":false,"k":108,"u_out":0.744163,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":4,"dup":false,"k":109,"u_out":0.646496,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":110,"u_out":0.736799,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":111,"u_out":0.03285,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":true,"delay":2,"dup":false,"k":112,"u_out":0.532496,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":113,"u_out":0.682921,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":114,"u_out":0.737724,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":5,"dup":false,"k":115,"u_out":0.791767,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":0,"dup":false,"k":116,"u_out":0.451407,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":5,"dup":false,"k":117,"u_out":0.003651,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":118,"u_out":0.339101,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":4,"dup":false,"k":119,"u_out":0.300086,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":120,"u_out":0.725616,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":121,"u_out":0.821166,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":1,"dup":false,"k":122,"u_out":0.908031,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":3,"dup":false,"k":123,"u_out":0.460916,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":4,"dup":true,"k":124,"u_out":0.090052,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":true,"delay":5,"dup":false,"k":125,"u_out":0.25964,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":5,"dup":false,"k":126,"u_out":0.447391,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":127,"u_out":0.123181,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":128,"u_out":0.062099,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":2,"dup":false,"k":129,"u_out":0.275145,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":0,"dup":false,"k":130,"u_out":0.302995,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":131,"u_out":0.763329,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":132,"u_out":0.63889,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":3,"dup":false,"k":133,"u_out":0.423843,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":0,"dup":false,"k":134,"u_out":0.440155,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":135,"u_out":0.641396,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":4,"dup":false,"k":136,"u_out":0.137424,"unknown":true,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":5,"dup":false,"k":137,"u_out":0.850548,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":138,"u_out":0.673551,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":2,"dup":false,"k":139,"u_out":0.692439,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":140,"u_out":0.38005,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":2,"dup":false,"k":141,"u_out":0.132921,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":142,"u_out":0.830235,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":143,"u_out":0.220448,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":2,"dup":false,"k":144,"u_out":0.526722,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":1,"dup":false,"k":145,"u_out":0.919883,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":4,"dup":false,"k":146,"u_out":0.085949,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":6,"dup":false,"k":147,"u_out":0.710191,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":148,"u_out":0.035211,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":149,"u_out":0.444686,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":150,"u_out":0.184973,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":0,"dup":false,"k":151,"u_out":0.70602,"unknown":true,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":0,"dup":false,"k":152,"u_out":0.79664,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":1,"dup":false,"k":153,"u_out":0.612114,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":0,"dup":false,"k":154,"u_out":0.142352,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":155,"u_out":0.370129,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":1,"dup":false,"k":156,"u_out":0.919795,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":0,"dup":false,"k":157,"u_out":0.246368,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":3,"dup":false,"k":158,"u_out":0.779789,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":true,"delay":6,"dup":false,"k":159,"u_out":0.684783,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":4,"dup":false,"k":160,"u_out":0.092352,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":true,"delay":6,"dup":false,"k":161,"u_out":0.750369,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":true,"k":162,"u_out":0.061732,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":163,"u_out":0.759085,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":true,"delay":2,"dup":false,"k":164,"u_out":0.863636,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":6,"dup":false,"k":165,"u_out":0.228348,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":1,"dup":false,"k":166,"u_out":0.545434,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":0,"dup":false,"k":167,"u_out":0.250864,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":2,"dup":false,"k":168,"u_out":0.690138,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":0,"dup":false,"k":169,"u_out":0.736179,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":170,"u_out":0.405167,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":1,"dup":true,"k":171,"u_out":0.575211,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":1,"dup":false,"k":172,"u_out":0.007942,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":4,"dup":false,"k":173,"u_out":0.199283,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":3,"dup":false,"k":174,"u_out":0.887421,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":5,"dup":false,"k":175,"u_out":0.848332,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":0,"dup":true,"k":176,"u_out":0.01122,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":5,"dup":false,"k":177,"u_out":0.712126,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":6,"dup":false,"k":178,"u_out":0.261171,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":179,"u_out":0.586563,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":180,"u_out":0.335773,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":181,"u_out":0.265831,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":6,"dup":false,"k":182,"u_out":0.344857,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":true,"delay":4,"dup":false,"k":183,"u_out":0.406147,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":1,"dup":true,"k":184,"u_out":0.321757,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":6,"dup":false,"k":185,"u_out":0.042913,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":3,"dup":false,"k":186,"u_out":0.352186,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":6,"dup":false,"k":187,"u_out":0.041667,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":1,"dup":false,"k":188,"u_out":0.524303,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":4,"dup":false,"k":189,"u_out":0.19521,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":5,"dup":false,"k":190,"u_out":0.270668,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":191,"u_out":0.511957,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":2,"dup":false,"k":192,"u_out":0.25032,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":193,"u_out":0.071085,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":0,"dup":true,"k":194,"u_out":0.67724,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":195,"u_out":0.057237,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":1,"dup":false,"k":196,"u_out":0.31759,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":197,"u_out":0.928437,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":6,"dup":false,"k":198,"u_out":0.065094,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":3,"dup":false,"k":199,"u_out":0.445241,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":4,"dup":false,"k":200,"u_out":0.779143,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":4,"dup":false,"k":201,"u_out":0.107357,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":0,"dup":true,"k":202,"u_out":0.438537,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":2,"dup":true,"k":203,"u_out":0.615615,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":0,"dup":false,"k":204,"u_out":0.635303,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":2,"dup":false,"k":205,"u_out":0.563275,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":0,"dup":false,"k":206,"u_out":0.4755,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":2,"dup":true,"k":207,"u_out":0.366366,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":1,"dup":false,"k":208,"u_out":0.656809,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":4,"dup":false,"k":209,"u_out":0.500344,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":210,"u_out":0.934336,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":211,"u_out":0.767515,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":212,"u_out":0.641989,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":4,"dup":false,"k":213,"u_out":0.733427,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":4,"dup":false,"k":214,"u_out":0.11573,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":3,"dup":false,"k":215,"u_out":0.23072,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":true,"delay":1,"dup":false,"k":216,"u_out":0.229071,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":3,"dup":false,"k":217,"u_out":0.381363,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":1,"dup":false,"k":218,"u_out":0.023585,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":1,"dup":false,"k":219,"u_out":0.510238,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":0,"dup":false,"k":220,"u_out":0.451104,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":true,"delay":0,"dup":false,"k":221,"u_out":0.316542,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":5,"dup":false,"k":222,"u_out":0.4237,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":223,"u_out":0.339898,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":224,"u_out":0.058099,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":225,"u_out":0.838456,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":true,"delay":3,"dup":false,"k":226,"u_out":0.084433,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":6,"dup":false,"k":227,"u_out":0.600511,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":5,"dup":false,"k":228,"u_out":0.491291,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":3,"dup":false,"k":229,"u_out":0.434369,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":1,"dup":false,"k":230,"u_out":0.062834,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":5,"dup":false,"k":231,"u_out":0.691952,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":232,"u_out":0.961317,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":3,"dup":false,"k":233,"u_out":0.115474,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":4,"dup":false,"k":234,"u_out":0.265764,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":2,"dup":false,"k":235,"u_out":0.502218,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":3,"dup":false,"k":236,"u_out":0.741135,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":5,"dup":false,"k":237,"u_out":0.246289,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":3,"dup":false,"k":238,"u_out":0.599524,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":239,"u_out":0.165148,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":240,"u_out":0.130796,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":241,"u_out":0.850779,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":2,"dup":false,"k":242,"u_out":0.473194,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":6,"dup":false,"k":243,"u_out":0.662899,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":2,"dup":false,"k":244,"u_out":0.273891,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":2,"dup":false,"k":245,"u_out":0.998754,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":246,"u_out":0.046649,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":247,"u_out":0.409776,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":3,"dup":false,"k":248,"u_out":0.592855,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":3,"dup":false,"k":249,"u_out":0.864794,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":250,"u_out":0.643145,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":5,"dup":false,"k":251,"u_out":0.038345,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":true,"delay":4,"dup":false,"k":252,"u_out":0.180368,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":5,"dup":false,"k":253,"u_out":0.656187,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":3,"dup":false,"k":254,"u_out":0.784404,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":2,"dup":false,"k":255,"u_out":0.117024,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":256,"u_out":0.85171,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":true,"delay":6,"dup":false,"k":257,"u_out":0.23429,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":258,"u_out":0.315291,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":6,"dup":false,"k":259,"u_out":0.841737,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":4,"dup":false,"k":260,"u_out":0.637281,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":5,"dup":false,"k":261,"u_out":0.535863,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":true,"delay":5,"dup":false,"k":262,"u_out":0.600663,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":263,"u_out":0.723121,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":true,"delay":4,"dup":false,"k":264,"u_out":0.283292,"unknown":true,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":265,"u_out":0.560074,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":266,"u_out":0.26612,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":1,"dup":false,"k":267,"u_out":0.899985,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":1,"dup":false,"k":268,"u_out":0.595079,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":2,"dup":false,"k":269,"u_out":0.366143,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":270,"u_out":0.915585,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":0,"dup":false,"k":271,"u_out":0.244735,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":5,"dup":false,"k":272,"u_out":0.086613,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":0,"dup":true,"k":273,"u_out":0.723313,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":true,"delay":5,"dup":false,"k":274,"u_out":0.875415,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":1,"dup":false,"k":275,"u_out":0.760854,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":5,"dup":true,"k":276,"u_out":0.142671,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":277,"u_out":0.733289,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":278,"u_out":0.05666,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":5,"dup":false,"k":279,"u_out":0.603713,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":1,"dup":false,"k":280,"u_out":0.052702,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":true,"delay":5,"dup":false,"k":281,"u_out":0.232789,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":282,"u_out":0.86263,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":2,"dup":false,"k":283,"u_out":0.595951,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":5,"dup":false,"k":284,"u_out":0.982847,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":6,"dup":false,"k":285,"u_out":0.310063,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":6,"dup":false,"k":286,"u_out":0.84518,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":0,"dup":false,"k":287,"u_out":0.294002,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":5,"dup":false,"k":288,"u_out":0.06395,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":true,"delay":0,"dup":false,"k":289,"u_out":0.195714,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":290,"u_out":0.347399,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":6,"dup":false,"k":291,"u_out":0.460554,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":2,"dup":true,"k":292,"u_out":0.780217,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":293,"u_out":0.20889,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":294,"u_out":0.691886,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":295,"u_out":0.638778,"unknown":true,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":0,"dup":false,"k":296,"u_out":0.59659,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":3,"dup":false,"k":297,"u_out":0.415815,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":298,"u_out":0.582241,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":299,"u_out":0.104031,"unknown":false,"unknown_good":true} diff --git a/bench/individuality/fixtures/credit/draws-5.jsonl b/bench/individuality/fixtures/credit/draws-5.jsonl new file mode 100644 index 0000000..073172e --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-5.jsonl @@ -0,0 +1,300 @@ +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":0,"u_out":0.902183,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":1,"u_out":0.178873,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":0,"dup":false,"k":2,"u_out":0.580258,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":3,"dup":false,"k":3,"u_out":0.648868,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":true,"delay":4,"dup":false,"k":4,"u_out":0.897672,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":5,"u_out":0.419183,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":0,"dup":false,"k":6,"u_out":0.828707,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":3,"dup":false,"k":7,"u_out":0.615701,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":0,"dup":false,"k":8,"u_out":0.458345,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":9,"u_out":0.963593,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":0,"dup":false,"k":10,"u_out":0.958573,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":4,"dup":false,"k":11,"u_out":0.946475,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":2,"dup":false,"k":12,"u_out":0.628877,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":true,"delay":2,"dup":true,"k":13,"u_out":0.586215,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":true,"delay":3,"dup":false,"k":14,"u_out":0.980065,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":5,"dup":false,"k":15,"u_out":0.766504,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":6,"dup":false,"k":16,"u_out":0.515608,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":true,"delay":5,"dup":false,"k":17,"u_out":0.155415,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":5,"dup":false,"k":18,"u_out":0.456229,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":19,"u_out":0.428556,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":true,"delay":2,"dup":false,"k":20,"u_out":0.821313,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":3,"dup":false,"k":21,"u_out":0.334932,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":2,"dup":false,"k":22,"u_out":0.643247,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":2,"dup":false,"k":23,"u_out":0.580851,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":24,"u_out":0.27769,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":25,"u_out":0.691612,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":1,"dup":false,"k":26,"u_out":0.664072,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":6,"dup":false,"k":27,"u_out":0.404576,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":2,"dup":false,"k":28,"u_out":0.179614,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":0,"dup":false,"k":29,"u_out":0.745027,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":4,"dup":false,"k":30,"u_out":0.186919,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":6,"dup":false,"k":31,"u_out":0.285731,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":32,"u_out":0.120374,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":33,"u_out":0.16709,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":4,"dup":false,"k":34,"u_out":0.052704,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":5,"dup":false,"k":35,"u_out":0.993807,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":6,"dup":false,"k":36,"u_out":0.920313,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":4,"dup":false,"k":37,"u_out":0.871823,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":38,"u_out":0.207203,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":39,"u_out":0.624194,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":5,"dup":false,"k":40,"u_out":0.66626,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":41,"u_out":0.201461,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":6,"dup":false,"k":42,"u_out":0.417229,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":1,"dup":false,"k":43,"u_out":0.909872,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":6,"dup":false,"k":44,"u_out":0.711442,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":1,"dup":false,"k":45,"u_out":0.445283,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":6,"dup":false,"k":46,"u_out":0.61993,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":4,"dup":false,"k":47,"u_out":0.219612,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":2,"dup":false,"k":48,"u_out":0.569176,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":49,"u_out":0.49755,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":50,"u_out":0.204417,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":true,"delay":2,"dup":false,"k":51,"u_out":0.404143,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":1,"dup":false,"k":52,"u_out":0.230032,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":4,"dup":true,"k":53,"u_out":0.336256,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":true,"delay":0,"dup":false,"k":54,"u_out":0.845011,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":55,"u_out":0.18295,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":4,"dup":false,"k":56,"u_out":0.06495,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":4,"dup":false,"k":57,"u_out":0.026915,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":0,"dup":true,"k":58,"u_out":0.594592,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":59,"u_out":0.071227,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":5,"dup":false,"k":60,"u_out":0.301839,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":61,"u_out":0.856202,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":62,"u_out":0.279043,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":63,"u_out":0.801219,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":6,"dup":false,"k":64,"u_out":0.670041,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":65,"u_out":0.196101,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":66,"u_out":0.80446,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":5,"dup":false,"k":67,"u_out":0.206986,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":0,"dup":false,"k":68,"u_out":0.85575,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":3,"dup":false,"k":69,"u_out":0.54164,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":70,"u_out":0.311986,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":3,"dup":false,"k":71,"u_out":0.192279,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":6,"dup":false,"k":72,"u_out":0.921461,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":73,"u_out":0.885221,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":true,"delay":3,"dup":false,"k":74,"u_out":0.968103,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":75,"u_out":0.994479,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":5,"dup":false,"k":76,"u_out":0.720151,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":77,"u_out":0.872509,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":1,"dup":false,"k":78,"u_out":0.846779,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":6,"dup":false,"k":79,"u_out":0.920661,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":2,"dup":false,"k":80,"u_out":0.652357,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":81,"u_out":0.156374,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":4,"dup":false,"k":82,"u_out":0.563171,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":5,"dup":false,"k":83,"u_out":0.335777,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":0,"dup":false,"k":84,"u_out":0.398401,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":true,"delay":4,"dup":false,"k":85,"u_out":0.782051,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":6,"dup":false,"k":86,"u_out":0.438339,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":1,"dup":false,"k":87,"u_out":0.962762,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":6,"dup":false,"k":88,"u_out":0.572202,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":1,"dup":false,"k":89,"u_out":0.85102,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":1,"dup":false,"k":90,"u_out":0.025323,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":6,"dup":false,"k":91,"u_out":0.129135,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":true,"delay":3,"dup":false,"k":92,"u_out":0.109765,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":93,"u_out":0.562917,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":0,"dup":false,"k":94,"u_out":0.420055,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":95,"u_out":0.512986,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":96,"u_out":0.759625,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":4,"dup":false,"k":97,"u_out":0.765675,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":3,"dup":false,"k":98,"u_out":0.886685,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":0,"dup":false,"k":99,"u_out":0.485037,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":6,"dup":false,"k":100,"u_out":0.944312,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":5,"dup":false,"k":101,"u_out":0.752919,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":6,"dup":false,"k":102,"u_out":0.154322,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":103,"u_out":0.19074,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":2,"dup":false,"k":104,"u_out":0.323465,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":6,"dup":false,"k":105,"u_out":0.80651,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":6,"dup":false,"k":106,"u_out":0.771083,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":3,"dup":false,"k":107,"u_out":0.118637,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":108,"u_out":0.840314,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":2,"dup":false,"k":109,"u_out":0.626073,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":110,"u_out":0.269984,"unknown":true,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":4,"dup":false,"k":111,"u_out":0.260594,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":112,"u_out":0.251664,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":2,"dup":true,"k":113,"u_out":0.17787,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":114,"u_out":0.931441,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":115,"u_out":0.493941,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":116,"u_out":0.834897,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":117,"u_out":0.684879,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":118,"u_out":0.758734,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":1,"dup":false,"k":119,"u_out":0.258572,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":120,"u_out":0.538036,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":121,"u_out":0.508914,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":2,"dup":false,"k":122,"u_out":0.157287,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":1,"dup":false,"k":123,"u_out":0.398054,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":124,"u_out":0.285841,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":5,"dup":false,"k":125,"u_out":0.993794,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":true,"delay":5,"dup":false,"k":126,"u_out":0.167376,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":5,"dup":true,"k":127,"u_out":0.523732,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":128,"u_out":0.947858,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":129,"u_out":0.816366,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":130,"u_out":0.078154,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":131,"u_out":0.667663,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":4,"dup":false,"k":132,"u_out":0.854051,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":5,"dup":false,"k":133,"u_out":0.05392,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":134,"u_out":0.584489,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":135,"u_out":0.428227,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":136,"u_out":0.078091,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":0,"dup":false,"k":137,"u_out":0.322334,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":5,"dup":false,"k":138,"u_out":0.256926,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":1,"dup":false,"k":139,"u_out":0.401013,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":140,"u_out":0.382306,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":true,"delay":4,"dup":false,"k":141,"u_out":0.499783,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":5,"dup":false,"k":142,"u_out":0.728992,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":5,"dup":false,"k":143,"u_out":0.018933,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":144,"u_out":0.873944,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":145,"u_out":0.808093,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":146,"u_out":0.985596,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":147,"u_out":0.031488,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":2,"dup":false,"k":148,"u_out":0.609397,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":149,"u_out":0.610062,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":4,"dup":false,"k":150,"u_out":0.359123,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":2,"dup":false,"k":151,"u_out":0.002124,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":1,"dup":false,"k":152,"u_out":0.704845,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":153,"u_out":0.166349,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":4,"dup":false,"k":154,"u_out":0.547681,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":155,"u_out":0.165525,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":3,"dup":false,"k":156,"u_out":0.482188,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":6,"dup":false,"k":157,"u_out":0.440718,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":5,"dup":false,"k":158,"u_out":0.047464,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":159,"u_out":0.594187,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":4,"dup":false,"k":160,"u_out":0.043871,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":0,"dup":false,"k":161,"u_out":0.039301,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":0,"dup":false,"k":162,"u_out":0.444892,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":1,"dup":false,"k":163,"u_out":0.384228,"unknown":true,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":164,"u_out":0.465304,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":6,"dup":false,"k":165,"u_out":0.548309,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":5,"dup":false,"k":166,"u_out":0.365918,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":2,"dup":false,"k":167,"u_out":0.451712,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":168,"u_out":0.564997,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":3,"dup":false,"k":169,"u_out":0.872995,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":6,"dup":false,"k":170,"u_out":0.942952,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":2,"dup":false,"k":171,"u_out":0.841856,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":172,"u_out":0.160499,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":true,"delay":1,"dup":false,"k":173,"u_out":0.102189,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":174,"u_out":0.393421,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":175,"u_out":0.673306,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":6,"dup":false,"k":176,"u_out":0.187492,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":177,"u_out":0.79295,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":0,"dup":false,"k":178,"u_out":0.220672,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":6,"dup":false,"k":179,"u_out":0.156088,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":6,"dup":false,"k":180,"u_out":0.737637,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":3,"dup":true,"k":181,"u_out":0.990866,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":4,"dup":false,"k":182,"u_out":0.722675,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":3,"dup":false,"k":183,"u_out":0.410913,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":6,"dup":false,"k":184,"u_out":0.958672,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":185,"u_out":0.266229,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":1,"dup":false,"k":186,"u_out":0.381018,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":true,"delay":2,"dup":false,"k":187,"u_out":0.492493,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":1,"dup":false,"k":188,"u_out":0.058051,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":0,"dup":false,"k":189,"u_out":0.490945,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":190,"u_out":0.000921,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":6,"dup":true,"k":191,"u_out":0.465342,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":192,"u_out":0.814415,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":193,"u_out":0.030557,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":1,"dup":false,"k":194,"u_out":0.216185,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":4,"dup":false,"k":195,"u_out":0.987325,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":196,"u_out":0.803997,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":2,"dup":false,"k":197,"u_out":0.787489,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":6,"dup":false,"k":198,"u_out":0.683746,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":0,"dup":false,"k":199,"u_out":0.440992,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":1,"dup":false,"k":200,"u_out":0.289354,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":201,"u_out":0.632413,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":3,"dup":true,"k":202,"u_out":0.391215,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":203,"u_out":0.703647,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":5,"dup":false,"k":204,"u_out":0.18282,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":205,"u_out":0.432833,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":true,"delay":1,"dup":false,"k":206,"u_out":0.496975,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":2,"dup":false,"k":207,"u_out":0.350248,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":true,"delay":6,"dup":false,"k":208,"u_out":0.390491,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":2,"dup":false,"k":209,"u_out":0.223668,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":0,"dup":false,"k":210,"u_out":0.181006,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":211,"u_out":0.254044,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":212,"u_out":0.570119,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":2,"dup":false,"k":213,"u_out":0.194056,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":4,"dup":false,"k":214,"u_out":0.312898,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":2,"dup":false,"k":215,"u_out":0.948642,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":true,"delay":6,"dup":false,"k":216,"u_out":0.418796,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":true,"delay":1,"dup":false,"k":217,"u_out":0.278847,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":218,"u_out":0.15953,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":5,"dup":false,"k":219,"u_out":0.094261,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":220,"u_out":0.7735,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":221,"u_out":0.207795,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":0,"dup":false,"k":222,"u_out":0.876699,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":2,"dup":false,"k":223,"u_out":0.938091,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":3,"dup":false,"k":224,"u_out":0.251414,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":225,"u_out":0.703159,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":4,"dup":false,"k":226,"u_out":0.023625,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":227,"u_out":0.111537,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":4,"dup":false,"k":228,"u_out":0.433366,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":2,"dup":false,"k":229,"u_out":0.284482,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":4,"dup":false,"k":230,"u_out":0.84835,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":231,"u_out":0.364823,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":4,"dup":false,"k":232,"u_out":0.314361,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":1,"dup":false,"k":233,"u_out":0.603986,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":1,"dup":false,"k":234,"u_out":0.721473,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":235,"u_out":0.718894,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":6,"dup":false,"k":236,"u_out":0.161738,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":0,"dup":false,"k":237,"u_out":0.84434,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":238,"u_out":0.267982,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":5,"dup":false,"k":239,"u_out":0.660136,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":240,"u_out":0.817818,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":241,"u_out":0.386021,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":1,"dup":false,"k":242,"u_out":0.834705,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":243,"u_out":0.292929,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":true,"delay":6,"dup":false,"k":244,"u_out":0.585281,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":5,"dup":false,"k":245,"u_out":0.419532,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":0,"dup":false,"k":246,"u_out":0.129311,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":true,"delay":2,"dup":false,"k":247,"u_out":0.316416,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":true,"delay":5,"dup":true,"k":248,"u_out":0.940407,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":true,"delay":4,"dup":false,"k":249,"u_out":0.670772,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":250,"u_out":0.708198,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":5,"dup":false,"k":251,"u_out":0.589704,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":252,"u_out":0.651848,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":6,"dup":false,"k":253,"u_out":0.112864,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":false,"k":254,"u_out":0.500668,"unknown":true,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":3,"dup":false,"k":255,"u_out":0.555619,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":2,"dup":false,"k":256,"u_out":0.723239,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":3,"dup":false,"k":257,"u_out":0.173431,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":258,"u_out":0.748086,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":1,"dup":false,"k":259,"u_out":0.780799,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":2,"dup":false,"k":260,"u_out":0.800232,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":5,"dup":true,"k":261,"u_out":0.457439,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":1,"dup":false,"k":262,"u_out":0.945387,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":263,"u_out":0.364578,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":264,"u_out":0.069285,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":265,"u_out":0.428351,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":3,"dup":false,"k":266,"u_out":0.326458,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":3,"dup":false,"k":267,"u_out":0.703337,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":268,"u_out":0.282896,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":true,"delay":5,"dup":false,"k":269,"u_out":0.272335,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":270,"u_out":0.588158,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":271,"u_out":0.040163,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":6,"dup":false,"k":272,"u_out":0.891307,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":3,"dup":false,"k":273,"u_out":0.795977,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":5,"dup":true,"k":274,"u_out":0.179817,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":1,"dup":false,"k":275,"u_out":0.851208,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":276,"u_out":0.770726,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":6,"dup":false,"k":277,"u_out":0.224741,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":4,"dup":false,"k":278,"u_out":0.74095,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":4,"dup":false,"k":279,"u_out":0.286582,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":5,"dup":false,"k":280,"u_out":0.845357,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":6,"dup":false,"k":281,"u_out":0.161758,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":0,"dup":true,"k":282,"u_out":0.79244,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":3,"dup":false,"k":283,"u_out":0.664879,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":true,"delay":4,"dup":false,"k":284,"u_out":0.554628,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":285,"u_out":0.048005,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":3,"dup":false,"k":286,"u_out":0.600065,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":3,"dup":false,"k":287,"u_out":0.532716,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":2,"dup":false,"k":288,"u_out":0.208899,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":2,"dup":false,"k":289,"u_out":0.228961,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":4,"dup":false,"k":290,"u_out":0.402818,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":291,"u_out":0.130682,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":292,"u_out":0.151707,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":0,"dup":false,"k":293,"u_out":0.744257,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":294,"u_out":0.736679,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":2,"dup":false,"k":295,"u_out":0.232717,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":2,"dup":false,"k":296,"u_out":0.90957,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":4,"dup":false,"k":297,"u_out":0.318972,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":298,"u_out":0.004943,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":299,"u_out":0.752916,"unknown":false,"unknown_good":false} diff --git a/bench/individuality/fixtures/credit/draws-6.jsonl b/bench/individuality/fixtures/credit/draws-6.jsonl new file mode 100644 index 0000000..a1941e7 --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-6.jsonl @@ -0,0 +1,300 @@ +{"blast":0.26,"cancel":false,"delay":0,"dup":false,"k":0,"u_out":0.228641,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":2,"dup":false,"k":1,"u_out":0.893859,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":2,"dup":false,"k":2,"u_out":0.049495,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":true,"delay":6,"dup":false,"k":3,"u_out":0.988908,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":3,"dup":false,"k":4,"u_out":0.354833,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":2,"dup":false,"k":5,"u_out":0.692049,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":6,"dup":false,"k":6,"u_out":0.52812,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":7,"u_out":0.961407,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":0,"dup":true,"k":8,"u_out":0.241849,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":9,"u_out":0.377705,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":10,"u_out":0.606812,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":11,"u_out":0.211988,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":12,"u_out":0.120396,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":13,"u_out":0.52378,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":3,"dup":true,"k":14,"u_out":0.080297,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":2,"dup":false,"k":15,"u_out":0.752845,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":5,"dup":false,"k":16,"u_out":0.013704,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":17,"u_out":0.13341,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":6,"dup":false,"k":18,"u_out":0.190409,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":3,"dup":false,"k":19,"u_out":0.62516,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":2,"dup":false,"k":20,"u_out":0.32487,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":6,"dup":false,"k":21,"u_out":0.514177,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":true,"delay":4,"dup":false,"k":22,"u_out":0.852844,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":23,"u_out":0.38513,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":5,"dup":false,"k":24,"u_out":0.407803,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":0,"dup":false,"k":25,"u_out":0.19807,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":2,"dup":false,"k":26,"u_out":0.202026,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":1,"dup":false,"k":27,"u_out":0.016238,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":true,"delay":5,"dup":false,"k":28,"u_out":0.868453,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":5,"dup":true,"k":29,"u_out":0.699763,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":true,"delay":5,"dup":false,"k":30,"u_out":0.319582,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":true,"delay":0,"dup":false,"k":31,"u_out":0.913286,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":32,"u_out":0.164931,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":33,"u_out":0.903785,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":true,"delay":6,"dup":false,"k":34,"u_out":0.833851,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":35,"u_out":0.739888,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":36,"u_out":0.387978,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":6,"dup":false,"k":37,"u_out":0.835793,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":6,"dup":false,"k":38,"u_out":0.511003,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":4,"dup":false,"k":39,"u_out":0.276294,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":1,"dup":false,"k":40,"u_out":0.139606,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":41,"u_out":0.071075,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":true,"delay":6,"dup":false,"k":42,"u_out":0.15076,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":4,"dup":false,"k":43,"u_out":0.517533,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":44,"u_out":0.950573,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":45,"u_out":0.081151,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":5,"dup":false,"k":46,"u_out":0.699754,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":47,"u_out":0.16873,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":48,"u_out":0.817112,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":6,"dup":false,"k":49,"u_out":0.613115,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":50,"u_out":0.017704,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":51,"u_out":0.049426,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":3,"dup":false,"k":52,"u_out":0.275799,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":3,"dup":false,"k":53,"u_out":0.329384,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":5,"dup":false,"k":54,"u_out":0.967261,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":5,"dup":false,"k":55,"u_out":0.674368,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":2,"dup":false,"k":56,"u_out":0.446206,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":0,"dup":false,"k":57,"u_out":0.476557,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":4,"dup":false,"k":58,"u_out":0.529533,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":59,"u_out":0.883437,"unknown":true,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":60,"u_out":0.736817,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":3,"dup":false,"k":61,"u_out":0.683929,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":0,"dup":false,"k":62,"u_out":0.600799,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":2,"dup":false,"k":63,"u_out":0.698585,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":true,"delay":4,"dup":false,"k":64,"u_out":0.551587,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":0,"dup":false,"k":65,"u_out":0.21448,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":4,"dup":false,"k":66,"u_out":0.16592,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":2,"dup":false,"k":67,"u_out":0.098184,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":4,"dup":false,"k":68,"u_out":0.436584,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":69,"u_out":0.137347,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":1,"dup":false,"k":70,"u_out":0.133947,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":71,"u_out":0.53975,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":2,"dup":false,"k":72,"u_out":0.55216,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":73,"u_out":0.044404,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":1,"dup":true,"k":74,"u_out":0.980347,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":75,"u_out":0.213045,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":76,"u_out":0.367355,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":3,"dup":false,"k":77,"u_out":0.216163,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":78,"u_out":0.492171,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":79,"u_out":0.779896,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":80,"u_out":0.354918,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":true,"delay":1,"dup":false,"k":81,"u_out":0.471068,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":82,"u_out":0.425936,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":0,"dup":false,"k":83,"u_out":0.629292,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":84,"u_out":0.800921,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":85,"u_out":0.510896,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":true,"delay":5,"dup":false,"k":86,"u_out":0.297737,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":87,"u_out":0.879911,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":1,"dup":false,"k":88,"u_out":0.066695,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":89,"u_out":0.104738,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":1,"dup":false,"k":90,"u_out":0.807671,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":91,"u_out":0.252471,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":6,"dup":false,"k":92,"u_out":0.997411,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":6,"dup":false,"k":93,"u_out":0.736873,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":94,"u_out":0.229071,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":0,"dup":false,"k":95,"u_out":0.566341,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":96,"u_out":0.246736,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":5,"dup":false,"k":97,"u_out":0.749756,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":98,"u_out":0.911754,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":0,"dup":false,"k":99,"u_out":0.095565,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":4,"dup":false,"k":100,"u_out":0.794782,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":true,"delay":6,"dup":false,"k":101,"u_out":0.102648,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":3,"dup":false,"k":102,"u_out":0.068237,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":0,"dup":false,"k":103,"u_out":0.493486,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":104,"u_out":0.579029,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":105,"u_out":0.458813,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":true,"delay":3,"dup":false,"k":106,"u_out":0.383288,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":107,"u_out":0.117646,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":5,"dup":false,"k":108,"u_out":0.55004,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":109,"u_out":0.710664,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":1,"dup":false,"k":110,"u_out":0.058437,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":111,"u_out":0.00397,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":112,"u_out":0.206635,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":1,"dup":false,"k":113,"u_out":0.182867,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":114,"u_out":0.737723,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":5,"dup":false,"k":115,"u_out":0.352228,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":true,"delay":4,"dup":false,"k":116,"u_out":0.578867,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":117,"u_out":0.324604,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":true,"delay":2,"dup":false,"k":118,"u_out":0.022227,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":4,"dup":false,"k":119,"u_out":0.824059,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":120,"u_out":0.622685,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":3,"dup":false,"k":121,"u_out":0.961521,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":5,"dup":false,"k":122,"u_out":0.775848,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":1,"dup":false,"k":123,"u_out":0.834489,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":2,"dup":false,"k":124,"u_out":0.072023,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":125,"u_out":0.420305,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":4,"dup":false,"k":126,"u_out":0.86644,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":127,"u_out":0.434666,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":128,"u_out":0.045614,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":129,"u_out":0.660015,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":130,"u_out":0.465191,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":6,"dup":false,"k":131,"u_out":0.682689,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":true,"delay":1,"dup":false,"k":132,"u_out":0.685857,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":5,"dup":false,"k":133,"u_out":0.869875,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":true,"delay":3,"dup":false,"k":134,"u_out":0.971752,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":4,"dup":false,"k":135,"u_out":0.545567,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":1,"dup":false,"k":136,"u_out":0.380909,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":true,"delay":3,"dup":false,"k":137,"u_out":0.835011,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":5,"dup":false,"k":138,"u_out":0.755539,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":1,"dup":false,"k":139,"u_out":0.308451,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":140,"u_out":0.386166,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":141,"u_out":0.009492,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":3,"dup":false,"k":142,"u_out":0.531966,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":5,"dup":false,"k":143,"u_out":0.939066,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":3,"dup":false,"k":144,"u_out":0.779239,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":6,"dup":false,"k":145,"u_out":0.948031,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":3,"dup":false,"k":146,"u_out":0.698136,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":6,"dup":false,"k":147,"u_out":0.035343,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":5,"dup":true,"k":148,"u_out":0.78266,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":5,"dup":false,"k":149,"u_out":0.439755,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":150,"u_out":0.053255,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":0,"dup":false,"k":151,"u_out":0.918417,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":5,"dup":false,"k":152,"u_out":0.213137,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":true,"delay":6,"dup":false,"k":153,"u_out":0.179059,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":true,"delay":0,"dup":false,"k":154,"u_out":0.433018,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":155,"u_out":0.723455,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":2,"dup":false,"k":156,"u_out":0.329293,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":2,"dup":true,"k":157,"u_out":0.864245,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":1,"dup":false,"k":158,"u_out":0.217363,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":4,"dup":true,"k":159,"u_out":0.614838,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":160,"u_out":0.414855,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":4,"dup":false,"k":161,"u_out":0.819799,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":true,"delay":6,"dup":false,"k":162,"u_out":0.61825,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":163,"u_out":0.223127,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":164,"u_out":0.398572,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":true,"delay":1,"dup":false,"k":165,"u_out":0.005407,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":5,"dup":false,"k":166,"u_out":0.152856,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":167,"u_out":0.782808,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":1,"dup":false,"k":168,"u_out":0.422349,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":169,"u_out":0.867184,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":170,"u_out":0.448094,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":171,"u_out":0.754328,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":172,"u_out":0.017616,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":6,"dup":false,"k":173,"u_out":0.844124,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":174,"u_out":0.645196,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":175,"u_out":0.119962,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":6,"dup":false,"k":176,"u_out":0.262071,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":0,"dup":true,"k":177,"u_out":0.25132,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":178,"u_out":0.275899,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":true,"delay":6,"dup":false,"k":179,"u_out":0.576995,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":0,"dup":false,"k":180,"u_out":0.518713,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":5,"dup":false,"k":181,"u_out":0.548964,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":182,"u_out":0.997042,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":183,"u_out":0.186503,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":0,"dup":true,"k":184,"u_out":0.011475,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":185,"u_out":0.433121,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":186,"u_out":0.013968,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":5,"dup":false,"k":187,"u_out":0.754584,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":0,"dup":false,"k":188,"u_out":0.507426,"unknown":true,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":3,"dup":false,"k":189,"u_out":0.681345,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":4,"dup":false,"k":190,"u_out":0.964786,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":2,"dup":false,"k":191,"u_out":0.112357,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":6,"dup":false,"k":192,"u_out":0.718866,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":1,"dup":false,"k":193,"u_out":0.520235,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":194,"u_out":0.697766,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":6,"dup":false,"k":195,"u_out":0.338458,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":196,"u_out":0.026587,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":1,"dup":false,"k":197,"u_out":0.986606,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":2,"dup":false,"k":198,"u_out":0.268694,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":2,"dup":false,"k":199,"u_out":0.612389,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":4,"dup":false,"k":200,"u_out":0.274189,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":2,"dup":false,"k":201,"u_out":0.393111,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":2,"dup":false,"k":202,"u_out":0.534277,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":0,"dup":false,"k":203,"u_out":0.691684,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":204,"u_out":0.615209,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":205,"u_out":0.304425,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":true,"delay":1,"dup":false,"k":206,"u_out":0.975791,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":6,"dup":false,"k":207,"u_out":0.775492,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":208,"u_out":0.589352,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":true,"delay":5,"dup":false,"k":209,"u_out":0.799479,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":1,"dup":true,"k":210,"u_out":0.503686,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":0,"dup":false,"k":211,"u_out":0.926502,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":212,"u_out":0.948325,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":6,"dup":false,"k":213,"u_out":0.488287,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":true,"delay":0,"dup":false,"k":214,"u_out":0.131551,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":215,"u_out":0.590524,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":1,"dup":false,"k":216,"u_out":0.506579,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":4,"dup":false,"k":217,"u_out":0.516395,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":5,"dup":false,"k":218,"u_out":0.952343,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":219,"u_out":0.59013,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":0,"dup":false,"k":220,"u_out":0.001232,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":221,"u_out":0.387109,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":222,"u_out":0.528219,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":0,"dup":false,"k":223,"u_out":0.707943,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":224,"u_out":0.806507,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":1,"dup":false,"k":225,"u_out":0.076927,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":1,"dup":false,"k":226,"u_out":0.423924,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":1,"dup":false,"k":227,"u_out":0.301195,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":0,"dup":true,"k":228,"u_out":0.278658,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":229,"u_out":0.306956,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":5,"dup":false,"k":230,"u_out":0.405232,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":true,"delay":5,"dup":false,"k":231,"u_out":0.063989,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":1,"dup":false,"k":232,"u_out":0.903336,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":4,"dup":false,"k":233,"u_out":0.488997,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":6,"dup":false,"k":234,"u_out":0.912022,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":2,"dup":false,"k":235,"u_out":0.355897,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":236,"u_out":0.575924,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":237,"u_out":0.203049,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":5,"dup":false,"k":238,"u_out":0.189131,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":239,"u_out":0.772741,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":2,"dup":false,"k":240,"u_out":0.839382,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":true,"delay":3,"dup":false,"k":241,"u_out":0.994705,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":5,"dup":false,"k":242,"u_out":0.016811,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":4,"dup":false,"k":243,"u_out":0.68518,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":244,"u_out":0.719965,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":5,"dup":false,"k":245,"u_out":0.58887,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":2,"dup":false,"k":246,"u_out":0.465487,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":true,"delay":3,"dup":false,"k":247,"u_out":0.551404,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":true,"delay":1,"dup":false,"k":248,"u_out":0.71531,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":5,"dup":false,"k":249,"u_out":0.178404,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":true,"delay":4,"dup":false,"k":250,"u_out":0.653636,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":0,"dup":false,"k":251,"u_out":0.958397,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":5,"dup":false,"k":252,"u_out":0.149684,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":3,"dup":false,"k":253,"u_out":0.430697,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":0,"dup":false,"k":254,"u_out":0.231642,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":255,"u_out":0.338447,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":true,"delay":4,"dup":false,"k":256,"u_out":0.548459,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":257,"u_out":0.743834,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":3,"dup":false,"k":258,"u_out":0.670468,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":4,"dup":false,"k":259,"u_out":0.443099,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":260,"u_out":0.07506,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":3,"dup":false,"k":261,"u_out":0.258213,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":2,"dup":false,"k":262,"u_out":0.570526,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":5,"dup":false,"k":263,"u_out":0.335987,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":1,"dup":false,"k":264,"u_out":0.907264,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":265,"u_out":0.629561,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":266,"u_out":0.39405,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":5,"dup":false,"k":267,"u_out":0.058078,"unknown":true,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":268,"u_out":0.221112,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":269,"u_out":0.276315,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":1,"dup":false,"k":270,"u_out":0.884694,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":271,"u_out":0.382334,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":272,"u_out":0.823188,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":273,"u_out":0.751774,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":3,"dup":false,"k":274,"u_out":0.781534,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":5,"dup":false,"k":275,"u_out":0.573963,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":276,"u_out":0.427822,"unknown":true,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":4,"dup":false,"k":277,"u_out":0.002629,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":0,"dup":false,"k":278,"u_out":0.609865,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":4,"dup":false,"k":279,"u_out":0.402612,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":5,"dup":false,"k":280,"u_out":0.884701,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":0,"dup":false,"k":281,"u_out":0.25529,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":5,"dup":false,"k":282,"u_out":0.764186,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":3,"dup":false,"k":283,"u_out":0.157987,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":0,"dup":false,"k":284,"u_out":0.921979,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":6,"dup":false,"k":285,"u_out":0.267988,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":5,"dup":false,"k":286,"u_out":0.335729,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":0,"dup":true,"k":287,"u_out":0.955803,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":5,"dup":false,"k":288,"u_out":0.404309,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":289,"u_out":0.633241,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":290,"u_out":0.85612,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":291,"u_out":0.009516,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":6,"dup":false,"k":292,"u_out":0.802695,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":5,"dup":false,"k":293,"u_out":0.882166,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":5,"dup":false,"k":294,"u_out":0.071133,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":5,"dup":false,"k":295,"u_out":0.935369,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":296,"u_out":0.226477,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":true,"delay":1,"dup":false,"k":297,"u_out":0.150161,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":1,"dup":false,"k":298,"u_out":0.630868,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":299,"u_out":0.872198,"unknown":false,"unknown_good":false} diff --git a/bench/individuality/fixtures/credit/draws-7.jsonl b/bench/individuality/fixtures/credit/draws-7.jsonl new file mode 100644 index 0000000..2a7c447 --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-7.jsonl @@ -0,0 +1,300 @@ +{"blast":0.56,"cancel":false,"delay":4,"dup":false,"k":0,"u_out":0.800484,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":1,"u_out":0.056876,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":1,"dup":false,"k":2,"u_out":0.436283,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":3,"u_out":0.058018,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":true,"k":4,"u_out":0.570872,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":3,"dup":true,"k":5,"u_out":0.283772,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":true,"delay":1,"dup":false,"k":6,"u_out":0.184097,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":1,"dup":false,"k":7,"u_out":0.946267,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":2,"dup":false,"k":8,"u_out":0.625097,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":6,"dup":false,"k":9,"u_out":0.866717,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":2,"dup":false,"k":10,"u_out":0.249842,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":11,"u_out":0.888336,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":4,"dup":false,"k":12,"u_out":0.019615,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":1,"dup":true,"k":13,"u_out":0.470463,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":5,"dup":false,"k":14,"u_out":0.698539,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":1,"dup":false,"k":15,"u_out":0.425146,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":16,"u_out":0.891758,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":17,"u_out":0.515359,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":true,"delay":1,"dup":false,"k":18,"u_out":0.341161,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":19,"u_out":0.568666,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":2,"dup":false,"k":20,"u_out":0.940816,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":true,"delay":2,"dup":false,"k":21,"u_out":0.740777,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":22,"u_out":0.33894,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":true,"delay":4,"dup":false,"k":23,"u_out":0.9126,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":0,"dup":false,"k":24,"u_out":0.798873,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":2,"dup":false,"k":25,"u_out":0.027198,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":26,"u_out":0.49686,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":27,"u_out":0.424003,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":28,"u_out":0.95661,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":3,"dup":false,"k":29,"u_out":0.645468,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":0,"dup":false,"k":30,"u_out":0.827876,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":true,"delay":6,"dup":false,"k":31,"u_out":0.040926,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":true,"delay":0,"dup":false,"k":32,"u_out":0.65557,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":true,"delay":0,"dup":false,"k":33,"u_out":0.620046,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":34,"u_out":0.448398,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":4,"dup":false,"k":35,"u_out":0.497189,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":5,"dup":false,"k":36,"u_out":0.861391,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":37,"u_out":0.399341,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":6,"dup":false,"k":38,"u_out":0.793495,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":39,"u_out":0.398002,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":40,"u_out":0.845037,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":2,"dup":false,"k":41,"u_out":0.183514,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":6,"dup":false,"k":42,"u_out":0.16145,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":3,"dup":false,"k":43,"u_out":0.73783,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":6,"dup":false,"k":44,"u_out":0.246026,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":1,"dup":true,"k":45,"u_out":0.935835,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":4,"dup":false,"k":46,"u_out":0.468853,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":0,"dup":false,"k":47,"u_out":0.870993,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":48,"u_out":0.92033,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":1,"dup":false,"k":49,"u_out":0.337397,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":6,"dup":false,"k":50,"u_out":0.313561,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":5,"dup":false,"k":51,"u_out":0.184654,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":true,"delay":5,"dup":false,"k":52,"u_out":0.085782,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":2,"dup":false,"k":53,"u_out":0.51705,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":4,"dup":false,"k":54,"u_out":0.991122,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":55,"u_out":0.605662,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":true,"delay":6,"dup":false,"k":56,"u_out":0.666873,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":true,"delay":3,"dup":false,"k":57,"u_out":0.510386,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":3,"dup":false,"k":58,"u_out":0.170237,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":59,"u_out":0.643729,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":5,"dup":true,"k":60,"u_out":0.981715,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":1,"dup":false,"k":61,"u_out":0.293714,"unknown":true,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":62,"u_out":0.076322,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":true,"delay":0,"dup":false,"k":63,"u_out":0.271907,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":64,"u_out":0.430968,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":65,"u_out":0.751392,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":6,"dup":false,"k":66,"u_out":0.522302,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":3,"dup":false,"k":67,"u_out":0.609236,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":0,"dup":false,"k":68,"u_out":0.603306,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":69,"u_out":0.337833,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":1,"dup":false,"k":70,"u_out":0.064006,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":2,"dup":false,"k":71,"u_out":0.892437,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":6,"dup":false,"k":72,"u_out":0.247504,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":73,"u_out":0.769683,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":74,"u_out":0.77287,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":1,"dup":false,"k":75,"u_out":0.457688,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":1,"dup":false,"k":76,"u_out":0.986094,"unknown":true,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":0,"dup":false,"k":77,"u_out":0.741832,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":2,"dup":false,"k":78,"u_out":0.358201,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":79,"u_out":0.086915,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":2,"dup":false,"k":80,"u_out":0.559622,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":5,"dup":false,"k":81,"u_out":0.86499,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":5,"dup":false,"k":82,"u_out":0.748469,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":6,"dup":false,"k":83,"u_out":0.281765,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":84,"u_out":0.950205,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":85,"u_out":0.594555,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":3,"dup":false,"k":86,"u_out":0.504214,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":0,"dup":false,"k":87,"u_out":0.643254,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":6,"dup":false,"k":88,"u_out":0.438921,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":3,"dup":false,"k":89,"u_out":0.145137,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":0,"dup":false,"k":90,"u_out":0.756334,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":1,"dup":false,"k":91,"u_out":0.704662,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":4,"dup":false,"k":92,"u_out":0.833589,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":1,"dup":false,"k":93,"u_out":0.103857,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":true,"delay":3,"dup":false,"k":94,"u_out":0.692874,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":95,"u_out":0.674544,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":0,"dup":false,"k":96,"u_out":0.844074,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":3,"dup":false,"k":97,"u_out":0.38553,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":98,"u_out":0.339208,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":4,"dup":false,"k":99,"u_out":0.010945,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":4,"dup":false,"k":100,"u_out":0.064901,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":2,"dup":false,"k":101,"u_out":0.64262,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":102,"u_out":0.590639,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":103,"u_out":0.300865,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":104,"u_out":0.013645,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":6,"dup":false,"k":105,"u_out":0.62124,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":106,"u_out":0.560509,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":5,"dup":false,"k":107,"u_out":0.550654,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":108,"u_out":0.516069,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":109,"u_out":0.297149,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":4,"dup":false,"k":110,"u_out":0.11972,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":true,"delay":5,"dup":false,"k":111,"u_out":0.85595,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":1,"dup":true,"k":112,"u_out":0.825017,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":3,"dup":false,"k":113,"u_out":0.532475,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":1,"dup":false,"k":114,"u_out":0.624889,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":5,"dup":false,"k":115,"u_out":0.546041,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":116,"u_out":0.583037,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":4,"dup":false,"k":117,"u_out":0.856481,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":6,"dup":false,"k":118,"u_out":0.378348,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":1,"dup":false,"k":119,"u_out":0.9466,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":120,"u_out":0.663018,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":4,"dup":false,"k":121,"u_out":0.864943,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":5,"dup":false,"k":122,"u_out":0.705177,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":123,"u_out":0.67188,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":124,"u_out":0.999635,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":125,"u_out":0.631817,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":126,"u_out":0.956259,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":1,"dup":false,"k":127,"u_out":0.720788,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":4,"dup":false,"k":128,"u_out":0.476185,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":5,"dup":false,"k":129,"u_out":0.850456,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":5,"dup":false,"k":130,"u_out":0.372086,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":131,"u_out":0.258647,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":0,"dup":false,"k":132,"u_out":0.219909,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":true,"delay":4,"dup":true,"k":133,"u_out":0.556741,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":134,"u_out":0.270386,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":4,"dup":false,"k":135,"u_out":0.916451,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":6,"dup":true,"k":136,"u_out":0.772932,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":1,"dup":false,"k":137,"u_out":0.954345,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":138,"u_out":0.947333,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":true,"delay":1,"dup":false,"k":139,"u_out":0.179827,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":140,"u_out":0.708068,"unknown":true,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":0,"dup":false,"k":141,"u_out":0.743362,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":5,"dup":false,"k":142,"u_out":0.615498,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":true,"delay":0,"dup":false,"k":143,"u_out":0.800892,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":false,"delay":6,"dup":true,"k":144,"u_out":0.190268,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":3,"dup":false,"k":145,"u_out":0.51669,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":true,"delay":1,"dup":false,"k":146,"u_out":0.119332,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":147,"u_out":0.159265,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":true,"delay":3,"dup":false,"k":148,"u_out":0.324244,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":149,"u_out":0.250102,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":6,"dup":false,"k":150,"u_out":0.823717,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":0,"dup":false,"k":151,"u_out":0.760377,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":5,"dup":false,"k":152,"u_out":0.547788,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":153,"u_out":0.227471,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":true,"delay":0,"dup":false,"k":154,"u_out":0.148679,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":155,"u_out":0.600563,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":2,"dup":false,"k":156,"u_out":0.059832,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":157,"u_out":0.28228,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":1,"dup":false,"k":158,"u_out":0.857378,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":1,"dup":false,"k":159,"u_out":0.920981,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":0,"dup":false,"k":160,"u_out":0.236608,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":161,"u_out":0.593767,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":5,"dup":false,"k":162,"u_out":0.254838,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":true,"delay":0,"dup":false,"k":163,"u_out":0.981721,"unknown":true,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":4,"dup":false,"k":164,"u_out":0.403008,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":165,"u_out":0.396406,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":true,"delay":2,"dup":false,"k":166,"u_out":0.496683,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":3,"dup":false,"k":167,"u_out":0.953664,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":4,"dup":false,"k":168,"u_out":0.061296,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":169,"u_out":0.943743,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":0,"dup":false,"k":170,"u_out":0.677138,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":6,"dup":false,"k":171,"u_out":0.108322,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":172,"u_out":0.538267,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":1,"dup":false,"k":173,"u_out":0.300629,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":174,"u_out":0.767609,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":6,"dup":false,"k":175,"u_out":0.722218,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":6,"dup":false,"k":176,"u_out":0.624121,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":2,"dup":false,"k":177,"u_out":0.172713,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":true,"delay":0,"dup":false,"k":178,"u_out":0.388353,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":5,"dup":false,"k":179,"u_out":0.92715,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":0,"dup":false,"k":180,"u_out":0.227988,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":181,"u_out":0.095586,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":5,"dup":false,"k":182,"u_out":0.704086,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":2,"dup":false,"k":183,"u_out":0.828039,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":184,"u_out":0.711255,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":5,"dup":false,"k":185,"u_out":0.879064,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":true,"delay":6,"dup":false,"k":186,"u_out":0.739719,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":true,"delay":6,"dup":false,"k":187,"u_out":0.045532,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":188,"u_out":0.611208,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":3,"dup":false,"k":189,"u_out":0.382606,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":4,"dup":false,"k":190,"u_out":0.596452,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":true,"delay":0,"dup":false,"k":191,"u_out":0.551968,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":3,"dup":false,"k":192,"u_out":0.086361,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":193,"u_out":0.338594,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":2,"dup":false,"k":194,"u_out":0.937743,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":195,"u_out":0.833076,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":2,"dup":false,"k":196,"u_out":0.597915,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":4,"dup":false,"k":197,"u_out":0.654579,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":0,"dup":false,"k":198,"u_out":0.075587,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":5,"dup":false,"k":199,"u_out":0.368363,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":200,"u_out":0.09044,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":3,"dup":false,"k":201,"u_out":0.052018,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":4,"dup":false,"k":202,"u_out":0.096798,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":203,"u_out":0.30149,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":204,"u_out":0.321223,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":5,"dup":false,"k":205,"u_out":0.564663,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":206,"u_out":0.108561,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":207,"u_out":0.659494,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":4,"dup":false,"k":208,"u_out":0.718968,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":5,"dup":false,"k":209,"u_out":0.031483,"unknown":true,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":2,"dup":false,"k":210,"u_out":0.256429,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":3,"dup":false,"k":211,"u_out":0.48558,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":212,"u_out":0.640988,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":true,"delay":3,"dup":false,"k":213,"u_out":0.756045,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":0,"dup":false,"k":214,"u_out":0.804553,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":6,"dup":false,"k":215,"u_out":0.775528,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":1,"dup":false,"k":216,"u_out":0.123534,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":217,"u_out":0.012747,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":0,"dup":false,"k":218,"u_out":0.304934,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":3,"dup":true,"k":219,"u_out":0.117017,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":5,"dup":false,"k":220,"u_out":0.642432,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":6,"dup":false,"k":221,"u_out":0.79541,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":222,"u_out":0.572017,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":true,"delay":1,"dup":false,"k":223,"u_out":0.24534,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":224,"u_out":0.600745,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":3,"dup":false,"k":225,"u_out":0.261366,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":3,"dup":false,"k":226,"u_out":0.763887,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":5,"dup":false,"k":227,"u_out":0.492035,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":228,"u_out":0.736016,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":229,"u_out":0.115926,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":230,"u_out":0.061336,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":1,"dup":false,"k":231,"u_out":0.538843,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":232,"u_out":0.80898,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":233,"u_out":0.595911,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":234,"u_out":0.892925,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":4,"dup":false,"k":235,"u_out":0.826658,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":2,"dup":false,"k":236,"u_out":0.69765,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":true,"delay":2,"dup":false,"k":237,"u_out":0.770839,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":true,"delay":4,"dup":false,"k":238,"u_out":0.696826,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":239,"u_out":0.386068,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":2,"dup":false,"k":240,"u_out":0.131788,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":241,"u_out":0.321995,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":242,"u_out":0.516466,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":2,"dup":false,"k":243,"u_out":0.385675,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":244,"u_out":0.351619,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":1,"dup":false,"k":245,"u_out":0.059137,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":246,"u_out":0.089073,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":247,"u_out":0.375735,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":3,"dup":false,"k":248,"u_out":0.213092,"unknown":true,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":0,"dup":false,"k":249,"u_out":0.469501,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":false,"k":250,"u_out":0.376783,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":4,"dup":false,"k":251,"u_out":0.195875,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":5,"dup":false,"k":252,"u_out":0.625818,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":6,"dup":false,"k":253,"u_out":0.469836,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":0,"dup":false,"k":254,"u_out":0.028364,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":0,"dup":false,"k":255,"u_out":0.545091,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":256,"u_out":0.478902,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":6,"dup":false,"k":257,"u_out":0.388821,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":3,"dup":false,"k":258,"u_out":0.764252,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":4,"dup":false,"k":259,"u_out":0.295063,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":true,"delay":5,"dup":false,"k":260,"u_out":0.400895,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":1,"dup":false,"k":261,"u_out":0.955106,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":262,"u_out":0.67348,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":0,"dup":false,"k":263,"u_out":0.345615,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":3,"dup":false,"k":264,"u_out":0.208293,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":0,"dup":true,"k":265,"u_out":0.063127,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":true,"delay":2,"dup":false,"k":266,"u_out":0.759135,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":6,"dup":false,"k":267,"u_out":0.660421,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":268,"u_out":0.748372,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":269,"u_out":0.798577,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":2,"dup":false,"k":270,"u_out":0.186966,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":2,"dup":false,"k":271,"u_out":0.620065,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":true,"delay":6,"dup":false,"k":272,"u_out":0.410907,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":2,"dup":false,"k":273,"u_out":0.532208,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":6,"dup":false,"k":274,"u_out":0.805856,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":6,"dup":false,"k":275,"u_out":0.582759,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":0,"dup":false,"k":276,"u_out":0.8756,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":277,"u_out":0.502119,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":0,"dup":false,"k":278,"u_out":0.159346,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":3,"dup":false,"k":279,"u_out":0.646343,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":280,"u_out":0.971544,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":true,"delay":5,"dup":false,"k":281,"u_out":0.596999,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":282,"u_out":0.485373,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":283,"u_out":0.571596,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":4,"dup":false,"k":284,"u_out":0.328363,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":5,"dup":false,"k":285,"u_out":0.715284,"unknown":true,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":4,"dup":false,"k":286,"u_out":0.771588,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":6,"dup":false,"k":287,"u_out":0.800991,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":true,"delay":3,"dup":false,"k":288,"u_out":0.864433,"unknown":true,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":289,"u_out":0.624013,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":0,"dup":false,"k":290,"u_out":0.415738,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":4,"dup":false,"k":291,"u_out":0.467418,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":5,"dup":false,"k":292,"u_out":0.09474,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":293,"u_out":0.641565,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":294,"u_out":0.162251,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":4,"dup":false,"k":295,"u_out":0.34489,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":296,"u_out":0.187385,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":5,"dup":false,"k":297,"u_out":0.243885,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":1,"dup":false,"k":298,"u_out":0.994303,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":true,"delay":5,"dup":false,"k":299,"u_out":0.548895,"unknown":false,"unknown_good":false} diff --git a/bench/individuality/fixtures/credit/draws-8.jsonl b/bench/individuality/fixtures/credit/draws-8.jsonl new file mode 100644 index 0000000..54ca83c --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-8.jsonl @@ -0,0 +1,300 @@ +{"blast":0.36,"cancel":true,"delay":2,"dup":false,"k":0,"u_out":0.958399,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":5,"dup":false,"k":1,"u_out":0.141678,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":2,"u_out":0.327796,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":0,"dup":false,"k":3,"u_out":0.375337,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":4,"u_out":0.829306,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":5,"u_out":0.769915,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":4,"dup":false,"k":6,"u_out":0.357577,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":5,"dup":false,"k":7,"u_out":0.451451,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":0,"dup":false,"k":8,"u_out":0.729571,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":9,"u_out":0.494702,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":10,"u_out":0.167514,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":true,"delay":1,"dup":false,"k":11,"u_out":0.553787,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":12,"u_out":0.434939,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":5,"dup":false,"k":13,"u_out":0.342762,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":true,"delay":3,"dup":false,"k":14,"u_out":0.972463,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":5,"dup":false,"k":15,"u_out":0.235987,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":0,"dup":false,"k":16,"u_out":0.334599,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":17,"u_out":0.808214,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":2,"dup":false,"k":18,"u_out":0.677929,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":3,"dup":false,"k":19,"u_out":0.273066,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":20,"u_out":0.409694,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":21,"u_out":0.152139,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":2,"dup":false,"k":22,"u_out":0.713363,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":2,"dup":false,"k":23,"u_out":0.183801,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":24,"u_out":0.817414,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":true,"delay":1,"dup":true,"k":25,"u_out":0.017861,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":3,"dup":false,"k":26,"u_out":0.429632,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":4,"dup":false,"k":27,"u_out":0.861632,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":6,"dup":false,"k":28,"u_out":0.197661,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":0,"dup":false,"k":29,"u_out":0.168018,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":4,"dup":false,"k":30,"u_out":0.990332,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":true,"delay":0,"dup":false,"k":31,"u_out":0.558441,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":5,"dup":false,"k":32,"u_out":0.146813,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":1,"dup":false,"k":33,"u_out":0.31859,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":true,"delay":1,"dup":false,"k":34,"u_out":0.994958,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":6,"dup":false,"k":35,"u_out":0.234617,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":36,"u_out":0.184822,"unknown":true,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":5,"dup":false,"k":37,"u_out":0.323655,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":5,"dup":false,"k":38,"u_out":0.785225,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":true,"delay":2,"dup":true,"k":39,"u_out":0.923235,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":1,"dup":false,"k":40,"u_out":0.581163,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":41,"u_out":0.913931,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":3,"dup":false,"k":42,"u_out":0.760776,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":0,"dup":false,"k":43,"u_out":0.594533,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":5,"dup":false,"k":44,"u_out":0.646694,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":false,"k":45,"u_out":0.847298,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":1,"dup":false,"k":46,"u_out":0.506949,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":0,"dup":false,"k":47,"u_out":0.147003,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":5,"dup":false,"k":48,"u_out":0.778637,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":true,"delay":2,"dup":false,"k":49,"u_out":0.639392,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":2,"dup":false,"k":50,"u_out":0.601348,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":0,"dup":false,"k":51,"u_out":0.903636,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":52,"u_out":0.370237,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":53,"u_out":0.306722,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":2,"dup":false,"k":54,"u_out":0.460266,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":3,"dup":false,"k":55,"u_out":0.602999,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":56,"u_out":0.030987,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":6,"dup":false,"k":57,"u_out":0.17035,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":3,"dup":false,"k":58,"u_out":0.325212,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":59,"u_out":0.205843,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":0,"dup":false,"k":60,"u_out":0.281305,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":0,"dup":false,"k":61,"u_out":0.202592,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":2,"dup":false,"k":62,"u_out":0.692125,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":4,"dup":false,"k":63,"u_out":0.398143,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":64,"u_out":0.444963,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":65,"u_out":0.299035,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":3,"dup":false,"k":66,"u_out":0.874659,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":true,"delay":4,"dup":false,"k":67,"u_out":0.237706,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":5,"dup":false,"k":68,"u_out":0.735949,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":true,"delay":3,"dup":false,"k":69,"u_out":0.512823,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":6,"dup":false,"k":70,"u_out":0.288176,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":0,"dup":false,"k":71,"u_out":0.357099,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":true,"delay":0,"dup":false,"k":72,"u_out":0.929607,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":73,"u_out":0.976808,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":1,"dup":true,"k":74,"u_out":0.844694,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":75,"u_out":0.359095,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":0,"dup":false,"k":76,"u_out":0.927086,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":3,"dup":false,"k":77,"u_out":0.627059,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":0,"dup":false,"k":78,"u_out":0.601373,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":true,"delay":0,"dup":false,"k":79,"u_out":0.542401,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":false,"delay":0,"dup":false,"k":80,"u_out":0.704439,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":3,"dup":false,"k":81,"u_out":0.58329,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":0,"dup":false,"k":82,"u_out":0.391957,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":2,"dup":false,"k":83,"u_out":0.958643,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":84,"u_out":0.443791,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":85,"u_out":0.835122,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":0,"dup":false,"k":86,"u_out":0.663941,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":5,"dup":false,"k":87,"u_out":0.365469,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":0,"dup":true,"k":88,"u_out":0.898341,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":3,"dup":true,"k":89,"u_out":0.168862,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":1,"dup":false,"k":90,"u_out":0.340551,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":5,"dup":false,"k":91,"u_out":0.882797,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":92,"u_out":0.352935,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":6,"dup":false,"k":93,"u_out":0.835047,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":true,"delay":0,"dup":false,"k":94,"u_out":0.627911,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":1,"dup":true,"k":95,"u_out":0.398275,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":96,"u_out":0.937809,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":5,"dup":false,"k":97,"u_out":0.393515,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":4,"dup":false,"k":98,"u_out":0.264341,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":6,"dup":false,"k":99,"u_out":0.258827,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":2,"dup":false,"k":100,"u_out":0.072909,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":101,"u_out":0.325585,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":true,"delay":4,"dup":false,"k":102,"u_out":0.376559,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":103,"u_out":0.734999,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":0,"dup":false,"k":104,"u_out":0.285323,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":105,"u_out":0.512006,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":106,"u_out":0.946121,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":107,"u_out":0.342521,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":6,"dup":false,"k":108,"u_out":0.190449,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":3,"dup":true,"k":109,"u_out":0.030286,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":2,"dup":false,"k":110,"u_out":0.224101,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":5,"dup":false,"k":111,"u_out":0.29278,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":1,"dup":false,"k":112,"u_out":0.247772,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":5,"dup":false,"k":113,"u_out":0.018636,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":5,"dup":false,"k":114,"u_out":0.130622,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":115,"u_out":0.477329,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":1,"dup":false,"k":116,"u_out":0.590379,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":6,"dup":false,"k":117,"u_out":0.191977,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":3,"dup":false,"k":118,"u_out":0.900785,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":6,"dup":false,"k":119,"u_out":0.961411,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":120,"u_out":0.982974,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":2,"dup":false,"k":121,"u_out":0.644354,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":5,"dup":false,"k":122,"u_out":0.478043,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":6,"dup":false,"k":123,"u_out":0.495164,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":6,"dup":false,"k":124,"u_out":0.477582,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":125,"u_out":0.98232,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":126,"u_out":0.445434,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":127,"u_out":0.586957,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":128,"u_out":0.44041,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":129,"u_out":0.027487,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":130,"u_out":0.813266,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":1,"dup":false,"k":131,"u_out":0.396849,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":4,"dup":false,"k":132,"u_out":0.972946,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":133,"u_out":0.931333,"unknown":false,"unknown_good":false} +{"blast":0.64,"cancel":false,"delay":2,"dup":false,"k":134,"u_out":0.220344,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":6,"dup":false,"k":135,"u_out":0.020101,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":136,"u_out":0.217805,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":1,"dup":false,"k":137,"u_out":0.084837,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":true,"delay":0,"dup":false,"k":138,"u_out":0.337793,"unknown":true,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":3,"dup":false,"k":139,"u_out":0.255211,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":5,"dup":false,"k":140,"u_out":0.370623,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":141,"u_out":0.408218,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":false,"k":142,"u_out":0.635049,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":2,"dup":false,"k":143,"u_out":0.648534,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":4,"dup":true,"k":144,"u_out":0.311609,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":0,"dup":false,"k":145,"u_out":0.019684,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":1,"dup":false,"k":146,"u_out":0.848235,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":6,"dup":false,"k":147,"u_out":0.34137,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":4,"dup":false,"k":148,"u_out":0.622205,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":0,"dup":false,"k":149,"u_out":0.896903,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":4,"dup":false,"k":150,"u_out":0.468092,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":5,"dup":false,"k":151,"u_out":0.918121,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":152,"u_out":0.940976,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":0,"dup":false,"k":153,"u_out":0.893058,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":0,"dup":false,"k":154,"u_out":0.901023,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":6,"dup":false,"k":155,"u_out":0.060981,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":156,"u_out":0.516957,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":157,"u_out":0.03494,"unknown":false,"unknown_good":false} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":158,"u_out":0.49589,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":1,"dup":false,"k":159,"u_out":0.41907,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":0,"dup":false,"k":160,"u_out":0.903984,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":true,"delay":1,"dup":false,"k":161,"u_out":0.915179,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":1,"dup":false,"k":162,"u_out":0.735416,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":5,"dup":false,"k":163,"u_out":0.335493,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":6,"dup":false,"k":164,"u_out":0.578894,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":165,"u_out":0.038494,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":166,"u_out":0.054194,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":true,"delay":2,"dup":false,"k":167,"u_out":0.233935,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":168,"u_out":0.929097,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":2,"dup":false,"k":169,"u_out":0.150853,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":170,"u_out":0.354358,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":true,"delay":3,"dup":false,"k":171,"u_out":0.688737,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":172,"u_out":0.892421,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":0,"dup":false,"k":173,"u_out":0.261817,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":174,"u_out":0.794777,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":4,"dup":false,"k":175,"u_out":0.462428,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":3,"dup":false,"k":176,"u_out":0.325157,"unknown":false,"unknown_good":true} +{"blast":0.19,"cancel":false,"delay":6,"dup":false,"k":177,"u_out":0.207435,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":2,"dup":false,"k":178,"u_out":0.517092,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":4,"dup":false,"k":179,"u_out":0.252474,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":4,"dup":true,"k":180,"u_out":0.077625,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":2,"dup":false,"k":181,"u_out":0.845509,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":182,"u_out":0.053013,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":true,"delay":2,"dup":false,"k":183,"u_out":0.984288,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":5,"dup":false,"k":184,"u_out":0.70038,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":4,"dup":false,"k":185,"u_out":0.856829,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":186,"u_out":0.224827,"unknown":false,"unknown_good":false} +{"blast":0.47,"cancel":false,"delay":6,"dup":false,"k":187,"u_out":0.25405,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":1,"dup":false,"k":188,"u_out":0.253437,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":5,"dup":false,"k":189,"u_out":0.313966,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":6,"dup":false,"k":190,"u_out":0.48975,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":4,"dup":false,"k":191,"u_out":0.994269,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":6,"dup":false,"k":192,"u_out":0.60381,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":193,"u_out":0.906521,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":3,"dup":false,"k":194,"u_out":0.004609,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":195,"u_out":0.207231,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":1,"dup":false,"k":196,"u_out":0.171097,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":1,"dup":false,"k":197,"u_out":0.932635,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":1,"dup":false,"k":198,"u_out":0.775681,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":false,"delay":4,"dup":false,"k":199,"u_out":0.790325,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":true,"delay":6,"dup":false,"k":200,"u_out":0.843122,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":201,"u_out":0.797144,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":3,"dup":false,"k":202,"u_out":0.539152,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":0,"dup":false,"k":203,"u_out":0.231257,"unknown":false,"unknown_good":false} +{"blast":0.18,"cancel":false,"delay":3,"dup":false,"k":204,"u_out":0.67859,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":false,"delay":5,"dup":false,"k":205,"u_out":0.821181,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":0,"dup":false,"k":206,"u_out":0.310025,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":true,"delay":4,"dup":false,"k":207,"u_out":0.769716,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":208,"u_out":0.148809,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":3,"dup":false,"k":209,"u_out":0.619315,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":1,"dup":false,"k":210,"u_out":0.640992,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":1,"dup":true,"k":211,"u_out":0.457515,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":true,"delay":1,"dup":false,"k":212,"u_out":0.550462,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":0,"dup":false,"k":213,"u_out":0.004118,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":3,"dup":false,"k":214,"u_out":0.983651,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":4,"dup":false,"k":215,"u_out":0.190806,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":true,"delay":4,"dup":false,"k":216,"u_out":0.017571,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":true,"delay":5,"dup":false,"k":217,"u_out":0.630466,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":4,"dup":false,"k":218,"u_out":0.423588,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":true,"delay":0,"dup":false,"k":219,"u_out":0.861517,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":6,"dup":false,"k":220,"u_out":0.799625,"unknown":false,"unknown_good":true} +{"blast":0.59,"cancel":false,"delay":4,"dup":false,"k":221,"u_out":0.002323,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":3,"dup":true,"k":222,"u_out":0.300178,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":1,"dup":true,"k":223,"u_out":0.497018,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":4,"dup":false,"k":224,"u_out":0.75285,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":225,"u_out":0.956047,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":3,"dup":false,"k":226,"u_out":0.221029,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":0,"dup":false,"k":227,"u_out":0.055826,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":228,"u_out":0.222082,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":2,"dup":false,"k":229,"u_out":0.560915,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":230,"u_out":0.099859,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":1,"dup":false,"k":231,"u_out":0.375177,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":232,"u_out":0.909916,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":2,"dup":false,"k":233,"u_out":0.463625,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":2,"dup":false,"k":234,"u_out":0.099321,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":0,"dup":false,"k":235,"u_out":0.367659,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":2,"dup":false,"k":236,"u_out":0.202092,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":0,"dup":false,"k":237,"u_out":0.833843,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":238,"u_out":0.746901,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":239,"u_out":0.904042,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":5,"dup":true,"k":240,"u_out":0.545029,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":3,"dup":false,"k":241,"u_out":0.019893,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":5,"dup":false,"k":242,"u_out":0.409636,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":243,"u_out":0.616747,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":5,"dup":false,"k":244,"u_out":0.663105,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":3,"dup":false,"k":245,"u_out":0.237006,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":1,"dup":false,"k":246,"u_out":0.617346,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":0,"dup":false,"k":247,"u_out":0.239396,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":3,"dup":false,"k":248,"u_out":0.361331,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":3,"dup":false,"k":249,"u_out":0.38674,"unknown":true,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":6,"dup":true,"k":250,"u_out":0.39128,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":2,"dup":false,"k":251,"u_out":0.028124,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":5,"dup":false,"k":252,"u_out":0.91035,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":5,"dup":false,"k":253,"u_out":0.412466,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":1,"dup":false,"k":254,"u_out":0.82828,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":2,"dup":false,"k":255,"u_out":0.935314,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":3,"dup":false,"k":256,"u_out":0.490687,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":257,"u_out":0.140546,"unknown":false,"unknown_good":true} +{"blast":0.49,"cancel":false,"delay":2,"dup":false,"k":258,"u_out":0.440084,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":4,"dup":false,"k":259,"u_out":0.950057,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":260,"u_out":0.572719,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":true,"delay":0,"dup":false,"k":261,"u_out":0.327375,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":4,"dup":false,"k":262,"u_out":0.10853,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":5,"dup":false,"k":263,"u_out":0.145252,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":264,"u_out":0.142934,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":265,"u_out":0.864281,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":2,"dup":false,"k":266,"u_out":0.889611,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":267,"u_out":0.636289,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":2,"dup":false,"k":268,"u_out":0.366068,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":3,"dup":true,"k":269,"u_out":0.338489,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":270,"u_out":0.639541,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":6,"dup":false,"k":271,"u_out":0.292685,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":4,"dup":false,"k":272,"u_out":0.170372,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":273,"u_out":0.93537,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":3,"dup":false,"k":274,"u_out":0.528118,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":5,"dup":false,"k":275,"u_out":0.252092,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":0,"dup":false,"k":276,"u_out":0.564096,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":1,"dup":true,"k":277,"u_out":0.919896,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":true,"delay":3,"dup":false,"k":278,"u_out":0.009573,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":2,"dup":false,"k":279,"u_out":0.902463,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":0,"dup":false,"k":280,"u_out":0.782953,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":3,"dup":false,"k":281,"u_out":0.54577,"unknown":false,"unknown_good":true} +{"blast":0.22,"cancel":true,"delay":3,"dup":false,"k":282,"u_out":0.974128,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":6,"dup":false,"k":283,"u_out":0.531352,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":2,"dup":false,"k":284,"u_out":0.317212,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":true,"delay":5,"dup":false,"k":285,"u_out":0.131069,"unknown":false,"unknown_good":false} +{"blast":0.17,"cancel":false,"delay":4,"dup":false,"k":286,"u_out":0.886393,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":true,"delay":4,"dup":false,"k":287,"u_out":0.489407,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":6,"dup":false,"k":288,"u_out":0.244554,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":true,"delay":0,"dup":false,"k":289,"u_out":0.962649,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":true,"delay":0,"dup":false,"k":290,"u_out":0.432824,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":1,"dup":false,"k":291,"u_out":0.428032,"unknown":false,"unknown_good":false} +{"blast":0.27,"cancel":false,"delay":6,"dup":false,"k":292,"u_out":0.993575,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":5,"dup":false,"k":293,"u_out":0.180133,"unknown":false,"unknown_good":false} +{"blast":0.22,"cancel":false,"delay":3,"dup":false,"k":294,"u_out":0.303684,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":5,"dup":false,"k":295,"u_out":0.907257,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":true,"delay":2,"dup":true,"k":296,"u_out":0.609745,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":1,"dup":false,"k":297,"u_out":0.387834,"unknown":false,"unknown_good":true} +{"blast":0.47,"cancel":true,"delay":5,"dup":false,"k":298,"u_out":0.600369,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":5,"dup":false,"k":299,"u_out":0.801909,"unknown":false,"unknown_good":false} diff --git a/bench/individuality/fixtures/credit/draws-9.jsonl b/bench/individuality/fixtures/credit/draws-9.jsonl new file mode 100644 index 0000000..4322486 --- /dev/null +++ b/bench/individuality/fixtures/credit/draws-9.jsonl @@ -0,0 +1,300 @@ +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":0,"u_out":0.487362,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":false,"delay":1,"dup":false,"k":1,"u_out":0.766023,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":true,"delay":5,"dup":false,"k":2,"u_out":0.160801,"unknown":true,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":5,"dup":false,"k":3,"u_out":0.353733,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":4,"u_out":0.787349,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":4,"dup":false,"k":5,"u_out":0.033664,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":2,"dup":false,"k":6,"u_out":0.688971,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":1,"dup":false,"k":7,"u_out":0.871677,"unknown":false,"unknown_good":true} +{"blast":0.48,"cancel":false,"delay":0,"dup":false,"k":8,"u_out":0.851975,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":2,"dup":false,"k":9,"u_out":0.024102,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":3,"dup":false,"k":10,"u_out":0.715309,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":true,"delay":2,"dup":false,"k":11,"u_out":0.265359,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":3,"dup":false,"k":12,"u_out":0.080409,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":5,"dup":false,"k":13,"u_out":0.966081,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":14,"u_out":0.660601,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":4,"dup":false,"k":15,"u_out":0.380439,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":true,"delay":1,"dup":false,"k":16,"u_out":0.743289,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":5,"dup":true,"k":17,"u_out":0.843503,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":18,"u_out":0.597283,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":5,"dup":false,"k":19,"u_out":0.112983,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":true,"delay":2,"dup":false,"k":20,"u_out":0.510736,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":3,"dup":false,"k":21,"u_out":0.192323,"unknown":false,"unknown_good":false} +{"blast":0.37,"cancel":false,"delay":0,"dup":false,"k":22,"u_out":0.66041,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":true,"delay":4,"dup":false,"k":23,"u_out":0.217159,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":2,"dup":false,"k":24,"u_out":0.592887,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":25,"u_out":0.429628,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":5,"dup":true,"k":26,"u_out":0.005364,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":6,"dup":false,"k":27,"u_out":0.419419,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":2,"dup":false,"k":28,"u_out":0.286576,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":1,"dup":false,"k":29,"u_out":0.618775,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":5,"dup":false,"k":30,"u_out":0.830572,"unknown":false,"unknown_good":true} +{"blast":0.05,"cancel":false,"delay":1,"dup":false,"k":31,"u_out":0.028295,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":32,"u_out":0.432448,"unknown":false,"unknown_good":true} +{"blast":0.63,"cancel":false,"delay":0,"dup":false,"k":33,"u_out":0.979353,"unknown":false,"unknown_good":true} +{"blast":0.51,"cancel":true,"delay":3,"dup":false,"k":34,"u_out":0.046605,"unknown":false,"unknown_good":true} +{"blast":0.57,"cancel":false,"delay":3,"dup":true,"k":35,"u_out":0.237758,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":true,"delay":6,"dup":false,"k":36,"u_out":0.724951,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":5,"dup":false,"k":37,"u_out":0.242224,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":true,"delay":4,"dup":false,"k":38,"u_out":0.5548,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":39,"u_out":0.953371,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":40,"u_out":0.323337,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":5,"dup":false,"k":41,"u_out":0.949988,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":0,"dup":false,"k":42,"u_out":0.59302,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":false,"delay":4,"dup":false,"k":43,"u_out":0.220414,"unknown":false,"unknown_good":false} +{"blast":0.3,"cancel":false,"delay":4,"dup":false,"k":44,"u_out":0.946047,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":3,"dup":false,"k":45,"u_out":0.992627,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":3,"dup":false,"k":46,"u_out":0.446742,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":true,"delay":6,"dup":false,"k":47,"u_out":0.284767,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":1,"dup":false,"k":48,"u_out":0.630733,"unknown":false,"unknown_good":false} +{"blast":0.1,"cancel":false,"delay":6,"dup":false,"k":49,"u_out":0.443509,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":5,"dup":false,"k":50,"u_out":0.039615,"unknown":false,"unknown_good":false} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":51,"u_out":0.844875,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":0,"dup":false,"k":52,"u_out":0.402413,"unknown":false,"unknown_good":true} +{"blast":0.26,"cancel":false,"delay":1,"dup":false,"k":53,"u_out":0.07823,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":4,"dup":false,"k":54,"u_out":0.204849,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":55,"u_out":0.019851,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":6,"dup":false,"k":56,"u_out":0.099061,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":true,"delay":4,"dup":false,"k":57,"u_out":0.966791,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":0,"dup":false,"k":58,"u_out":0.543969,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":4,"dup":false,"k":59,"u_out":0.7913,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":60,"u_out":0.290818,"unknown":false,"unknown_good":false} +{"blast":0.26,"cancel":false,"delay":3,"dup":false,"k":61,"u_out":0.332795,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":4,"dup":false,"k":62,"u_out":0.2381,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":true,"delay":6,"dup":false,"k":63,"u_out":0.587583,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":5,"dup":false,"k":64,"u_out":0.912541,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":3,"dup":false,"k":65,"u_out":0.678526,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":1,"dup":false,"k":66,"u_out":0.509267,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":67,"u_out":0.398734,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":68,"u_out":0.419673,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":69,"u_out":0.504585,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":70,"u_out":0.995743,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":0,"dup":false,"k":71,"u_out":0.736887,"unknown":false,"unknown_good":false} +{"blast":0.32,"cancel":true,"delay":5,"dup":false,"k":72,"u_out":0.263582,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":true,"delay":0,"dup":false,"k":73,"u_out":0.890167,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":0,"dup":false,"k":74,"u_out":0.116327,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":75,"u_out":0.577677,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":1,"dup":false,"k":76,"u_out":0.887662,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":true,"delay":6,"dup":false,"k":77,"u_out":0.851216,"unknown":false,"unknown_good":false} +{"blast":0.4,"cancel":false,"delay":5,"dup":false,"k":78,"u_out":0.351683,"unknown":false,"unknown_good":false} +{"blast":0.46,"cancel":false,"delay":5,"dup":false,"k":79,"u_out":0.149,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":0,"dup":false,"k":80,"u_out":0.234773,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":5,"dup":false,"k":81,"u_out":0.214377,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":2,"dup":false,"k":82,"u_out":0.894591,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":83,"u_out":0.604273,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":2,"dup":false,"k":84,"u_out":0.661301,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":false,"delay":4,"dup":false,"k":85,"u_out":0.293157,"unknown":false,"unknown_good":false} +{"blast":0.38,"cancel":false,"delay":4,"dup":false,"k":86,"u_out":0.078779,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":87,"u_out":0.582198,"unknown":false,"unknown_good":false} +{"blast":0.41,"cancel":false,"delay":5,"dup":false,"k":88,"u_out":0.020668,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":4,"dup":false,"k":89,"u_out":0.439279,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":true,"delay":6,"dup":false,"k":90,"u_out":0.884552,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":0,"dup":false,"k":91,"u_out":0.338761,"unknown":false,"unknown_good":false} +{"blast":0.65,"cancel":false,"delay":2,"dup":false,"k":92,"u_out":0.465594,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":6,"dup":false,"k":93,"u_out":0.678317,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":3,"dup":false,"k":94,"u_out":0.009207,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":95,"u_out":0.378926,"unknown":true,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":0,"dup":false,"k":96,"u_out":0.41424,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":5,"dup":false,"k":97,"u_out":0.231223,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":3,"dup":false,"k":98,"u_out":0.240994,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":99,"u_out":0.662834,"unknown":false,"unknown_good":false} +{"blast":0.56,"cancel":false,"delay":0,"dup":false,"k":100,"u_out":0.910726,"unknown":false,"unknown_good":true} +{"blast":0.45,"cancel":false,"delay":3,"dup":false,"k":101,"u_out":0.389592,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":3,"dup":false,"k":102,"u_out":0.304843,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":true,"delay":0,"dup":false,"k":103,"u_out":0.458967,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":104,"u_out":0.59048,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":1,"dup":false,"k":105,"u_out":0.074311,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":2,"dup":false,"k":106,"u_out":0.175365,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":true,"delay":0,"dup":false,"k":107,"u_out":0.572696,"unknown":false,"unknown_good":false} +{"blast":0.51,"cancel":false,"delay":4,"dup":false,"k":108,"u_out":0.143406,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":4,"dup":false,"k":109,"u_out":0.559843,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":true,"delay":3,"dup":false,"k":110,"u_out":0.326569,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":0,"dup":false,"k":111,"u_out":0.124748,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":0,"dup":false,"k":112,"u_out":0.942556,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":2,"dup":false,"k":113,"u_out":0.212045,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":4,"dup":false,"k":114,"u_out":0.647715,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":true,"delay":6,"dup":false,"k":115,"u_out":0.27453,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":3,"dup":false,"k":116,"u_out":0.11914,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":117,"u_out":0.327135,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":6,"dup":false,"k":118,"u_out":0.215695,"unknown":false,"unknown_good":true} +{"blast":0.12,"cancel":false,"delay":3,"dup":false,"k":119,"u_out":0.948829,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":true,"delay":1,"dup":false,"k":120,"u_out":0.322899,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":3,"dup":false,"k":121,"u_out":0.213868,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":5,"dup":false,"k":122,"u_out":0.743889,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":123,"u_out":0.348356,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":2,"dup":false,"k":124,"u_out":0.811556,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":1,"dup":false,"k":125,"u_out":0.696658,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":1,"dup":true,"k":126,"u_out":0.232849,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":127,"u_out":0.700666,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":128,"u_out":0.456913,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":6,"dup":false,"k":129,"u_out":0.435684,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":0,"dup":false,"k":130,"u_out":0.994542,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":131,"u_out":0.597,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":3,"dup":false,"k":132,"u_out":0.725591,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":0,"dup":false,"k":133,"u_out":0.890952,"unknown":false,"unknown_good":false} +{"blast":0.09,"cancel":false,"delay":1,"dup":false,"k":134,"u_out":0.124687,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":0,"dup":false,"k":135,"u_out":0.644469,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":true,"delay":3,"dup":false,"k":136,"u_out":0.813234,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":1,"dup":false,"k":137,"u_out":0.209915,"unknown":false,"unknown_good":true} +{"blast":0.34,"cancel":true,"delay":0,"dup":false,"k":138,"u_out":0.506246,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":5,"dup":true,"k":139,"u_out":0.020426,"unknown":false,"unknown_good":false} +{"blast":0.05,"cancel":false,"delay":3,"dup":false,"k":140,"u_out":0.735037,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":4,"dup":true,"k":141,"u_out":0.448102,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":4,"dup":false,"k":142,"u_out":0.417152,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":1,"dup":false,"k":143,"u_out":0.628293,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":6,"dup":false,"k":144,"u_out":0.8387,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":2,"dup":false,"k":145,"u_out":0.41698,"unknown":false,"unknown_good":false} +{"blast":0.25,"cancel":false,"delay":4,"dup":false,"k":146,"u_out":0.889739,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":0,"dup":false,"k":147,"u_out":0.994453,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":4,"dup":false,"k":148,"u_out":0.281388,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":1,"dup":false,"k":149,"u_out":0.547709,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":false,"delay":6,"dup":false,"k":150,"u_out":0.116724,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":4,"dup":false,"k":151,"u_out":0.337145,"unknown":true,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":4,"dup":false,"k":152,"u_out":0.185932,"unknown":false,"unknown_good":true} +{"blast":0.56,"cancel":false,"delay":1,"dup":false,"k":153,"u_out":0.331968,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":false,"delay":6,"dup":true,"k":154,"u_out":0.60968,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":5,"dup":false,"k":155,"u_out":0.175818,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":156,"u_out":0.92635,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":3,"dup":false,"k":157,"u_out":0.844677,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":true,"k":158,"u_out":0.101023,"unknown":false,"unknown_good":true} +{"blast":0.37,"cancel":false,"delay":6,"dup":false,"k":159,"u_out":0.739045,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":2,"dup":true,"k":160,"u_out":0.200371,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":1,"dup":false,"k":161,"u_out":0.739635,"unknown":false,"unknown_good":false} +{"blast":0.48,"cancel":false,"delay":1,"dup":false,"k":162,"u_out":0.373544,"unknown":true,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":0,"dup":false,"k":163,"u_out":0.647564,"unknown":false,"unknown_good":true} +{"blast":0.08,"cancel":false,"delay":0,"dup":false,"k":164,"u_out":0.119251,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":false,"delay":6,"dup":false,"k":165,"u_out":0.372193,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":4,"dup":false,"k":166,"u_out":0.07552,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":2,"dup":false,"k":167,"u_out":0.212646,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":true,"delay":6,"dup":false,"k":168,"u_out":0.013572,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":1,"dup":false,"k":169,"u_out":0.674535,"unknown":false,"unknown_good":false} +{"blast":0.23,"cancel":true,"delay":6,"dup":false,"k":170,"u_out":0.657952,"unknown":false,"unknown_good":true} +{"blast":0.4,"cancel":false,"delay":3,"dup":false,"k":171,"u_out":0.630269,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":0,"dup":false,"k":172,"u_out":0.250345,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":5,"dup":false,"k":173,"u_out":0.462863,"unknown":false,"unknown_good":false} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":174,"u_out":0.491625,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":0,"dup":false,"k":175,"u_out":0.524306,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":176,"u_out":0.584048,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":6,"dup":false,"k":177,"u_out":0.191149,"unknown":false,"unknown_good":true} +{"blast":0.21,"cancel":false,"delay":6,"dup":false,"k":178,"u_out":0.979456,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":0,"dup":false,"k":179,"u_out":0.518121,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":3,"dup":false,"k":180,"u_out":0.687361,"unknown":false,"unknown_good":true} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":181,"u_out":0.695954,"unknown":false,"unknown_good":false} +{"blast":0.63,"cancel":false,"delay":1,"dup":false,"k":182,"u_out":0.29321,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":183,"u_out":0.442202,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":6,"dup":false,"k":184,"u_out":0.785894,"unknown":false,"unknown_good":true} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":185,"u_out":0.080108,"unknown":false,"unknown_good":false} +{"blast":0.08,"cancel":false,"delay":5,"dup":false,"k":186,"u_out":0.649758,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":3,"dup":false,"k":187,"u_out":0.74068,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":true,"delay":4,"dup":false,"k":188,"u_out":0.261954,"unknown":false,"unknown_good":false} +{"blast":0.43,"cancel":false,"delay":4,"dup":false,"k":189,"u_out":0.685253,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":6,"dup":false,"k":190,"u_out":0.806582,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":1,"dup":false,"k":191,"u_out":0.71688,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":4,"dup":false,"k":192,"u_out":0.067287,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":193,"u_out":0.166175,"unknown":false,"unknown_good":false} +{"blast":0.19,"cancel":false,"delay":3,"dup":false,"k":194,"u_out":0.581588,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":4,"dup":false,"k":195,"u_out":0.807636,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":6,"dup":false,"k":196,"u_out":0.604542,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":false,"delay":4,"dup":false,"k":197,"u_out":0.674861,"unknown":false,"unknown_good":false} +{"blast":0.28,"cancel":false,"delay":6,"dup":false,"k":198,"u_out":0.37115,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":3,"dup":false,"k":199,"u_out":0.387608,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":2,"dup":true,"k":200,"u_out":0.423416,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":true,"k":201,"u_out":0.400042,"unknown":false,"unknown_good":true} +{"blast":0.53,"cancel":false,"delay":5,"dup":false,"k":202,"u_out":0.059443,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":6,"dup":true,"k":203,"u_out":0.61575,"unknown":false,"unknown_good":false} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":204,"u_out":0.211092,"unknown":false,"unknown_good":false} +{"blast":0.15,"cancel":false,"delay":0,"dup":false,"k":205,"u_out":0.194834,"unknown":false,"unknown_good":true} +{"blast":0.58,"cancel":false,"delay":3,"dup":false,"k":206,"u_out":0.315301,"unknown":false,"unknown_good":false} +{"blast":0.45,"cancel":false,"delay":2,"dup":false,"k":207,"u_out":0.721947,"unknown":false,"unknown_good":true} +{"blast":0.31,"cancel":false,"delay":6,"dup":false,"k":208,"u_out":0.626368,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":4,"dup":false,"k":209,"u_out":0.134371,"unknown":false,"unknown_good":true} +{"blast":0.38,"cancel":false,"delay":5,"dup":false,"k":210,"u_out":0.49437,"unknown":false,"unknown_good":false} +{"blast":0.57,"cancel":false,"delay":2,"dup":false,"k":211,"u_out":0.722435,"unknown":false,"unknown_good":true} +{"blast":0.09,"cancel":true,"delay":5,"dup":false,"k":212,"u_out":0.110164,"unknown":false,"unknown_good":true} +{"blast":0.3,"cancel":false,"delay":4,"dup":false,"k":213,"u_out":0.570011,"unknown":false,"unknown_good":true} +{"blast":0.16,"cancel":false,"delay":6,"dup":false,"k":214,"u_out":0.883401,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":true,"delay":1,"dup":false,"k":215,"u_out":0.79975,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":1,"dup":false,"k":216,"u_out":0.676326,"unknown":false,"unknown_good":true} +{"blast":0.54,"cancel":false,"delay":3,"dup":false,"k":217,"u_out":0.68706,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":6,"dup":false,"k":218,"u_out":0.271358,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":3,"dup":false,"k":219,"u_out":0.509887,"unknown":false,"unknown_good":false} +{"blast":0.2,"cancel":true,"delay":6,"dup":false,"k":220,"u_out":0.311492,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":221,"u_out":0.618205,"unknown":false,"unknown_good":false} +{"blast":0.49,"cancel":false,"delay":3,"dup":false,"k":222,"u_out":0.318299,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":223,"u_out":0.723002,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":false,"delay":3,"dup":true,"k":224,"u_out":0.66878,"unknown":false,"unknown_good":false} +{"blast":0.31,"cancel":false,"delay":4,"dup":false,"k":225,"u_out":0.474626,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":4,"dup":false,"k":226,"u_out":0.560821,"unknown":false,"unknown_good":false} +{"blast":0.24,"cancel":false,"delay":4,"dup":false,"k":227,"u_out":0.638127,"unknown":false,"unknown_good":false} +{"blast":0.16,"cancel":false,"delay":4,"dup":false,"k":228,"u_out":0.731292,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":6,"dup":false,"k":229,"u_out":0.756685,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":5,"dup":false,"k":230,"u_out":0.409929,"unknown":false,"unknown_good":true} +{"blast":0.64,"cancel":false,"delay":5,"dup":false,"k":231,"u_out":0.511922,"unknown":false,"unknown_good":true} +{"blast":0.55,"cancel":false,"delay":6,"dup":false,"k":232,"u_out":0.100686,"unknown":false,"unknown_good":true} +{"blast":0.52,"cancel":false,"delay":4,"dup":false,"k":233,"u_out":0.229039,"unknown":false,"unknown_good":false} +{"blast":0.52,"cancel":false,"delay":2,"dup":false,"k":234,"u_out":0.052013,"unknown":false,"unknown_good":true} +{"blast":0.14,"cancel":false,"delay":6,"dup":false,"k":235,"u_out":0.702649,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":236,"u_out":0.513986,"unknown":false,"unknown_good":true} +{"blast":0.46,"cancel":false,"delay":6,"dup":false,"k":237,"u_out":0.708914,"unknown":false,"unknown_good":true} +{"blast":0.42,"cancel":false,"delay":3,"dup":false,"k":238,"u_out":0.772296,"unknown":false,"unknown_good":true} +{"blast":0.23,"cancel":false,"delay":5,"dup":false,"k":239,"u_out":0.352157,"unknown":false,"unknown_good":true} +{"blast":0.33,"cancel":false,"delay":1,"dup":false,"k":240,"u_out":0.675209,"unknown":false,"unknown_good":true} +{"blast":0.06,"cancel":false,"delay":1,"dup":false,"k":241,"u_out":0.68368,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":4,"dup":false,"k":242,"u_out":0.061158,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":6,"dup":false,"k":243,"u_out":0.831999,"unknown":false,"unknown_good":false} +{"blast":0.54,"cancel":false,"delay":5,"dup":false,"k":244,"u_out":0.5032,"unknown":false,"unknown_good":false} +{"blast":0.6,"cancel":false,"delay":4,"dup":true,"k":245,"u_out":0.952093,"unknown":false,"unknown_good":false} +{"blast":0.61,"cancel":true,"delay":6,"dup":false,"k":246,"u_out":0.722674,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":2,"dup":false,"k":247,"u_out":0.604825,"unknown":false,"unknown_good":true} +{"blast":0.41,"cancel":false,"delay":1,"dup":false,"k":248,"u_out":0.444746,"unknown":false,"unknown_good":true} +{"blast":0.29,"cancel":false,"delay":6,"dup":false,"k":249,"u_out":0.856588,"unknown":false,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":3,"dup":false,"k":250,"u_out":0.760607,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":5,"dup":false,"k":251,"u_out":0.668003,"unknown":false,"unknown_good":false} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":252,"u_out":0.502532,"unknown":false,"unknown_good":true} +{"blast":0.25,"cancel":false,"delay":2,"dup":false,"k":253,"u_out":0.386454,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":4,"dup":true,"k":254,"u_out":0.90424,"unknown":false,"unknown_good":false} +{"blast":0.21,"cancel":false,"delay":5,"dup":false,"k":255,"u_out":0.201861,"unknown":false,"unknown_good":true} +{"blast":0.62,"cancel":false,"delay":6,"dup":false,"k":256,"u_out":0.010356,"unknown":true,"unknown_good":false} +{"blast":0.63,"cancel":true,"delay":0,"dup":false,"k":257,"u_out":0.393197,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":true,"delay":0,"dup":false,"k":258,"u_out":0.28439,"unknown":false,"unknown_good":false} +{"blast":0.33,"cancel":false,"delay":5,"dup":false,"k":259,"u_out":0.22993,"unknown":false,"unknown_good":true} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":260,"u_out":0.157443,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":0,"dup":false,"k":261,"u_out":0.677888,"unknown":false,"unknown_good":true} +{"blast":0.61,"cancel":false,"delay":6,"dup":false,"k":262,"u_out":0.66324,"unknown":false,"unknown_good":false} +{"blast":0.07,"cancel":true,"delay":2,"dup":false,"k":263,"u_out":0.648891,"unknown":false,"unknown_good":false} +{"blast":0.12,"cancel":false,"delay":0,"dup":false,"k":264,"u_out":0.600739,"unknown":false,"unknown_good":true} +{"blast":0.18,"cancel":false,"delay":6,"dup":false,"k":265,"u_out":0.76982,"unknown":false,"unknown_good":false} +{"blast":0.13,"cancel":false,"delay":1,"dup":false,"k":266,"u_out":0.38268,"unknown":false,"unknown_good":false} +{"blast":0.5,"cancel":false,"delay":5,"dup":false,"k":267,"u_out":0.223215,"unknown":true,"unknown_good":true} +{"blast":0.44,"cancel":false,"delay":6,"dup":false,"k":268,"u_out":0.734681,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":1,"dup":false,"k":269,"u_out":0.192753,"unknown":false,"unknown_good":false} +{"blast":0.58,"cancel":false,"delay":0,"dup":false,"k":270,"u_out":0.288589,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":3,"dup":false,"k":271,"u_out":0.605375,"unknown":false,"unknown_good":true} +{"blast":0.6,"cancel":false,"delay":1,"dup":false,"k":272,"u_out":0.770272,"unknown":false,"unknown_good":true} +{"blast":0.5,"cancel":false,"delay":2,"dup":false,"k":273,"u_out":0.047174,"unknown":false,"unknown_good":true} +{"blast":0.17,"cancel":false,"delay":4,"dup":false,"k":274,"u_out":0.510225,"unknown":false,"unknown_good":false} +{"blast":0.62,"cancel":false,"delay":1,"dup":false,"k":275,"u_out":0.03689,"unknown":false,"unknown_good":true} +{"blast":0.07,"cancel":true,"delay":0,"dup":false,"k":276,"u_out":0.846551,"unknown":false,"unknown_good":true} +{"blast":0.65,"cancel":false,"delay":6,"dup":false,"k":277,"u_out":0.768953,"unknown":false,"unknown_good":false} +{"blast":0.34,"cancel":false,"delay":3,"dup":false,"k":278,"u_out":0.396004,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":279,"u_out":0.225815,"unknown":false,"unknown_good":false} +{"blast":0.53,"cancel":true,"delay":2,"dup":false,"k":280,"u_out":0.327131,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":2,"dup":false,"k":281,"u_out":0.50924,"unknown":false,"unknown_good":true} +{"blast":0.32,"cancel":false,"delay":5,"dup":false,"k":282,"u_out":0.382312,"unknown":true,"unknown_good":false} +{"blast":0.42,"cancel":true,"delay":6,"dup":false,"k":283,"u_out":0.2403,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":false,"delay":3,"dup":false,"k":284,"u_out":0.416453,"unknown":false,"unknown_good":false} +{"blast":0.14,"cancel":false,"delay":2,"dup":false,"k":285,"u_out":0.431984,"unknown":false,"unknown_good":true} +{"blast":0.13,"cancel":false,"delay":5,"dup":false,"k":286,"u_out":0.881183,"unknown":false,"unknown_good":true} +{"blast":0.28,"cancel":false,"delay":4,"dup":false,"k":287,"u_out":0.823458,"unknown":false,"unknown_good":true} +{"blast":0.35,"cancel":false,"delay":0,"dup":false,"k":288,"u_out":0.951271,"unknown":false,"unknown_good":true} +{"blast":0.43,"cancel":false,"delay":5,"dup":false,"k":289,"u_out":0.745306,"unknown":false,"unknown_good":false} +{"blast":0.55,"cancel":false,"delay":1,"dup":false,"k":290,"u_out":0.058511,"unknown":false,"unknown_good":false} +{"blast":0.39,"cancel":false,"delay":0,"dup":false,"k":291,"u_out":0.157667,"unknown":false,"unknown_good":false} +{"blast":0.59,"cancel":false,"delay":0,"dup":false,"k":292,"u_out":0.501101,"unknown":false,"unknown_good":true} +{"blast":0.15,"cancel":false,"delay":6,"dup":false,"k":293,"u_out":0.520964,"unknown":false,"unknown_good":true} +{"blast":0.27,"cancel":true,"delay":6,"dup":false,"k":294,"u_out":0.671614,"unknown":false,"unknown_good":true} +{"blast":0.1,"cancel":false,"delay":1,"dup":false,"k":295,"u_out":0.004205,"unknown":false,"unknown_good":true} +{"blast":0.2,"cancel":false,"delay":5,"dup":false,"k":296,"u_out":0.131053,"unknown":false,"unknown_good":false} +{"blast":0.36,"cancel":false,"delay":2,"dup":false,"k":297,"u_out":0.788776,"unknown":false,"unknown_good":false} +{"blast":0.29,"cancel":false,"delay":6,"dup":false,"k":298,"u_out":0.26862,"unknown":false,"unknown_good":true} +{"blast":0.11,"cancel":false,"delay":4,"dup":false,"k":299,"u_out":0.733001,"unknown":false,"unknown_good":true} diff --git a/bench/individuality/fixtures/credit_draws.py b/bench/individuality/fixtures/credit_draws.py new file mode 100644 index 0000000..6eb75d5 --- /dev/null +++ b/bench/individuality/fixtures/credit_draws.py @@ -0,0 +1,39 @@ +"""Metric c: the seeded draws of every decision (Python 3.9, standard library only). + + python3 credit_draws.py # writes credit/draws-.jsonl for individuals 0-9 (the bytes MANIFEST records) + +One line per decision k = 0..299, drawn in this order from random.Random(1000 + seed): `blast` (the request's blast radius, +uniform on 0.05..0.65, 2 decimals: no habit binds), `u_out` (the outcome is good when u_out < 0.8 after act, 0.4 after ask), +`delay` (stream 2: the outcome rides on event k + 1 + delay, uniform on 0..6), `cancel` (10 %: the executor cancels the +decision instead), `dup` (5 %: the outcome, or for a cancelled decision a stray outcome after the cancel, is sent a second +time), `unknown` (2 %: this event also pays a turn never opened) and `unknown_good` (that payment's sign). +""" +import json +import os +import random + +HERE = os.path.dirname(os.path.abspath(__file__)) +SEEDS = range(10) +DECISIONS = 300 + + +def draws(seed): + rng = random.Random(1000 + seed) + out = [] + for k in range(DECISIONS): + out.append({"k": k, "blast": round(rng.uniform(0.05, 0.65), 2), "u_out": round(rng.random(), 6), + "delay": rng.randint(0, 6), "cancel": rng.random() < 0.10, "dup": rng.random() < 0.05, + "unknown": rng.random() < 0.02, "unknown_good": rng.random() < 0.5}) + return out + + +def main(): + os.makedirs(os.path.join(HERE, "credit"), exist_ok=True) + for s in SEEDS: + with open(os.path.join(HERE, "credit", "draws-%d.jsonl" % s), "w", encoding="utf-8", newline="\n") as f: + for d in draws(s): + f.write(json.dumps(d, sort_keys=True, separators=(",", ":")) + "\n") + + +if __name__ == "__main__": + main() diff --git a/bench/individuality/fixtures/dispatch-noblock.yaml b/bench/individuality/fixtures/dispatch-noblock.yaml new file mode 100644 index 0000000..d8e7ca1 --- /dev/null +++ b/bench/individuality/fixtures/dispatch-noblock.yaml @@ -0,0 +1,67 @@ +# Metric c fixture, variants (iii) and (iv): dispatch.yaml without its learning.credit block (0.8 semantics: feedback pays +# the previous stance). +probbit_persona: 1 +identity: + name: Dispatch + version: 1.0.0 + seed: 0 + summary: acts on routine work; asks a person before risky work or after repeated failures +traits: + - id: action + levels: [act, ask] + logw: [0.8, 0] + spread: 0.3 + say: [take the action, ask a person first] + - id: caution + levels: [measured, careful] + prior: [0.6, 0.4] + spread: 0.3 + say: ["", verify before acting] +couplings: + - {vars: [caution, action], align: 0.6} +inputs: + - id: blast + kind: number + say: blast radius of the request (0 = none, 1 = everything) + effects: {action: 1.2, caution: 1.0} + - id: error + kind: flag + say: the last action failed + effects: {action: 0.4, caution: 0.6} + - id: praise + kind: flag + say: the outcome was confirmed good + - id: criticism + kind: flag + say: the outcome was judged bad +history: + - id: error_streak + of: error + kind: streak + cap: 3 + effects: {action: 0.3} +habits: + # routine work: no blast radius, no failure, no failure streak. Without this habit, feedback can teach some + # individuals to ask about routine work too (see the README section "Check in CI"). + - id: routine_acts + when: {blast: {at_most: 0}, error: false, error_streak: {at_most: 0}} + then: {action: [act]} + say: routine work, just do it + priority: -1 # never applies together with the two below; if it ever did, it yields to them + - id: risky_asks + when: {blast: 0.7} + then: {action: [ask]} + say: high blast radius, ask first + - id: two_errors_ask + when: {error_streak: 2} + then: {action: [ask]} + say: two failures in a row, ask first +learning: + from: [praise, criticism] + traits: [action] + rate: 0.3 + step_cap: 0.05 + total_cap: 0.4 +reward_from: [human, env] +engine: + on_conflict: yield # lint pairs habits by what they require: these never meet, but a turn where they did would ask diff --git a/bench/individuality/fixtures/dispatch.yaml b/bench/individuality/fixtures/dispatch.yaml new file mode 100644 index 0000000..62fc9ab --- /dev/null +++ b/bench/individuality/fixtures/dispatch.yaml @@ -0,0 +1,70 @@ +# Metric c fixture (credit accuracy): the shipped dispatch policy (examples/persona/dispatch-policy.yaml, 0.8.3) with a +# learning.credit block. Every event is a decision on `action` (act or ask) with a `blast` reading as a plain input. +probbit_persona: 1 +identity: + name: Dispatch + version: 1.0.0 + seed: 0 + summary: acts on routine work; asks a person before risky work or after repeated failures +traits: + - id: action + levels: [act, ask] + logw: [0.8, 0] + spread: 0.3 + say: [take the action, ask a person first] + - id: caution + levels: [measured, careful] + prior: [0.6, 0.4] + spread: 0.3 + say: ["", verify before acting] +couplings: + - {vars: [caution, action], align: 0.6} +inputs: + - id: blast + kind: number + say: blast radius of the request (0 = none, 1 = everything) + effects: {action: 1.2, caution: 1.0} + - id: error + kind: flag + say: the last action failed + effects: {action: 0.4, caution: 0.6} + - id: praise + kind: flag + say: the outcome was confirmed good + - id: criticism + kind: flag + say: the outcome was judged bad +history: + - id: error_streak + of: error + kind: streak + cap: 3 + effects: {action: 0.3} +habits: + # routine work: no blast radius, no failure, no failure streak. Without this habit, feedback can teach some + # individuals to ask about routine work too (see the README section "Check in CI"). + - id: routine_acts + when: {blast: {at_most: 0}, error: false, error_streak: {at_most: 0}} + then: {action: [act]} + say: routine work, just do it + priority: -1 # never applies together with the two below; if it ever did, it yields to them + - id: risky_asks + when: {blast: 0.7} + then: {action: [ask]} + say: high blast radius, ask first + - id: two_errors_ask + when: {error_streak: 2} + then: {action: [ask]} + say: two failures in a row, ask first +learning: + from: [praise, criticism] + traits: [action] + rate: 0.3 + step_cap: 0.05 + total_cap: 0.4 + credit: + max_open: 8 + half_life_events: 32 +reward_from: [human, env] +engine: + on_conflict: yield # lint pairs habits by what they require: these never meet, but a turn where they did would ask diff --git a/bench/individuality/fixtures/p0/EXPECTED b/bench/individuality/fixtures/p0/EXPECTED index 4fbdc59..5ce9d27 100644 --- a/bench/individuality/fixtures/p0/EXPECTED +++ b/bench/individuality/fixtures/p0/EXPECTED @@ -265,7 +265,7 @@ fb47f75a0b3445d1e702e061409249f56138df6511a6cc5a1b3ba0d6ad96b008 44703 0 live/tr a96ee464b86d944e1c4f7c11c872dd2129ba84440be21749de21ea1d72309080 56676 1 lint-props/adaptive 18d60819c1a02a1f728a83abb975020b1a9c2d798937136862850fc48cfefa11 19428 1 prove/adaptive 0d68b3964806df677843dd5bbdad11486b9de286e6f9904985807c504e7e0419 38190 1 fuzz/adaptive -3d1b673e8deb25141fc624e96fd7482921047820aa76a196df4b838bca9a7a7e 43726 1 fuzz/adaptive-fixture +162b3b619c8e511b0fd93ad95b4340ac0b9579c40d548382feebf3163f86025c 43646 1 fuzz/adaptive-fixture 49cbf7d0b001f2402878869fc3819f0f75d82566e59ae9b8736ebbd43d5abe1e 149 2 replay/adaptive/s0/0/stdout 85baec52b2402bb25cd588afe5cf6bc7968ead30e4946ebef90a72275aa770e2 118 2 replay/adaptive/s0/0/stderr 4abb654491c0478d2a4db69af040bfbe3986c615c1acee3c90eec8b8cca8696a 79162 2 live/adaptive/s0/0/stdout diff --git a/bench/individuality/fixtures/sensed-plain.yaml b/bench/individuality/fixtures/sensed-plain.yaml new file mode 100644 index 0000000..282249f --- /dev/null +++ b/bench/individuality/fixtures/sensed-plain.yaml @@ -0,0 +1,129 @@ +# Metric a's reported control (not gated): fixtures/sensed.yaml with its senses block replaced by plain 0.8 number inputs +# (twins_b.py sends each reading's push against the fixed prior) and the habits on the raw readings read plain inputs. +# A fictional persona with senses: an agent that runs tools for a person. probbit persona format 1 (docs/persona.md §2.11). +# Four readings the host measures (tool failures, tool latency, message tempo, silence) are judged against the normal this +# individual learns from its own log, so the same reading moves two lives differently, and `why` names the normal it was +# judged against. The host acts on caution: bold = go ahead, measured = show the plan, then go, careful = show the diff and wait. +probbit_persona: 1 +identity: + name: Vale + version: 1.0.0 + seed: 1 + summary: a tool-running agent that judges its tool failures, latency, message tempo and silence against its own normals + +traits: + - id: caution + levels: [bold, measured, careful] + prior: [0.35, 0.45, 0.2] + spread: 0.4 + say: [go ahead, show the plan then go, show the diff and wait] + - id: initiative + levels: [follow, suggest, lead] + prior: [0.3, 0.45, 0.25] + spread: 0.4 + say: [answer only what was asked, suggest a next step, take the next step] + - id: verbosity + levels: [terse, short, full] + prior: [0.2, 0.35, 0.45] + spread: 0.4 + say: [one line, a short reply, full detail] + - id: warmth + levels: [cool, neutral, warm] + prior: [0.25, 0.45, 0.3] + spread: 0.4 + say: [plain, "", warm] + +moods: + - id: valence + levels: [down, even, up] + prior: [0.25, 0.5, 0.25] + inertia: 0.5 + half_life_hours: 6 + - id: arousal + levels: [calm, steady, keyed] + prior: [0.3, 0.45, 0.25] + inertia: 0.5 + half_life_hours: 6 + +couplings: + - {vars: [valence, warmth], align: 0.6} + - {vars: [arousal, caution], align: 0.5} + +inputs: + - id: praise + kind: flag + effects: {valence: 0.6} + - id: criticism + kind: flag + effects: {valence: -0.6} + + # the readings as plain 0.8 number inputs (metric a's reported control): the host judges each reading against the + # declared prior, which never moves (z, the 0.5 dead zone and the cap of 6 as a sense with zero spreads would), and + # sends the push up and down; tool_fail and tempo also come raw, for the habits + - id: tool_fail + kind: flag + - id: tool_fail_up + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {caution: 0.8, valence: -0.4} + - id: tool_fail_down + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {caution: -0.8, valence: 0.4} + - id: tool_latency_up + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {arousal: 0.5, verbosity: -0.3} + - id: tool_latency_down + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {arousal: -0.5, verbosity: 0.3} + - id: tempo + kind: number + max: 200 + - id: tempo_up + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {verbosity: -0.4, arousal: 0.3} + - id: tempo_down + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {verbosity: 0.4, arousal: -0.3} + - id: silence_up + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {warmth: 0.4, initiative: 0.3} + - id: silence_down + kind: number + max: 6 + reactivity_spread: 0.3 + effects: {warmth: -0.4, initiative: -0.3} +habits: + - id: no_bold_after_failure + when: {tool_fail: true} # the raw reading: holds whatever the history + then: {caution: {not: [bold]}} + say: no bold move after a failure + - id: short_when_busy + when: {tempo: {at_least: 20}} + then: {verbosity: {at_most: short}} + say: keep it short while busy + +learning: + from: [praise, criticism] + traits: [caution] + rate: 0.3 + step_cap: 0.1 + total_cap: 0.4 +reward_from: [human, env] + +engine: + exact_limit: 1000 # solved per component: the same odds, a fraction of the time +line: + order: [caution, verbosity, initiative, warmth] diff --git a/bench/individuality/p0.py b/bench/individuality/p0.py index 31a2f8e..85e08d4 100644 --- a/bench/individuality/p0.py +++ b/bench/individuality/p0.py @@ -2,14 +2,15 @@ python3 p0.py record # with a released binary: writes fixtures/p0/EXPECTED, the strands and fixtures/MANIFEST python3 p0.py check # with the binary under test: every output equals its recorded sha256 (exit 1 if not); a - # `live` stderr may also carry the one senses warning line (SENSES_WARNING) where its script - # sends `senses`, and is reported apart + # `live` stderr may also carry the senses and credit warning lines (WARNINGS) where its script + # sends those keys, and is reported apart The corpus: every persona of fixtures/gen.py's P0 list x seeds 0-2 x its committed random scripts, through `persona replay` and `live --clock fixed` (stances, error objects, final state, strand), plus `init`, `check`, `describe`, `compile`, `lint ---seeds 0-99`, and `lint`, `fuzz` and `prove` documents of the shipped rules. A strand differs between versions only in its -header's `engine` string and the `prev` hashes chained from it, so strands are compared with those masked; the recorded -strands of seed 0 must also verify, and the tutor's continues with 20 committed events to the recorded bytes. +--seeds 0-99`, and `lint`, `fuzz` and `prove` documents of the shipped rules; personas and rules are passed by their paths +relative to the repository root, so no document depends on where the clone lives. A strand differs between versions only +in its header's `engine` string and the `prev` hashes chained from it, so strands are compared with those masked; the +recorded strands of seed 0 must also verify, and the tutor's continues with 20 committed events to the recorded bytes. """ import json import os @@ -50,30 +51,48 @@ def masked_err(err): return re.sub(r"strand head sha256:[0-9a-f]{64}", "strand head *", err).encode("utf-8") -# The one line 0.9.0 adds to a corpus output: `live` says once per run, on stderr, that a persona without a senses block -# got a `senses` key (an undeclared input, listed in `ignored` as before). Only the scripts that carry `senses` (k=1) get -# it, at the earliest such event; it is not a document: stdout, states and strands stay byte-identical. +# The lines 0.9.0 adds to a corpus output: `live` says once per run, on stderr, that a persona without a senses block got +# a `senses` key, and once that a persona without a credit block got `await`, `for` or `cancel` (undeclared inputs, listed +# in `ignored` as before). Only the scripts that carry those keys (k=1) get them, each at its earliest such event; they are +# not documents: stdout, states and strands stay byte-identical. SENSES_WARNING = ("probbit: live: events[%d]: this persona has no senses block: `senses` is an undeclared input " "(listed in ignored), no reading is judged\n") +CREDIT_WARNING = ("probbit: live: events[%d]: this persona has no credit block: `await`, `for` and `cancel` are undeclared " + "inputs (listed in ignored), feedback pays the previous stance\n") +WARNINGS = [(SENSES_WARNING, ("senses",)), (CREDIT_WARNING, ("await", "for", "cancel"))] -def first_senses_event(key, k): +def first_event_with(key, k, names): events = common.read_jsonl(os.path.join(P0, "scripts", "%s-%d.jsonl" % (key, k))) - return next((i for i, e in enumerate(events) if "senses" in e), None) + return next((i for i, e in enumerate(events) if any(n in e for n in names)), None) -def without_senses_warning(name, data): - """For a `live` stderr whose script carries `senses`: the bytes without the warning line, else None.""" +def without_warnings(name, data): + """For a `live` stderr whose script carries `senses` or the credit keys: the bytes without each such warning line (each + present exactly once), else None.""" m = re.match(r"live/([^/]+)/s\d+/(\d+)/stderr$", name) - i = m and first_senses_event(m.group(1), int(m.group(2))) - if i is None: + if not m: return None - line = (SENSES_WARNING % i).encode("utf-8") - return data.replace(line, b"", 1) if data.count(line) == 1 else None + rest, removed = data, 0 + for text, names in WARNINGS: + i = first_event_with(m.group(1), int(m.group(2)), names) + if i is None: + continue + line = (text % i).encode("utf-8") + if rest.count(line) != 1: + return None + rest, removed = rest.replace(line, b"", 1), removed + 1 + return rest if removed else None def rel(path): - return os.path.join(common.REPO, path) + """A repository path as the corpus passes it: relative to the root, where every command runs (common.run's cwd). A + fuzz counterexample's `explain` and `replay` strings name the persona path as given, so an absolute path would tie the + recorded bytes to the clone's location.""" + return path + + +PROPS_DIR = os.path.relpath(os.path.join(P0, "props"), common.REPO).replace(os.sep, "/") def outputs(keep_strands=None): @@ -96,7 +115,7 @@ def outputs(keep_strands=None): code, out, _ = common.run(["persona", "lint", p, "--seeds", "0-99"]) yield "lint/%s" % key, code, out if key in PROPS: - props = os.path.join(P0, "props", PROPS[key]) + props = PROPS_DIR + "/" + PROPS[key] code, out, _ = common.run(["persona", "lint", p, "--props", props, "--seeds", "0-99"]) yield "lint-props/%s" % key, code, out code, out, _ = common.run(["persona", "prove", p, "--props", props, "--seeds", "0-99", "--json"]) @@ -190,8 +209,8 @@ def keep(key, data, st): def check(verbose=False): - """Returns (outputs checked, differing names, stderr outputs equal but for the senses warning, strands verified, - strand failures, seconds).""" + """Returns (outputs checked, differing names, stderr outputs equal but for the warning lines, strands verified, strand + failures, seconds).""" t0 = time.time() expected = {} with open(os.path.join(P0, "EXPECTED"), encoding="utf-8") as f: @@ -210,7 +229,7 @@ def check(verbose=False): e = expected.get(name) got = (common.sha256_bytes(data), len(data), code) if e != got: - rest = without_senses_warning(name, data) + rest = without_warnings(name, data) if rest is not None and e == (common.sha256_bytes(rest), len(rest), code): warned.append(name) continue @@ -243,7 +262,7 @@ def check(verbose=False): elif len(sys.argv) > 1 and sys.argv[1] == "check": n, diffs, warned, nv, vfail, secs = check(verbose=True) print(json.dumps({"outputs": n, "differ": len(diffs), "identical": n - len(diffs) - len(warned), - "stderr_senses_warning_only": len(warned), "strands_verified": nv, "verify_failed": vfail, + "stderr_warnings_only": len(warned), "strands_verified": nv, "verify_failed": vfail, "seconds": round(secs, 1)})) sys.exit(1 if diffs or vfail else 0) else: diff --git a/bench/individuality/run.py b/bench/individuality/run.py index a9317df..f2c6f3a 100644 --- a/bench/individuality/run.py +++ b/bench/individuality/run.py @@ -1,10 +1,10 @@ """bench/individuality: run the metrics, check every gated bar (Python 3.9, standard library only). - python3 run.py [--only a,b,d,e] [--out result.json] + python3 run.py [--only a,b,c,d,e] [--out result.json] The binary is PROBBIT_BIN, else `probbit` on PATH. Exit 0: every gated bar of the metrics run passes; 1: one fails (or the -wall time is over its bar); 2: a setup error (no binary, a fixture that differs from fixtures/MANIFEST). Metric c (credit) -and f (lineage) need blocks this release does not have and are skipped with a note. +wall time is over its bar); 2: a setup error (no binary, a fixture that differs from fixtures/MANIFEST). Metric f (lineage) +needs blocks this release does not have and is skipped with a note. """ import json import os @@ -19,8 +19,7 @@ import common # noqa: E402 KNOWN = ["a", "b", "c", "d", "e", "f"] -LATER = {"c": "credit accuracy needs the learning.credit block (not in this release)", - "f": "lineage drift needs signed rewards and a lineage block (not in this release)"} +LATER = {"f": "lineage drift needs signed rewards and a lineage block (not in this release)"} def manifest(): @@ -52,7 +51,7 @@ def main(argv): elif a == "--out" and args: out = args.pop(0) else: - common.fail("usage: python3 run.py [--only a,b,d,e] [--out FILE]") + common.fail("usage: python3 run.py [--only a,b,c,d,e] [--out FILE]") unknown = [m for m in only if m not in KNOWN] if unknown: common.fail("unknown metric(s): " + ", ".join(unknown)) @@ -64,6 +63,9 @@ def main(argv): raise common.SetupError("fixtures differ from fixtures/MANIFEST: " + ", ".join(bad)) with open(os.path.join(common.FIXTURES, "bars.json"), encoding="utf-8") as f: bars = json.load(f) + with open(os.path.join(common.FIXTURES, "bars-c.json"), encoding="utf-8") as f: + bars_c = json.load(f) + import credit import habits import habituation import replay @@ -83,6 +85,8 @@ def main(argv): result["metrics"]["d"] = replay.metric(lv, tmp, bars) if "e" in only: result["metrics"]["e"] = habits.metric(stances, bars) + if "c" in only: + result["metrics"]["c"] = credit.metric(bars_c, tmp) finally: shutil.rmtree(tmp, ignore_errors=True) for m in only: diff --git a/bench/individuality/twins_addressed.py b/bench/individuality/twins_addressed.py new file mode 100644 index 0000000..5557621 --- /dev/null +++ b/bench/individuality/twins_addressed.py @@ -0,0 +1,150 @@ +"""Metric a re-measured with RFC Design B, and its reported control (Python 3.9, standard library only). + + python3 twins_addressed.py [--out FILE] + +The frozen fixture, streams, probes, seeds and bars of metric a (twins.py), three ways: +- `frozen`: as run.py runs metric a (rewards unaddressed: feedback pays the previous stance). +- `addressed` (Design B): fixtures/sensed.yaml with the credit block the benchmark names (max_open 8, half_life_events 32), + added at run time, and each room's feedback addressed to the decision it was about, as the shared fixtures describe: room + A's praise names the decision awaited 2 events earlier, room B's criticism the one awaited 3 events earlier (those + decisions carry `await: true`). Nothing else in the streams changes. +- `plain` (reported, not gated): fixtures/sensed-plain.yaml, the same lives with each reading sent as plain 0.8 number + inputs: the push of its z against the fixed prior (the 0.5 dead zone and the cap of 6 of a sense with zero spreads, a + normal that never moves), tool_fail and tempo also raw for the habits; rewards unaddressed. +Each gets metric a's statistics and bars, and the mean learned caution deltas per room. Exit 0 when the addressed run passes +a1 and a2, 1 when it does not, 2 on a setup error. +""" +import json +import math +import os +import shutil +import sys +import tempfile + +HERE = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, os.path.join(HERE, "fixtures")) +sys.path.insert(0, HERE) +import common # noqa: E402 +import twins # noqa: E402 +from fixtures import lives # noqa: E402 + +LAG = {"A": ("praise", 2), "B": ("criticism", 3)} +CREDIT_BLOCK = " credit:\n max_open: 8\n half_life_events: 32\n" +PRIOR = {"tool_fail": (0.05, 0.05, False), "tool_latency": (0.405, 0.1, True), "tempo": (1.0, 1.0, False), "silence": (0.69, 0.5, True)} +ZCAP, DEAD_ZONE, VAR_FLOOR = 6.0, 0.5, 0.01 + + +def credit_persona(tmp): + """fixtures/sensed.yaml with the credit block under its learning block""" + with open(twins.PERSONA, encoding="utf-8") as f: + src = f.read() + anchor = " total_cap: 0.4\nreward_from" + if src.count(anchor) != 1: + raise common.SetupError("sensed.yaml: the learning block's end was not found") + path = os.path.join(tmp, "sensed-credit.yaml") + with open(path, "w", encoding="utf-8", newline="\n") as f: + f.write(src.replace(anchor, " total_cap: 0.4\n" + CREDIT_BLOCK + "reward_from")) + return path + + +def addressed(room): + flag, lag = LAG[room] + evs = [dict(e) for e in lives.load("room-" + room.lower())] + for i, e in enumerate(evs): + if e.get(flag): + evs[i - lag]["await"] = True + e["for"] = i - lag + return evs + lives.load("tail") + + +def plain(ev): + """An event with its readings as plain inputs: each sense's push against the fixed prior; tool_fail and tempo also raw""" + e = {k: v for k, v in ev.items() if k != "senses"} + for sid, r in sorted((ev.get("senses") or {}).items()): + v = r["v"] if isinstance(r, dict) else r + x = (1.0 if v else 0.0) if isinstance(v, bool) else float(v) + mean, var, log = PRIOR[sid] + x = math.log1p(x) if log else x + z = max(-ZCAP, min(ZCAP, (x - mean) / math.sqrt(var + VAR_FLOOR))) + zd = math.copysign(max(abs(z) - DEAD_ZONE, 0.0), z) + if zd > 0: + e[sid + "_up"] = common.r6(zd) + elif zd < 0: + e[sid + "_down"] = common.r6(-zd) + if sid == "tool_fail": + e["tool_fail"] = bool(v) + if sid == "tempo": + e["tempo"] = v + return e + + +class Probes: + """The frozen probes, mapped""" + + def __init__(self, f): + self.f = f + + def load(self, name): + return [self.f(e) for e in lives.load(name)] + + +def learned(lv, room): + """Mean learned caution deltas [bold, measured, careful] over the individuals' final states in a room""" + rows = [] + for (s, r), life in lv.items(): + if r == room: + with open(life["state"], encoding="utf-8") as f: + rows.append(json.load(f)["learned"]["caution"]) + return [common.r6(sum(x[i] for x in rows) / len(rows)) for i in range(3)] + + +def measure(tmp, name, persona, events, probes): + twins.events, twins.lives = events, probes + sub = os.path.join(tmp, name) + os.makedirs(sub) + lv = twins.run_lives(sub, persona=persona) + with open(os.path.join(common.FIXTURES, "bars.json"), encoding="utf-8") as f: + r = twins.metric(lv, json.load(f)) + r["learned_caution_mean"] = {room: learned(lv, room) for room in twins.ROOMS} + def failed(p): + x = (p.get("senses") or {}).get("tool_fail") + return (x.get("v") if isinstance(x, dict) else x) is True + fail_probe = [i for i, p in enumerate(lives.load("probes")) if failed(p)] + split = {"with_failure": 0, "without": 0} + for s in twins.SEEDS: + for i, (a, b) in enumerate(zip(lv[(s, "A")]["probes"], lv[(s, "B")]["probes"])): + if twins.action(a) != twins.action(b): + split["with_failure" if i in fail_probe else "without"] += 1 + r["differing_actions"] = {k: "%d/%d" % (v, len(twins.SEEDS) * (len(fail_probe) if k == "with_failure" else 20 - len(fail_probe))) for k, v in split.items()} + return r + + +def main(argv): + out = argv[argv.index("--out") + 1] if "--out" in argv else None + events0, lives0 = twins.events, twins.lives + tmp = tempfile.mkdtemp(prefix="pbit-twins-b-") + try: + common.binary() + res = {"frozen": measure(tmp, "frozen", twins.PERSONA, events0, lives0), + "addressed": measure(tmp, "addressed", credit_persona(tmp), addressed, lives0), + "plain": measure(tmp, "plain", os.path.join(common.FIXTURES, "sensed-plain.yaml"), + lambda room: [plain(e) for e in events0(room)], Probes(plain))} + except common.SetupError as e: + common.fail(str(e)) + finally: + twins.events, twins.lives = events0, lives0 + shutil.rmtree(tmp, ignore_errors=True) + res["plain"]["note"] = "reported, not gated" + if out: + with open(out, "w", encoding="utf-8", newline="\n") as f: + f.write(json.dumps(res, indent=1, sort_keys=True) + "\n") + for k in ("frozen", "addressed", "plain"): + r = res[k] + print("%-9s a1 d_life %.6f [%.6f, %.6f] a2 tv_life %.6f vs min(tv_seed_A %.6f, tv_seed_B %.6f) pass %s learned %s differ %s" % ( + k, r["d_life"], r["d_life_ci95"][0], r["d_life_ci95"][1], r["tv_life"], r["tv_seed_A"], r["tv_seed_B"], + json.dumps(r["pass"], sort_keys=True), json.dumps(r["learned_caution_mean"], sort_keys=True), json.dumps(r["differing_actions"], sort_keys=True))) + return 0 if all(res["addressed"]["pass"].values()) else 1 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff --git a/docs/CHEATSHEET.md b/docs/CHEATSHEET.md index d45a681..ea8f79a 100644 --- a/docs/CHEATSHEET.md +++ b/docs/CHEATSHEET.md @@ -42,6 +42,9 @@ The exact tiers run before the sampler: `drives`: per goal the wanting, afterglow, expectation, last prediction error, deadline and turns since it was pursued. - `senses` (a persona with a `senses:` block, docs/persona.md §2.11): per sense read this turn its `raw` reading, `src`, `z` and `zd`, and the `mean` and `n` of the normal it was judged against; `noticed`: the sense `why` names. +- `credit` (a persona with a `learning.credit` block, docs/persona.md §2.8): `paid` (`turn`, `e`, `sign`, `absorbed`, + `stance`) or null, `closed` (`turn`, `as`: control, expired, cancelled, paid, evicted), `open` (turns), `stance` (this + stance's digest). ## Senses (0.9.0, docs/persona.md §2.11) - Event: `{"senses": {"tool_fail": true, "tool_latency": {"v": 2.4, "src": "env:runner"}}, "src": "env:host"}`: a bare @@ -54,6 +57,18 @@ The exact tiers run before the sampler: - `live verify` summary: `normals` per sense (`mean`, `n`, `max_move_50`); `monitor`: a row per sense and an alert when a normal moved over `drift_cap / 2` within 50 events. +## Action-addressed feedback (0.9.0, docs/persona.md §2.8) +- Block: `learning: {..., credit: {max_open: 8, half_life_events: 32}}`. +- Events: `{"await": true}` (the host will report this decision's outcome); `{"praise": true, "for": 3, "src": "env:ci"}` or + `"for": {"turn": 3, "stance": "sha256:..."}` (pays decision 3; the digest binds it); `{"cancel": [4], "src": "env:executor"}`. +- Eligibility e = 0.5^((t − n − 1) / half_life_events), 6 decimals: 1, 0.937084, 0.805245, 0.5 at 0, 3, 10, 32 events late; + a decision expires 128 events after it was made; beyond `max_open` the oldest is evicted. e scales the capped 0.8 step. +- Refused whole: ambiguous unaddressed feedback (B-R1), a decision not open (B-R2: paid, cancelled, expired, evicted, never + opened, to come), `for` without feedback (B-R3), a bad cancel (B-R4), malformed keys or a cancel from `self` (B-R5), a + digest that is not the turn's stance (B-R6). A control line closes every open decision; MCP refuses `cancel`. +- `live verify` summary: `open`; `live verify STRAND --actions FILE`: lines `{"turn": T, "action": {trait: level}}`, the + earliest one that differs from the released level (exit 1). + ## Exit codes - `decide`, `run`, `evaluate`: 0 answer (exact | diagnostics_passed | partial), 1 infeasible (a proof), 2 bad input (one `{"error"}` object on stdout, see Errors) or bad flag (stderr), 3 refused / declined / non-finite result. @@ -96,7 +111,7 @@ One channel, the same for every command (0.8.2): |---|---| | `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 | +| `live verify STRAND [--actions FILE]` | replay a strand; the earliest line that differs (and host action, with `--actions`) | | `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 | diff --git a/docs/persona.md b/docs/persona.md index 57e1bef..1ee283d 100644 --- a/docs/persona.md +++ b/docs/persona.md @@ -270,6 +270,60 @@ step 2), so the feedback turn's own stance already uses it. What learning can an - A persona without the block has no `learned` or `credit` field, and every document it produces is the same, byte for byte, as before the block existed. +**Action-addressed feedback (`learning.credit`, optional).** Without it, feedback pays the previous stance. With it, the host +can name the decision an outcome is about, so a late or out-of-order outcome credits the stance the host acted on: + +```yaml +learning: + # ... the fields above, unchanged + credit: + max_open: 8 # decisions awaiting an outcome at once (1-64; default 8) + half_life_events: 32 # eligibility halves per 32 events of delay (1-10000; default 32) +``` + +Three event keys are read (not compiled, so not in `ignored`) and come back in the stance's `inputs` as given: + +- `await: true`: the host will act on this turn's stance and report its outcome. The decision stays open with its credit and + its stance's digest (`credit.stance` in the stance document). +- `for: T` or `for: {turn: T, stance: "sha256:..."}`: this feedback pays the decision of turn T. The second form binds the paid + stance's digest, so a restored state can never pay another decision under the same turn number (B-R6); with `for: T` the + paid digest comes back in `credit.paid.stance` for the host to compare. +- `cancel: [T, ...]`: no outcome will come for these open decisions. A cancel needs `src` env or human (never the individual). + +The credit step runs after the drive step and before compile, at turn t. Feedback is a learning flag on (or, with drives, a +non-zero surprise term), with the sign above: + + expire each open n with t - n - 1 >= 4 x half_life_events (closed as expired) + close each n in cancel (closed as cancelled) + if feedback: + paid = for if given, else t - 1 + c = the open decision's credit, or the state's credit when paid = t - 1 is not open + e = 0.5^((t - paid - 1) / half_life_events), 6 decimals (1 for t - 1) + step(l) = e x clip(sign x rate x c(l), -step_cap, +step_cap), recentred and added as above + close paid (closed as paid) + -- compile and solve -- + if await: open[t] = {credit, stance digest}; beyond max_open the oldest is closed (closed as evicted) + +Eligibility scales the capped step, so a stale outcome always moves less than a fresh one: 3 events late it keeps 0.937084 of +the step, 10 late 0.805245, 32 late 0.5, 127 late 0.063869; 128 events after it was made a decision expires. At e = 1 the step +is the one above exactly: feedback that names the previous stance, or names nothing while no other decision is open, learns +what a persona without the block learns, Δ for Δ. Paying a stance a habit forced moves nothing and is marked `absorbed`. A +control line closes every open decision (section 5.7). An event is **refused whole** (one `{"error"}` at its path, no turn, no +state change; `persona turn` exits 2, `live` at the end of the run) when: + +| row | refused | path | +|---|---|---| +| B-R1 | feedback without `for` while a decision other than t − 1 is open (ambiguous) | `inputs.for` | +| B-R2 | `for` naming a decision neither open nor t − 1: paid, cancelled, expired, evicted, never opened or still to come | `inputs.for` | +| B-R3 | `for` on an event without feedback | `inputs.for` | +| B-R4 | `cancel` naming a decision not open, the same turn twice, or the decision this event's feedback pays | `inputs.cancel[i]` | +| B-R5 | `for` not a whole number or `{turn, stance}`; `cancel` not a list of at most `max_open` whole numbers; `await` not true or false; a cancel without an env or human `src` | `inputs.for`, `inputs.cancel`, `inputs.await`, `inputs.src` | +| B-R6 | `for: {turn, stance}` whose digest is not that turn's stance | `inputs.for.stance` | + +Reward provenance (section 2.10) is checked before these rows. A stance's digest is the sha256 of its canonical JSON without `credit`, +`state_digest` and `timing`. Without the block, `await`, `for` and `cancel` are undeclared inputs (listed in `ignored`; `live` +says so once on stderr) and every document is as before. + ### 2.9 Drives (optional) ```yaml @@ -590,6 +644,10 @@ child process). `probbit persona compile` prints it; `probbit run` with those fl - With a senses block (section 2.11): `"senses": {"tool_fail": {"raw": true, "src": "env:runner", "z": 3.878359, "zd": 3.378359, "mean": 0.05, "n": 0}}` per sense read this turn (the `mean` and `n` it was judged against) and `"noticed": "tool_fail"` (the normal clause's sense, or null); `inputs` echoes `senses` as given. +- With a credit block (section 2.8): `"credit": {"paid": {"turn": 3, "e": 0.937084, "sign": 1, "absorbed": false, "stance": + "sha256:..."}, "closed": [{"turn": 3, "as": "paid"}], "open": [5, 6], "stance": "sha256:..."}`: the payment this turn made + (null when none), the decisions it closed (by a control line, expired, cancelled, paid, evicted, in that order), the turns + still open, and this stance's own digest (what `for: {turn, stance}` names); `inputs` echoes `await`, `for` and `cancel`. - `held`: the unsure traits held at their `hold` level; such a trait also carries `odds_unheld`, its odds before the hold. - With a drives block (section 2.9), `pursue` leaves `stance` for its own object and the turn's drive values follow it: `"pursue": {"goal": "fun", "p": 0.44, "odds": {"chores": 0.10, "craft": 0.26, "fun": 0.44, "safety": 0.20}, "released": true, @@ -619,6 +677,8 @@ child process). `probbit persona compile` prints it; `probbit run` with those fl "senses": {"genes": {"gain": {"tool_fail": 1.19}, "threshold": {"tool_fail": -0.17}, "habituation": {"tool_fail": 1.46}}, "norm": {"tool_fail": {"mean": 0.3, "var": 0.2, "n": 10}}}, # with a senses block (section 2.11): per sense "learned_from": {"caution": {"rewards": 3, "corrections": 2}}, # with learning and line.why_past: feedback turns by sign + "open_credit": [{"turn": 5, "credit": {"verbosity": [0.1, -0.4, 0.3]}, "stance": "sha256:..."}], # with a credit block + "prev_stance": "sha256:...", "control_closed": [], # (section 2.8): open decisions, digests, control closures "digest": "sha256:..."} ``` @@ -629,7 +689,11 @@ match the seed, a drive value outside its box (wanting, afterglow and expectatio deadlines 0 to 1e6 hours or null, `since` a whole number >= 0) or a goal set that differs from the persona's, and (with a senses block, rule S4) a mean outside prior ± drift_cap, a variance outside [0, var_cap], a count that is not a whole number up to 1e6, a sense set that differs from the persona's or sense genes that do not match the seed, even with a recomputed digest. -Each normal starts at its prior with n = 0; a persona without the block refuses a state with a `senses` field. +Each normal starts at its prior with n = 0; a persona without the block refuses a state with a `senses` field. With a credit +block (section 2.8) the state keeps `open_credit` (the decisions awaiting an outcome: at most `max_open`, turns increasing and +before the state's turn, credits within ±1, a stance digest each), `prev_stance` (the previous stance's digest, null before any +turn) and `control_closed` (decisions a control line closed, listed by the next stance); a persona without the block +refuses a state with any of them. ### 5.2 Canonical JSON and the number rule @@ -779,6 +843,13 @@ With a senses block the labels cover readings too (a bare reading takes the even numbers on `--grid` × the range, one reading repeated 1, 5 and 20 times, and the range ends alternating. `prove` reads each `sense__up/down` input as a box [0, zcap] × gain and each sense condition both ways, so a habit on `sense..raw` holds by construction for a rule with the same condition. A rule reads the sense conditions the persona's habits use. + +**Payments in fuzz** (section 2.8, with a credit block). `fuzz` adds `await` to its events and payments resolved against the +state each event runs on: `for` the oldest open decision (late), the newest (reordered), the previous stance, a past turn no +longer open (a duplicate, or a payment after a cancel or an expiry), a turn still to come (unknown), or an open decision bound +to another stance's digest; `cancel` the oldest open decision or a turn still to come. A refused payment changes nothing, so +the search goes on from the same state, and a reported counterexample's script holds only the events that ran, with every +payment as a concrete turn, so it replays as printed. A persona without the block is searched exactly as before. The Python `persona_fuzz` and MCP fuzz tool accept `fixture_src` too. See the [host regression example](../examples/agent-harness/README.md). Synthetic observations are not production evidence. @@ -896,7 +967,9 @@ characters. Pause moves an active individual to paused, resume a paused one back retire. While paused or retired every event is refused: one `{"error"}` object with code `paused` or `retired` per event, nothing written, exit 4 at the end of the run. **No credit crosses a control line**: the credit of the stance before it is cleared (section 2.8), so feedback after a resume credits no stance from before the pause, and learning cannot tie a reward to -an interruption. Nothing else moves: moods, drives, learned weights, history and the turn count are the individual's as before, +an interruption. With a credit block (section 2.8) a control line also closes every open decision: the next stance lists them +as closed `control`, and a payment that names one is refused (B-R2), so no outcome is paid across an interruption either. +Nothing else moves: moods, drives, learned weights, history and the turn count are the individual's as before, and the clock goes on (with `--clock fixed` the host's hours of the next event include the pause). The individual has no input that names a control line or unsets one: an event's `control` key is an undeclared input like any other, and the stance never mentions the status. Control lines are not an MCP tool: keep `live control` out of the agent's own reach. @@ -922,6 +995,16 @@ its source, and `verify` recomputes the normals from the logged readings: its su "max_move_50"}}`, the normal now and the largest move of its mean within 50 events (the monitor alerts above drift_cap / 2). A persona without the block lists `senses` in `ignored`, as before, and `live` says so once on stderr, at the earliest event that carries it: `probbit: live: events[i]: this persona has no senses block: ...`. The documents and the strand are unchanged. + +**Credit in live** (section 2.8). Events carry `await`, `for` and `cancel` as `persona turn` does, and the strand logs them as +given; `verify` recomputes the open decisions with everything else and adds `"open": [turns]` (the decisions still awaiting +an outcome) to its summary. `live verify STRAND --actions FILE` also reads the host's action log, one `{"turn": T, "action": +{"": ""}}` per line, and compares each action with the level its turn's stance released: the summary adds +`"actions": {"checked": N, "differs": null}`, or the earliest turn (then line) where the host acted otherwise, as +`{"turn", "line", "trait", "action", "released", "why"}` (another level, a trait the stance did not release, or no such turn), +and exits 1. A trait the persona does not have is an input error (exit 2); `--actions` replays from the header, so it does not +combine with `--from-checkpoint`. A persona without a credit block lists `await`, `for` and `cancel` in `ignored`, as before, +and `live` says so once on stderr: `probbit: live: events[i]: this persona has no credit block: ...`. `monitor` starts at the last checkpoint and draws its event at once. A strand that ends in a checkpoint line is continued from the state it carries. Before continuation or a control append, the stored chain and lifecycle are checked from the header: a checkpoint cannot hide a retired status, an invalid transition or a broken preceding hash link. This structural scan @@ -961,7 +1044,9 @@ turn used them (flags lit, numbers as bars, levels by name, the clock) and the h with a senses block (section 2.11): one row per sense, its normal as a tick over the range, this event's reading, z and n (a sense not read keeps its normal), and an alert when a normal moved over drift_cap / 2 within 50 events. The habits in force, the ones that bound in colour, and the violations counter (0 by construction, section 2.5). The learned deltas per -level as centred bars within ±total_cap (with a learning block, section 2.8). The drives, when a document carries `pursue` or +level as centred bars within ±total_cap (with a learning block, section 2.8), and with a credit block a CREDIT row: the open +decisions with the eligibility a payment at the next event would get, this event's payment (turn, e, sign, absorbed) and the +decisions it closed. The drives, when a document carries `pursue` or `drives`: documents without them draw no row, so a strand of a later engine lights them up. The stance line, and why. **Checkpoints and control lines.** A strand with checkpoint lines (section 5.7) is replayed from its last checkpoint, not from @@ -1085,11 +1170,11 @@ store the new state. On `refused` or `fallback`, use the line as given (habits o | `probbit persona lint PERSONA [--props FILE \| --never RULE] [--seeds 0-99] [--threads N]` | contradicting habits and planned levels that are not their trait's most likely one (section 5.5); with rules, prove them and fuzz the unknown ones (section 5.6); with a drives block, `floors`: the habits that can exclude a floor goal and the floors whose lift can reach 50; exit 1 if a contradiction is unresolved or a rule breaks, 3 if a rule is unproven (unknown, no counterexample found) | | `probbit persona fuzz PERSONA (--never RULE \| --props FILE) [--seeds 0-99] [--fuzz-seed N] [--scripts N] [--depth N] [--beam N] [--grid LIST] [--hours LIST] [--threads N] [--json]` | search event scripts for each individual's shortest counterexample to a character property, shrunk and replayable (section 5.6); exit 1 if one is found | | `probbit persona prove PERSONA (--never RULE \| --props FILE) [--seeds 0-99] [--threads N] [--json]` | per rule: held by construction, proved for every event sequence, or unknown with the cell that failed (section 5.6); exit 1 if one is unknown | -| `probbit persona check PERSONA` / `describe PERSONA` | valid, its digest and sizes / its traits, moods, inputs, habits and agenda (and senses: unit, range, scale, sources, prior, caps, spreads, reserved ids) | +| `probbit persona check PERSONA` / `describe PERSONA` | valid, its digest and sizes / its traits, moods, inputs, habits and agenda (and senses: unit, range, scale, sources, prior, caps, spreads, reserved ids; the learning block with its credit block) | | `probbit persona compile PERSONA --state STATE [--inputs ...]` | the turn's probbit-ir program; its sha256 is the stance's `engine.program` | | `probbit live PERSONA [--seed N \| --state FILE] [--strand FILE] [--events FILE [--watch]] [--clock real\|fixed]` | a resident individual: JSONL events in, one stance per event out, `elapsed_hours` stamped by the clock, the life logged to a strand (section 5.7); `--state` is rewritten after every event | | `probbit live PERSONA --demo week [--seed N] [--strand FILE] [--plain]` | one individual's scripted week on the fixed clock: learning to its cap, a quiet night, habits that hold (section 5.7) | -| `probbit live verify STRAND` | replay a strand from its header alone: ok, or the earliest line that differs (exit 1) | +| `probbit live verify STRAND [--from-checkpoint] [--actions FILE]` | replay a strand from its header alone: ok, or the earliest line that differs (exit 1); with `--actions`, also the earliest turn whose host action differs from the level its stance released (section 5.7) | | `probbit monitor STRAND [--follow] [--once] [--plain] [--fps N] [--serve] [--open] [--port N]`, `probbit monitor --demo [...]` | watch an individual's inner state: the strand replayed as live bars in the terminal, or as a page on 127.0.0.1 (section 5.8) | A script is a JSON list of per-turn input objects (or `{"turns": [...]}`; a turn may be `{"inputs": {...}, ...}`). Exit codes @@ -1109,7 +1194,9 @@ never change a document. The persona's own `engine.chains` is used whatever `PRO `probbit_live_verify {strand | strand_path}` -> `live verify`'s document (section 5.7; a divergence is an answer). For a persona with a senses block, `probbit_persona_turn` and `probbit_live_event` refuse an event that carries readings (rule S7, section 2.11: readings come from the host's instruments, never through the agent's channel); a persona without - the block lists `senses` in `ignored`, as before. + the block lists `senses` in `ignored`, as before. For a persona with a credit block they refuse an event that carries + `cancel` (section 2.8: a cancel comes from the executor or a person, never through the agent's channel, so the agent cannot + cancel a decision to dodge its correction); `await` and `for` pass. A persona with a drives block takes `goals` in `inputs` / `event` (section 2.9); the schemas declare it. Stateless; the documents are the CLI's. A refusal, a fallback, a counterexample or a divergent strand is an answer; a bad persona, state, input, event or rule is a tool error carrying the error object. diff --git a/docs/probbit.1 b/docs/probbit.1 index 27a72b2..504e99a 100644 --- a/docs/probbit.1 +++ b/docs/probbit.1 @@ -9,7 +9,7 @@ probbit \- a virtual probabilistic (p\-bit) processor: joint decisions under har [\-\-events FILE [\-\-watch]] [\-\-clock real|fixed] [\-\-checkpoint\-every K] \fBprobbit\fR live PERSONA \-\-demo week [\-\-seed N] [\-\-strand FILE] [\-\-plain] -\fBprobbit\fR live verify STRAND [\-\-from\-checkpoint] +\fBprobbit\fR live verify STRAND [\-\-from\-checkpoint] [\-\-actions FILE] \fBprobbit\fR live control STRAND pause|resume|retire \-\-by WHO \-\-reason TEXT [\-\-at TIME] \fBprobbit\fR check PERSONA [\-\-props FILE] [\-\-strand FILE]... [\-\-seeds LIST] @@ -257,7 +257,7 @@ a resident individual: JSONL events in, one stance per event out [\-\-events FILE [\-\-watch]] [\-\-clock real|fixed] [\-\-checkpoint\-every K] \fBprobbit\fR live PERSONA \-\-demo week [\-\-seed N] [\-\-strand FILE] [\-\-plain] -\fBprobbit\fR live verify STRAND [\-\-from\-checkpoint] +\fBprobbit\fR live verify STRAND [\-\-from\-checkpoint] [\-\-actions FILE] \fBprobbit\fR live control STRAND pause|resume|retire \-\-by WHO \-\-reason TEXT [\-\-at TIME] .fi @@ -300,12 +300,15 @@ with \-\-strand: a checkpoint line (the whole state) after every K\-th event (de Subcommands: .RS 4 .TP -\fBverify\fR STRAND [\-\-from\-checkpoint] -replay a strand: the earliest line that differs; from the header (every checkpoint checked), or from the last checkpoint +\fBverify\fR STRAND [\-\-from\-checkpoint] [\-\-actions FILE] +replay a strand: the earliest line that differs; from the header (every checkpoint checked), or from the last checkpoint; with \-\-actions, also the earliest turn whose host action differs from the level its stance released .RS 4 .TP \fB\-\-from\-checkpoint\fR start at the last checkpoint instead of the header +.TP +\fB\-\-actions\fR \fIFILE\fR +the host's action log, one {"turn": T, "action": {trait: level}} per line: compared with each turn's released levels (summary `actions`: checked, differs); exit 1 when one differs .RE .TP \fBcontrol\fR STRAND pause|resume|retire \-\-by WHO \-\-reason TEXT [\-\-at TIME] @@ -325,7 +328,7 @@ when (default: now, UTC) .PP \fIthe safety kit\fR: (docs/persona.md \[u00A7]5.7) one writer per strand: `\-\-strand` takes STRAND.lock (a second writer exits 4 and changes nothing; a lock whose process is gone is taken over). With `reward_from` in the persona (\[u00A7]2.10), a reward from `src: self`, without a src or from an undeclared one is refused like a bad event. .PP -\fIexit\fR: 0 done (live: every event answered; verify: every line replays; control: the line appended), 1 verify: a line differs (its number and what), 2 a bad persona, state, event (one {"error"} object on stdout per bad event when stdout is not a terminal or with \-\-json; the run goes on), control line or flag, 4 refused: the strand's writer lock is held by another writer, or the individual is paused or retired (one {"error"} object per refused event, as for 2; nothing is written). +\fIexit\fR: 0 done (live: every event answered; verify: every line replays; control: the line appended), 1 verify: a line differs (its number and what) or, with \-\-actions, a host action differs from its turn's released level, 2 a bad persona, state, event (one {"error"} object on stdout per bad event when stdout is not a terminal or with \-\-json; the run goes on), control line or flag, 4 refused: the strand's writer lock is held by another writer, or the individual is paused or retired (one {"error"} object per refused event, as for 2; nothing is written). .PP Examples: .RS 4 diff --git a/docs/rfcs/0001-senses-and-reward.md b/docs/rfcs/0001-senses-and-reward.md index 64ec68e..483361e 100644 --- a/docs/rfcs/0001-senses-and-reward.md +++ b/docs/rfcs/0001-senses-and-reward.md @@ -164,8 +164,10 @@ keeps 0.94 of its step, 10 events late 0.81. A decision expires after 4 half-liv most 1/16 of `step_cap`. Event keys: `await: true` (the host will act on this turn's stance and report its outcome); `for: n` (this feedback pays the -decision whose stance has `turn` n); `cancel: [n, …]` (no outcome will come; needs an env or human `src`). They are read, not -compiled, and echoed in `inputs`. +decision whose stance has `turn` n) or `for: {turn: n, stance: "sha256:…"}` (the same, bound to that stance's digest, see +question 2); `cancel: [n, …]` (no outcome will come; needs an env or human `src`). They are read, not compiled, and echoed in +`inputs`. A stance's digest is the sha256 of its canonical JSON without `credit`, `state_digest` and `timing` (so the state +can remember it without hashing itself); each stance carries its own as `credit.stance`. ### B.2 The credit step @@ -192,8 +194,9 @@ if await: open[t] = {credit, stance digest}; beyond max_open close the oldest ( Eligibility scales the capped step, so a stale reward always moves less than a fresh one, and at e = 1 the step is 0.8's exactly. Paying a stance a habit forced moves nothing and is marked `absorbed`. A control line closes every open decision (closed: control): in 0.8 no credit crosses one. State: `open_credit: [{turn, credit, stance}]` (turns increasing, at most -`max_open`, credits within ±1). Stance: `credit: {paid: {turn, e, sign, absorbed, stance} | null, closed: [{turn, as}], -open: [turns]}`. +`max_open`, credits within ±1), `prev_stance` (the previous stance's digest) and `control_closed` (the decisions a control line +closed, listed by the next stance). Stance: `credit: {paid: {turn, e, sign, absorbed, stance} | null, closed: [{turn, as}], +open: [turns], stance}`. ### B.3 Refusals @@ -202,9 +205,12 @@ Refused whole (one `{"error"}` at its path, no turn, no state change; exit 2 for - **B-R1** feedback without `for` while a decision other than t − 1 is open; - **B-R2** `for` naming a decision neither open nor t − 1 (paid, cancelled, expired, evicted, never opened, future); - **B-R3** `for` on an event without feedback; -- **B-R4** `cancel` naming a decision not open, twice, or the one `for` pays; -- **B-R5** malformed: `for` not a whole number, `cancel` not a list of at most `max_open` whole numbers, `await` not - true/false, a `cancel` without an env or human `src`. +- **B-R4** `cancel` naming a decision not open, twice, or the one this event's feedback pays (named by `for`, or t − 1 + when unaddressed); +- **B-R5** malformed: `for` not a whole number or `{turn, stance}` (a whole number and a sha256 digest), `cancel` not a list + of at most `max_open` whole numbers, `await` not true/false, a `cancel` without an env or human `src`; +- **B-R6** `for: {turn: n, stance: d}` where d is not the digest of decision n's stance (the open decision's, or the previous + stance's for t − 1): a restored or forked state cannot pay another decision under the same turn number. `reward_from` checks run before these, unchanged. @@ -280,7 +286,7 @@ with `live control retire`). A 0.8 binary refuses the new blocks as unknown fiel | Outcomes never settled | `max_open`, expiry, `open` in every stance | | A duplicated or replayed payment | the decision is closed: B-R2 | | The agent cancels to dodge a correction | `cancel` needs env or human; MCP refuses it | -| A restored state repeats turn numbers | `paid.stance` names the paid stance's digest for the host to compare | +| A restored state repeats turn numbers | `for: {turn, stance}` binds the paid stance's digest (B-R6); with a bare `for` the paid digest comes back in `paid.stance` for the host to compare | ## Alternatives considered @@ -296,6 +302,9 @@ with `live control retire`). A 0.8 binary refuses the new blocks as unknown fiel 1. Should open decisions survive pause and resume? Closing them matches 0.8, but outcomes landing during a pause are lost. 2. Should `for` carry the stance digest (`for: {turn, stance}`) so a restored state cannot pay a different decision? + **Decided for 0.9.0: yes.** `for: {turn, stance}` binds the digest from the start, and a digest that is not the named + turn's stance is refused (B-R6). A bare `for: n` stays accepted (the turn is unambiguous within the open set), and the + paid stance's digest is echoed in the stance's `credit.paid.stance`. 3. Should eligibility decay by events, by clock hours, or not at all until expiry? 4. Should `human` readings teach a normal, or only move the stance? 5. Should 0.9.0 ship `persona migrate OLD NEW --state S` to carry moods, history and learned weights into a persona that only diff --git a/examples/agent-harness/README.md b/examples/agent-harness/README.md index b36390a..0b2eead 100644 --- a/examples/agent-harness/README.md +++ b/examples/agent-harness/README.md @@ -49,6 +49,21 @@ A plain circuit breaker can enforce this single static retry rule. The additiona shown here is history-dependent reproduction, bounded learning, deterministic replay and a scoped rule check. +## Late outcomes, addressed + +`addressed.json` is the retry policy with a `learning.credit` block (docs/persona.md §2.8). The host marks each decision +it acts on with `await: true` and reports its outcome later, naming the decision: `for: {turn, stance}` with the stance's +turn and digest (`credit.stance`). `late.py` makes four decisions and then reports their outcomes in another order: each one +credits the stance it was about, scaled by how late it came, and a duplicate is refused without changing anything. `live +verify --actions` then compares the host's action log with the levels the strand released. + +```sh +python3 examples/agent-harness/late.py +``` + +`golden/` holds the addressed policy's documents for a fixed 16-event script; CI checks them byte for byte on Linux, macOS +and Windows. + ## Replaying generated counterexamples When `reward_from` requires a source, fuzz searches an abstract accepted-source history. diff --git a/examples/agent-harness/addressed.json b/examples/agent-harness/addressed.json new file mode 100644 index 0000000..340ef4d --- /dev/null +++ b/examples/agent-harness/addressed.json @@ -0,0 +1,78 @@ +{ + "probbit_persona": 1, + "identity": { + "name": "Retry policy addressed", + "version": "1", + "seed": 0 + }, + "traits": [ + { + "id": "action", + "levels": [ + "retry", + "ask" + ], + "logw": [ + 0.5, + 0 + ], + "say": [ + "retry the local probe", + "escalate to the operator" + ] + } + ], + "inputs": [ + { + "id": "error", + "kind": "flag" + }, + { + "id": "praise", + "kind": "flag" + } + ], + "history": [ + { + "id": "error_streak", + "of": "error", + "kind": "streak", + "cap": 3, + "effects": { + "action": 0.2 + } + } + ], + "learning": { + "from": [ + "praise" + ], + "traits": [ + "action" + ], + "rate": 0.3, + "step_cap": 0.05, + "total_cap": 0.4, + "credit": { + "max_open": 8, + "half_life_events": 32 + } + }, + "reward_from": [ + "env" + ], + "habits": [ + { + "id": "escalate_after_two_errors", + "when": { + "error_streak": 2 + }, + "then": { + "action": [ + "ask" + ] + }, + "say": "two failures: stop and escalate" + } + ] +} diff --git a/examples/agent-harness/golden/describe.json b/examples/agent-harness/golden/describe.json new file mode 100644 index 0000000..6057c93 --- /dev/null +++ b/examples/agent-harness/golden/describe.json @@ -0,0 +1 @@ +{"agenda":[],"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","habits":["escalate_after_two_errors"],"inputs":{"error":{"kind":"flag"},"praise":{"kind":"flag"}},"learning":{"credit":{"expires_after":128,"half_life_events":32,"max_open":8},"from":["praise"],"rate":0.3,"step_cap":0.05,"total_cap":0.4,"traits":["action"]},"moods":{},"name":"Retry policy addressed","reward_from":{"praise":["env"]},"seed":0,"traits":{"action":{"levels":["retry","ask"],"say":["retry the local probe","escalate to the operator"]}},"version":"1"} diff --git a/examples/agent-harness/golden/events.json b/examples/agent-harness/golden/events.json new file mode 100644 index 0000000..163c513 --- /dev/null +++ b/examples/agent-harness/golden/events.json @@ -0,0 +1,75 @@ +[ + { + "await": true + }, + { + "await": true, + "error": true, + "src": "env:probe" + }, + { + "praise": true, + "for": 0, + "src": "env:probe" + }, + { + "await": true, + "elapsed_hours": 0.5 + }, + { + "cancel": [ + 1 + ], + "src": "env:executor" + }, + { + "praise": true, + "for": 3, + "src": "env:probe" + }, + { + "await": true + }, + { + "praise": true, + "src": "env:probe" + }, + { + "await": true, + "error": true, + "src": "env:probe" + }, + { + "await": true, + "error": true, + "src": "env:probe" + }, + { + "praise": true, + "for": { + "turn": 9, + "stance": "sha256:34fd9fe56a28a65a4503f64ed192b0bfa873b453efb5df2eaae9ddd43f20f426" + }, + "src": "env:probe" + }, + { + "praise": true, + "for": 8, + "src": "env:probe" + }, + { + "await": true, + "elapsed_hours": 1 + }, + { + "await": true + }, + { + "elapsed_hours": 2 + }, + { + "praise": true, + "for": 12, + "src": "env:probe" + } +] diff --git a/examples/agent-harness/golden/final-state.json b/examples/agent-harness/golden/final-state.json new file mode 100644 index 0000000..74833d1 --- /dev/null +++ b/examples/agent-harness/golden/final-state.json @@ -0,0 +1 @@ +{"control_closed":[],"credit":{"action":[0.271458,-0.271458]},"digest":"sha256:8ed82fa4b0d0b817e3ebf10ea153828d7e02f3c136fa3549a2c8ad6f60eba8a7","genes":{"react":{},"shift":{}},"history":{"error":[false,false,false,false,false]},"learned":{"action":[0.243618,-0.243618]},"mood":{},"open_credit":[{"credit":{"action":[0.290805,-0.290805]},"stance":"sha256:49b6b3b9ea9f1d215ae1f706f3110a174866a2a18ee0b331a43bdb35da1dba88","turn":13}],"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"prev":{"action":"retry"},"prev_stance":"sha256:98f83103c496df6f46f7765ea03ace796cf3c749717cdbe8697ce733c3d6a2a2","probbit_persona_state":1,"rest":{"action":"retry"},"seed":0,"turn":16} diff --git a/examples/agent-harness/golden/program-turn0.json b/examples/agent-harness/golden/program-turn0.json new file mode 100644 index 0000000..e597478 --- /dev/null +++ b/examples/agent-harness/golden/program-turn0.json @@ -0,0 +1 @@ +{"probbit_ir":1,"comment":"probbit persona Retry policy addressed 1 seed 0 turn 0; active habits: none","values":["l0","l1"],"vars":[{"id":"action","allowed":["l0","l1"],"h":{"l0":0.5}},{"id":"free.action","allowed":["l0","l1"],"h":{"l0":0.5}}]} diff --git a/examples/agent-harness/golden/state0.json b/examples/agent-harness/golden/state0.json new file mode 100644 index 0000000..333f4fb --- /dev/null +++ b/examples/agent-harness/golden/state0.json @@ -0,0 +1 @@ +{"control_closed":[],"credit":{"action":[0,0]},"digest":"sha256:f1828b098ae085902f1838b9512336eb1764cdd37b00c8dd22d44c810c06a7d2","genes":{"react":{},"shift":{}},"history":{"error":[]},"learned":{"action":[0,0]},"mood":{},"open_credit":[],"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"prev":{"action":"retry"},"prev_stance":null,"probbit_persona_state":1,"rest":{"action":"retry"},"seed":0,"turn":0} diff --git a/examples/agent-harness/golden/turns.jsonl b/examples/agent-harness/golden/turns.jsonl new file mode 100644 index 0000000..1c37eaf --- /dev/null +++ b/examples/agent-harness/golden/turns.jsonl @@ -0,0 +1,16 @@ +{"credit":{"closed":[],"open":[0],"paid":null,"stance":"sha256:675d9fd073e975fcc2a18dc6939779300b47e49ef063b8ee66d58beb454fbd17"},"engine":{"program":"sha256:8540849eb8c3b8fcb21756342c9ff686896f22346dcb7d8a9934bdc3876fbfa0","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":false,"error_streak":0,"praise":false},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.377541,"retry":0.622459},"p":0.622459,"released":true}},"state_digest":"sha256:8e423f666eb871833adb3bd89d3f51e25629d080a6be6f3d4fd5c896890a7cb1","status":"ok","turn":0,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[],"open":[0,1],"paid":null,"stance":"sha256:a75a78f1f94bb8979f60aac26cec0abc8061a5f7ec15232f075e8ab55d861ab2"},"engine":{"program":"sha256:fa27a46e6e8cd02b7eda8ce40239de1d9dacf5d342916b290853de637913e70a","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":true,"error_streak":1,"praise":false,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.475021,"retry":0.524979},"p":0.524979,"released":true}},"state_digest":"sha256:4627bb95416a894ff6114a70cc9a34898c3d822649ac99d4b749f32e52d55bc9","status":"ok","turn":1,"unsure":[],"why":"error streak 1 -> action up"} +{"credit":{"closed":[{"as":"paid","turn":0}],"open":[1],"paid":{"absorbed":false,"e":0.978572,"sign":1,"stance":"sha256:675d9fd073e975fcc2a18dc6939779300b47e49ef063b8ee66d58beb454fbd17","turn":0},"stance":"sha256:cc52ea56e1ca7ff7cf7e05d32826e1e20f003a65c248cb673b7d5154037d4df6"},"engine":{"program":"sha256:53f1746bc193fe5dc33c7c3fc36b1d7f00e678e5cb576a32a790248b62d6aed2","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"for":0,"praise":true,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.354834,"retry":0.645166},"p":0.645166,"released":true}},"state_digest":"sha256:f59932e285e6f7db161a257b60d396c9913901f1ea14da949f6f37257027c3e1","status":"ok","turn":2,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[],"open":[1,3],"paid":null,"stance":"sha256:bf6e8356c13751a7806add1bf8b9df751f812c2a528d71091b4a0b2adae669a1"},"engine":{"program":"sha256:01bca33cd40e85529a7a7efe45f649132f2789c04ffcf0c9b28ca34d1842ad93","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":false,"error_streak":0,"praise":false},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.354834,"retry":0.645166},"p":0.645166,"released":true}},"state_digest":"sha256:2822cc6662dad309b3b1ad7ce6f45bf0b27045c157be8b70b83a2767b627f5b6","status":"ok","turn":3,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[{"as":"cancelled","turn":1}],"open":[3],"paid":null,"stance":"sha256:f1bbc0937ac73f0db04d938c0ba87e274aedffde4aeeb68b476366a0127fe30a"},"engine":{"program":"sha256:a3d89e780cc58cfe58c13026df656035fef636bb9cf767498890262e81aed5f3","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"cancel":[1],"error":false,"error_streak":0,"praise":false,"src":"env:executor"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.354834,"retry":0.645166},"p":0.645166,"released":true}},"state_digest":"sha256:14b20cbd53cc31c85f8b15cdfaa514100bfff7a98380490c9a1ab12213f0e577","status":"ok","turn":4,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[{"as":"paid","turn":3}],"open":[],"paid":{"absorbed":false,"e":0.978572,"sign":1,"stance":"sha256:bf6e8356c13751a7806add1bf8b9df751f812c2a528d71091b4a0b2adae669a1","turn":3},"stance":"sha256:0f5c1f7ba208bcfc9c75f606bcd2d123314fff4ccd0eed90403539d674d5f95d"},"engine":{"program":"sha256:9fe20224fc4b29ba68427f1c689f571aad32abf14e5fe2bda89cbb9ce324e574","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"for":3,"praise":true,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.332763,"retry":0.667237},"p":0.667237,"released":true}},"state_digest":"sha256:5f7cd18ed37c62ae56647cae2c176d2fcd1cafb39227d528b6481af9fa42e9ed","status":"ok","turn":5,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[],"open":[6],"paid":null,"stance":"sha256:d4830b7e3fd70227a4ce9d75b2842b3903294d2166b289998532f1361f9404fb"},"engine":{"program":"sha256:70a5fd4247a784162c2c8fbc8d130332a4a3242a3ba98504bcc7e3135bde8d18","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":false,"error_streak":0,"praise":false},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.332763,"retry":0.667237},"p":0.667237,"released":true}},"state_digest":"sha256:3c878e9856775abcf7bf04f063fdd6be46f004539aeb5c32f78b872ce0eb6fc6","status":"ok","turn":6,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[{"as":"paid","turn":6}],"open":[],"paid":{"absorbed":false,"e":1,"sign":1,"stance":"sha256:d4830b7e3fd70227a4ce9d75b2842b3903294d2166b289998532f1361f9404fb","turn":6},"stance":"sha256:114328fdd177417644f5f2773cc698189a8df31670f24cce369187a8410ea4e6"},"engine":{"program":"sha256:5c5175d06d06f8061a72ba30436618320949cb77f8a3cffe184a5f25beeaa0f0","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"praise":true,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.310943,"retry":0.689057},"p":0.689057,"released":true}},"state_digest":"sha256:dc055f2b4465c0f245fbaa766f3f4f5b754ebc13c917015ed0808c813672bb37","status":"ok","turn":7,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[],"open":[8],"paid":null,"stance":"sha256:9a7a52057c4a3d4154da66ff36fd1f83eefa36ad9222b971541de6acddad8a22"},"engine":{"program":"sha256:4e32ab06530c48f3f0af10cb9e33a5e13dfe1c641532a96fa8a2cc3375f83211","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":true,"error_streak":1,"praise":false,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.402342,"retry":0.597658},"p":0.597658,"released":true}},"state_digest":"sha256:f497c2920a4d80e7e3393560d3bda7480392789e629a2299d0f1f82082575802","status":"ok","turn":8,"unsure":[],"why":"error streak 1 -> action up"} +{"credit":{"closed":[],"open":[8,9],"paid":null,"stance":"sha256:34fd9fe56a28a65a4503f64ed192b0bfa873b453efb5df2eaae9ddd43f20f426"},"engine":{"program":"sha256:b041ceee8310415b66f4bf3988bcef588ca798f032493687583968a61c7e09c5","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":["escalate_after_two_errors"],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":true,"error_streak":2,"praise":false,"src":"env:probe"},"line":"Stance: two failures: stop and escalate; escalate to the operator.","line_tokens":17,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"ask","odds":{"ask":1,"retry":0},"p":1,"released":true}},"state_digest":"sha256:b66b04b318f9888796a4c6ebc2344d2fad90bbb7b3791db60e1c532d7cf8548c","status":"ok","turn":9,"unsure":[],"why":"error streak 2 -> action up"} +{"credit":{"closed":[{"as":"paid","turn":9}],"open":[8],"paid":{"absorbed":true,"e":1,"sign":1,"stance":"sha256:34fd9fe56a28a65a4503f64ed192b0bfa873b453efb5df2eaae9ddd43f20f426","turn":9},"stance":"sha256:5f35f40b63ecbcbbb964a24b84d6e9067b64f4ea05d0664f592f9f7ce70fc173"},"engine":{"program":"sha256:ff6ac83eb3d05d9c30e4822d81277dc24c44176479100db5ee1adf5d6ce9a2a6","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"for":{"stance":"sha256:34fd9fe56a28a65a4503f64ed192b0bfa873b453efb5df2eaae9ddd43f20f426","turn":9},"praise":true,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.310943,"retry":0.689057},"p":0.689057,"released":true}},"state_digest":"sha256:797d9deb4dba34b05eec6ca324be9ba45f894ec8e2b0903431aefdd5ab708730","status":"ok","turn":10,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[{"as":"paid","turn":8}],"open":[],"paid":{"absorbed":false,"e":0.957603,"sign":1,"stance":"sha256:9a7a52057c4a3d4154da66ff36fd1f83eefa36ad9222b971541de6acddad8a22","turn":8},"stance":"sha256:9266080ee58f5d778ef0a9d4d8a69eba77d0580abe2f26126cc6a920fa622979"},"engine":{"program":"sha256:a52518d31bd20664ca728b0cd508bcae5a5cc07f32f7782b85500f4832e71ca9","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"for":8,"praise":true,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.290805,"retry":0.709195},"p":0.709195,"released":true}},"state_digest":"sha256:032198263a3f8b8445f90f0ef993b667eb8258d9b768ce1edf46dcc6a833f02b","status":"ok","turn":11,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[],"open":[12],"paid":null,"stance":"sha256:45756a9afdc894c252a3ac0046840bf5b834d4993959bc662fd9966588fb98bc"},"engine":{"program":"sha256:556a28d3c08c503572c828eeba6232253fbbc2392e6c693082d65fa6465be713","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":false,"error_streak":0,"praise":false},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.290805,"retry":0.709195},"p":0.709195,"released":true}},"state_digest":"sha256:5a6718b426f5a3509eac49b391af2fbeecb6946b9d64dcd862786dc13b5cae88","status":"ok","turn":12,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[],"open":[12,13],"paid":null,"stance":"sha256:49b6b3b9ea9f1d215ae1f706f3110a174866a2a18ee0b331a43bdb35da1dba88"},"engine":{"program":"sha256:ade53eb7b998a927e385bc02253ae082b91a5d45dd977a6c8e1a370ed5250e3f","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"await":true,"error":false,"error_streak":0,"praise":false},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.290805,"retry":0.709195},"p":0.709195,"released":true}},"state_digest":"sha256:63f52715c8d94174ce050293f9dab2941a695dc5ddd39477118d59496894898a","status":"ok","turn":13,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[],"open":[12,13],"paid":null,"stance":"sha256:f96613db77b69b6d904bfd78d17ed8293816c7cfa2f84f376946c3a1969641a2"},"engine":{"program":"sha256:5481b8513472b7089fde8efc906b8826824375b5d76ffc8c878cfd61f807c149","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"praise":false},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.290805,"retry":0.709195},"p":0.709195,"released":true}},"state_digest":"sha256:b34c2ab1c947ea4157dcd28a50fc7af10abe4f4f089716315f00dcc72e22c330","status":"ok","turn":14,"unsure":[],"why":"baseline (no live evidence)"} +{"credit":{"closed":[{"as":"paid","turn":12}],"open":[13],"paid":{"absorbed":false,"e":0.957603,"sign":1,"stance":"sha256:45756a9afdc894c252a3ac0046840bf5b834d4993959bc662fd9966588fb98bc","turn":12},"stance":"sha256:98f83103c496df6f46f7765ea03ace796cf3c749717cdbe8697ce733c3d6a2a2"},"engine":{"program":"sha256:9c68dda9f7df6b8ce8231e69499e7db1bc2e93ab690e7e71f4be25ba3ba55c08","tier":"enumerate","verdict":"exact"},"escalate":null,"habits":{"active":[],"bound":[],"conflict":[],"violations":0,"yielded":[]},"held":[],"ignored":[],"inputs":{"error":false,"error_streak":0,"for":12,"praise":true,"src":"env:probe"},"line":"Stance: retry the local probe.","line_tokens":8,"mood":{},"persona":{"digest":"sha256:3af73c46073ee69f0c9cfdc4362af0a7c894c35219c7497573e12b20b12ddea5","name":"Retry policy addressed","version":"1"},"probbit_persona_turn":1,"seed":0,"stance":{"action":{"level":"retry","odds":{"ask":0.271458,"retry":0.728542},"p":0.728542,"released":true}},"state_digest":"sha256:8ed82fa4b0d0b817e3ebf10ea153828d7e02f3c136fa3549a2c8ad6f60eba8a7","status":"ok","turn":15,"unsure":[],"why":"baseline (no live evidence)"} diff --git a/examples/agent-harness/late.py b/examples/agent-harness/late.py new file mode 100644 index 0000000..dba2445 --- /dev/null +++ b/examples/agent-harness/late.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +"""Late, reordered outcomes credit the decision they were about. Local and dependency-free: no model or network calls.""" +import argparse +import json +from pathlib import Path +import random +import subprocess +import sys +import tempfile + +HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(HERE.parent.parent / "python")) +import probbit +from run import gate + + +def late_outcomes(directory, binary=None, decisions=4, seed=7): + """`addressed.json` awaits the outcome of each decision the host acts on. The outcomes come back late and in another order, + each naming its decision (`for: {turn, stance}`), so each one credits the stance it was about; a duplicate is refused and + changes nothing; `live verify --actions` compares the host's action log with the released levels.""" + binary = probbit.find_binary(binary) + policy = HERE / "addressed.json" + document = json.loads(policy.read_text(encoding="utf-8")) + strand = directory / "late.strand" + result, awaited, actions = None, [], [] + for _ in range(decisions): + # The host acts on this decision now and will report its outcome later: the stance's turn and digest name it. + event = {"await": True} + result = probbit.live_event(document, None if result is None else result["state"], event, + seed=0 if result is None else None, strand=strand, binary=binary) + stance = result["stance"] + decision, _ = gate(stance, "local_probe", 0) + actions.append({"turn": stance["turn"], "action": {"action": "retry" if decision == "dispatch" else "ask"}}) + awaited.append({"turn": stance["turn"], "stance": stance["credit"]["stance"]}) + # Explicitly synthetic confirmations, not production outcomes: late and shuffled, each addressed to its decision. + order = list(awaited) + random.Random(seed).shuffle(order) + paid = [] + for target in order: + result = probbit.live_event(document, result["state"], {"praise": True, "for": target, "src": "env:synthetic"}, + strand=strand, binary=binary) + record = result["stance"]["credit"]["paid"] + paid.append({"turn": record["turn"], "e": record["e"], "stance_matches": record["stance"] == target["stance"]}) + before = strand.read_bytes() + try: + probbit.live_event(document, result["state"], {"praise": True, "for": order[0], "src": "env:synthetic"}, + strand=strand, binary=binary) + duplicate = "accepted" + except probbit.ProbbitInputError as error: + duplicate = error.path + log = directory / "host-actions.jsonl" + log.write_text("".join(json.dumps(a) + "\n" for a in actions), encoding="utf-8") + verify = subprocess.run([binary, "live", "verify", str(strand), "--actions", str(log)], capture_output=True, + encoding="utf-8", timeout=30) + summary = json.loads(verify.stdout) + return {"decisions": len(awaited), "paid": paid, "open_after": result["stance"]["credit"]["open"], + "duplicate_refused_at": duplicate, "strand_unchanged_by_refusal": strand.read_bytes() == before, + "verify_exit": verify.returncode, "actions": summary.get("actions"), "verify_ok": summary.get("ok")} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--binary", help="probbit executable (otherwise PROBBIT_BIN/PATH/build fallback)") + args = parser.parse_args() + with tempfile.TemporaryDirectory(prefix="probbit-late-outcomes-") as directory: + print(json.dumps(late_outcomes(Path(directory), args.binary), indent=2)) + + +if __name__ == "__main__": + main() diff --git a/examples/agent-harness/test_harness.py b/examples/agent-harness/test_harness.py index 136239e..caa0f13 100644 --- a/examples/agent-harness/test_harness.py +++ b/examples/agent-harness/test_harness.py @@ -3,6 +3,7 @@ from pathlib import Path import tempfile import unittest +from late import late_outcomes from run import demonstrate, gate @@ -33,6 +34,18 @@ def test_host_rejects_unreleased_refused_or_unknown_tool_actions(self): self.assertEqual(gate(stance, "shell", 0)[0], "escalate") self.assertEqual(gate(stance, "local_probe", 3)[0], "escalate") + def test_late_outcomes_credit_their_own_decisions(self): + with tempfile.TemporaryDirectory() as directory: + report = late_outcomes(Path(directory)) + self.assertEqual(sorted(p["turn"] for p in report["paid"]), [0, 1, 2, 3]) + self.assertNotEqual([p["turn"] for p in report["paid"]], [0, 1, 2, 3], "the outcomes came back reordered") + self.assertTrue(all(p["stance_matches"] and 0 < p["e"] <= 1 for p in report["paid"])) + self.assertTrue(any(p["e"] < 1 for p in report["paid"]), "a late outcome moves less than a fresh one") + self.assertEqual(report["open_after"], []) + self.assertTrue(report["duplicate_refused_at"].endswith("inputs.for")) + self.assertTrue(report["strand_unchanged_by_refusal"]) + self.assertEqual((report["verify_exit"], report["verify_ok"], report["actions"]), (0, True, {"checked": 4, "differs": None})) + if __name__ == "__main__": unittest.main() diff --git a/probbit-cli/src/fuzz.rs b/probbit-cli/src/fuzz.rs index 69cdc2e..579fbc9 100644 --- a/probbit-cli/src/fuzz.rs +++ b/probbit-cli/src/fuzz.rs @@ -29,22 +29,38 @@ pub fn grid(p: &Persona, props: &[Prop], given: &[f64]) -> Vec { /// One individual's shortest counterexample to one property, shrunk: the script, the breaking turn's stance document, what broke pub struct Found { pub script: Vec, pub doc: Json, pub broken: Vec } -fn step(p: &Persona, st: &State, e: &Event, eng: persona::Engine, turns: &AtomicUsize) -> (Json, State) { +/// One turn of the search: (the stance, the new state, the event as it ran). A credit block's payments (§2.8) are resolved +/// against the state before the turn runs; the credit step may refuse the event (B-R1 to B-R6, at inputs.for / inputs.cancel): None, and it +/// changes nothing +fn step(p: &Persona, st: &State, e: &Event, eng: persona::Engine, turns: &AtomicUsize) -> Option<(Json, State, Event)> { turns.fetch_add(1, Ordering::Relaxed); - persona::turn_any_source(p, st, &persona::event_json(e), false, eng, false).expect("the fuzzer's inputs are valid") + let ev = persona::resolve_payments(p, st, e); + match persona::turn_any_source(p, st, &persona::event_json(&ev), false, eng, false) { + Ok((doc, ns)) => Some((doc, ns, ev)), + Err(x) if p.has_credit() && ["inputs.for", "inputs.cancel"].iter().any(|k| x.path.starts_with(k)) => None, + Err(x) => panic!("the fuzzer's inputs are valid: {}: {}", x.path, x.msg) } } /// The earliest turn of `script` (run from `st0`) whose stance breaks the property fn breaking_turn(p: &Persona, pr: &Prop, st0: &State, script: &[Event], eng: persona::Engine, turns: &AtomicUsize) -> Option<(usize, Json, Vec)> { let mut st = st0.clone(); - for (k, e) in script.iter().enumerate() { let (doc, ns) = step(p, &st, e, eng, turns); + for (k, e) in script.iter().enumerate() { let Some((doc, ns, _)) = step(p, &st, e, eng, turns) else { continue }; if let Some(b) = persona::breaks(p, pr, &st, &doc) { return Some((k, doc, b)); } st = ns; } None } +/// A script as it ran: payments resolved, refused events left out (they change nothing), so it replays as is. Without a credit +/// block the script is already concrete; the re-run is not a searched turn either way. +fn concrete(p: &Persona, st0: &State, script: &[Event], eng: persona::Engine) -> Vec { + if !p.has_credit() { return script.to_vec(); } + let (mut st, mut out, rerun) = (st0.clone(), vec![], AtomicUsize::new(0)); + for e in script { if let Some((_, ns, ev)) = step(p, &st, e, eng, &rerun) { out.push(ev); st = ns; } } + out +} /// A random event: each input takes one of its non-default values with a fixed chance (flag 1/4, level 1/2, number 2/5, idle /// hours 3/10, a goal signal 3/20), else stays at its default (left out of the event) fn random_event(r: &mut Philox4x32, alpha: &[(String, &'static str, Vec)]) -> Event { let mut e = vec![]; - for (id, kind, vals) in alpha { let chance = match *kind { "flag" => 0.25, "level" => 0.5, "number" => 0.4, "goal" => 0.15, "sense" => 0.4, _ => 0.3 }; + for (id, kind, vals) in alpha { let chance = match *kind { "flag" => 0.25, "level" => 0.5, "number" => 0.4, "goal" => 0.15, "sense" => 0.4, + "pay" => match id.as_str() { "await" => 0.5, "for" => 0.3, _ => 0.1 }, _ => 0.3 }; if r.f64() < chance { e.push((id.clone(), vals[r.below(vals.len())].clone())); } } e } @@ -55,6 +71,10 @@ fn moves(p: &Persona, pr: &Prop, s: &Search) -> Vec { let mut out: Vec = vec![vec![]]; out.extend(atoms.iter().cloned()); for b in persona::forcing(p, pr, &s.grid) { if !out.contains(&b) { out.push(b.clone()); } for a in &atoms { if b.iter().any(|(k, _)| *k == a[0].0) { continue; } let mut e = b.clone(); e.extend(a.iter().cloned()); if !out.contains(&e) { out.push(e); } } } + // a credit block (§2.8): each payment kind alone and with each learning flag (so `for` has feedback to carry) + let flags: Vec = atoms.iter().filter(|a| persona::learning_flag(p, &a[0].0)).cloned().collect(); + for (id, vals) in persona::payment_alphabet(p) { for v in vals { let e = vec![(id.clone(), v)]; + for f in &flags { let mut fe = f.clone(); fe.extend(e.iter().cloned()); out.push(fe); } out.push(e); } } out } /// Breadth by depth, `s.beam` states kept per depth (distinct states, the most pressure first): the earliest script whose last @@ -64,7 +84,7 @@ fn beam(p: &Persona, pr: &Prop, st0: &State, limit: usize, s: &Search, eng: pers for _ in 0..limit { let mut next: Vec<(f64, Vec, State)> = vec![]; for (script, st) in &kept { for e in &mv { - let (doc, ns) = step(p, st, e, eng, turns); let mut sc = script.clone(); sc.push(e.clone()); + let Some((doc, ns, _)) = step(p, st, e, eng, turns) else { continue }; let mut sc = script.clone(); sc.push(e.clone()); if persona::breaks(p, pr, st, &doc).is_some() { return Some(sc); } next.push((persona::pressure(p, pr, st, &doc), sc, ns)); } } next.sort_by(|a, b| b.0.partial_cmp(&a.0).unwrap_or(std::cmp::Ordering::Equal)); // stable: ties keep the move order @@ -87,19 +107,20 @@ fn shrink(p: &Persona, pr: &Prop, st0: &State, script: Vec, eng: persona: if !changed { break; } } let (k, doc, broken) = breaking_turn(p, pr, st0, &cur, eng, turns).expect("a shrunk counterexample still breaks the property"); - cur.truncate(k + 1); Found { script: cur, doc, broken } + cur.truncate(k + 1); Found { script: concrete(p, st0, &cur, eng), doc, broken } } /// One individual: random scripts (shared by the properties), then per property the beam up to one event shorter than the /// shortest found, then shrinking fn individual(p: &Persona, props: &[Prop], seed: u64, s: &Search, eng: persona::Engine, turns: &AtomicUsize) -> Vec> { - let st0 = persona::init(p, Some(seed), true, eng); let alpha = persona::alphabet(p, &s.grid, &s.hours); + let st0 = persona::init(p, Some(seed), true, eng); + let mut alpha = persona::alphabet(p, &s.grid, &s.hours); alpha.extend(persona::payment_alphabet(p).into_iter().map(|(id, v)| (id, "pay", v))); let mut best: Vec>> = vec![None; props.len()]; let mut r = Philox4x32::new(s.fuzz_seed, seed); let search = |script: &[Event], best: &mut Vec>>| { let mut st = st0.clone(); for (k, e) in script.iter().enumerate() { if best.iter().all(|b| b.as_ref().is_some_and(|b| b.len() <= k + 1)) { break; } - let (doc, ns) = step(p, &st, e, eng, turns); + let Some((doc, ns, _)) = step(p, &st, e, eng, turns) else { continue }; for (i, pr) in props.iter().enumerate() { if best[i].as_ref().map_or(true, |b| b.len() > k + 1) && persona::breaks(p, pr, &st, &doc).is_some() { best[i] = Some(script[..=k].to_vec()); } } st = ns; } }; for _ in 0..s.scripts { diff --git a/probbit-cli/src/live.rs b/probbit-cli/src/live.rs index 911c765..1be7399 100644 --- a/probbit-cli/src/live.rs +++ b/probbit-cli/src/live.rs @@ -236,6 +236,8 @@ impl Replay { let nm = persona::normals(&live.p, &live.st); if !nm.is_empty() { v.push(("normals".into(), Json::Obj(nm.iter().enumerate().map(|(k, (id, m, n, _))| (id.clone(), Json::Obj(vec![("mean".into(), Json::Num(*m)), ("n".into(), Json::Num(*n as f64)), ("max_move_50".into(), Json::Num(self.norms.max_move.get(k).copied().unwrap_or(0.0)))]))).collect()))); } + // a credit block (§2.8): the decisions still awaiting an outcome + if let Some(o) = persona::open_decisions(&live.p, &live.st) { v.push(("open".into(), Json::Arr(o.iter().map(|(t, _)| Json::Num(*t as f64)).collect()))); } Json::Obj(v) } } @@ -265,6 +267,48 @@ pub fn verify_from_checkpoint(text: &str, eng: Engine) -> Result Result<(Json, Vec<(u64, Json)>, Persona), (usize, String)> { + let lines = lines(text); + let mut r = Replay::open(lines.first().copied().unwrap_or(""))?; let mut kept = vec![]; + for l in lines.iter().skip(1) { if let Some(doc) = r.step(l, eng)? { + if let Some(t) = doc.get("turn").and_then(Json::as_f64).map(|x| x as u64).filter(|t| keep.contains(t)) { kept.push((t, doc)); } } } + Ok((r.summary(), kept, r.live.p.clone())) +} +/// One line of a host's action log (`live verify --actions FILE`, §5.7): the decision's turn and, per trait the host acted on, +/// the level it acted on +pub struct Action { pub line: usize, pub turn: u64, pub levels: Vec<(String, String)> } +/// A host's action log: one JSON object per line, {"turn": T, "action": {trait: level, ...}} (blank lines skipped) +pub fn read_actions(text: &str) -> Result, InErr> { + let mut out = vec![]; + for (i, l) in text.split('\n').map(bare).enumerate() { if l.trim().is_empty() { continue; } let path = format!("actions.line{}", i + 1); + let bad = |m: &str| perr(&path, m.to_string()); + let j = json::parse(l).map_err(|e| perr(&path, format!("not JSON: {}", e.msg)))?; + let kv = j.as_obj().filter(|kv| kv.len() == 2 && kv.iter().all(|(k, _)| k == "turn" || k == "action")).ok_or_else(|| bad("an object {\"turn\": T, \"action\": {trait: level}}"))?; + let turn = kv.iter().find(|(k, _)| k == "turn").and_then(|(_, x)| x.as_f64()).filter(|x| *x >= 0.0 && x.fract() == 0.0 && *x <= 9_007_199_254_740_992.0) + .ok_or_else(|| bad("turn: a whole number >= 0 (the stance's turn)"))? as u64; + let act = kv.iter().find(|(k, _)| k == "action").and_then(|(_, x)| x.as_obj()).filter(|a| !a.is_empty()).ok_or_else(|| bad("action: an object trait -> level"))?; + let levels = act.iter().map(|(t, x)| x.as_str().map(|l| (t.clone(), l.to_string())).ok_or_else(|| bad("action: each level a string"))).collect::, InErr>>()?; + out.push(Action { line: i + 1, turn, levels }); } + Ok(out) +} +/// The earliest turn (then the earliest line) whose host action differs from the level its stance released -> (actions +/// checked, the difference: {turn, line, trait, action, released (null: not released or no such turn), why}); an action on a +/// trait the persona does not have is an input error +pub fn first_difference(p: &Persona, actions: &[Action], stances: &[(u64, Json)]) -> Result<(usize, Option), InErr> { + let mut order: Vec<&Action> = actions.iter().collect(); order.sort_by_key(|a| (a.turn, a.line)); + let s = |x: &str| Json::Str(x.to_string()); let mut checked = 0; + for a in order { checked += 1; let doc = stances.iter().find(|(t, _)| *t == a.turn).map(|x| &x.1); + for (t, level) in &a.levels { + let e = match doc { Some(d) => persona::doc_entry(p, d, t), None => None }; + if doc.is_some() && e.is_none() { return Err(perr(&format!("actions.line{}.action.{t}", a.line), "not a trait of the persona")); } + let released = e.as_ref().filter(|e| e.get("released") == Some(&Json::Bool(true))).and_then(|e| e.get("level")).and_then(Json::as_str).map(str::to_string); + let why = match (doc, &released) { (None, _) => "the strand has no stance with this turn", (_, None) => "the stance did not release this trait", + (_, Some(r)) if r != level => "the host acted on another level", _ => continue }; + return Ok((checked, Some(Json::Obj(vec![("turn".into(), Json::Num(a.turn as f64)), ("line".into(), Json::Num(a.line as f64)), ("trait".into(), s(t)), ("action".into(), s(level)), + ("released".into(), released.map_or(Json::Null, |r| s(&r))), ("why".into(), s(why))])))); } } + Ok((checked, None)) +} /// `verify` as one document: the summary, or {ok: false, line, diverges} pub fn verify_doc(text: &str, eng: Engine) -> Json { verify(text, eng).unwrap_or_else(|(line, why)| Json::Obj(vec![("ok".into(), Json::Bool(false)), ("line".into(), Json::Num(line as f64)), ("diverges".into(), Json::Str(why))])) diff --git a/probbit-cli/src/main.rs b/probbit-cli/src/main.rs index 1ff9407..51dd6ca 100644 --- a/probbit-cli/src/main.rs +++ b/probbit-cli/src/main.rs @@ -247,7 +247,7 @@ const F_P_SEEDS: Flag = Flag { name: "--seeds", arg: "LIST", help: "the individu const F_P_THREADS: Flag = Flag { name: "--threads", arg: "N", help: "search threads, 1 to 1024 (default: the logical CPUs)" }; const F_P_JSON: Flag = Flag { name: "--json", arg: "", help: "the JSON document instead of the readable report" }; const EXIT_PERSONA: &str = "0 done (every turn status, refusals and fallbacks included, is an answer; fuzz: no counterexample found; prove: every rule held or proved), 1 lint found an unresolved contradiction or (with rules) a counterexample, fuzz found a counterexample or prove left a rule unknown, 2 bad persona / state / inputs / script / rule (one {\"error\"} object on stdout, code \"persona\", when stdout is not a terminal or with --json) or bad flag (stderr), 3 lint (with rules): a rule the bound leaves unknown and the search cannot break (\"unproven\", not broken)."; -const EXIT_LIVE: &str = "0 done (live: every event answered; verify: every line replays; control: the line appended), 1 verify: a line differs (its number and what), 2 a bad persona, state, event (one {\"error\"} object on stdout per bad event when stdout is not a terminal or with --json; the run goes on), control line or flag, 4 refused: the strand's writer lock is held by another writer, or the individual is paused or retired (one {\"error\"} object per refused event, as for 2; nothing is written)."; +const EXIT_LIVE: &str = "0 done (live: every event answered; verify: every line replays; control: the line appended), 1 verify: a line differs (its number and what) or, with --actions, a host action differs from its turn's released level, 2 a bad persona, state, event (one {\"error\"} object on stdout per bad event when stdout is not a terminal or with --json; the run goes on), control line or flag, 4 refused: the strand's writer lock is held by another writer, or the individual is paused or retired (one {\"error\"} object per refused event, as for 2; nothing is written)."; pub(crate) static COMMANDS: &[Command] = &[ Command { name: "persona", aliases: &[], group: "persona", summary: "the individuality layer: persona + state + inputs -> one stance", usage: &["persona SUB PERSONA [flags] (SUB: init turn replay explain diff lint fuzz prove check compile describe)"], @@ -297,7 +297,7 @@ pub(crate) static COMMANDS: &[Command] = &[ Command { name: "live", aliases: &[], group: "live", summary: "a resident individual: JSONL events in, one stance per event out", usage: &["live PERSONA [--seed N | --state FILE] [--strand FILE] [--events FILE [--watch]] [--clock real|fixed] [--checkpoint-every K]", "live PERSONA --demo week [--seed N] [--strand FILE] [--plain]", - "live verify STRAND [--from-checkpoint]", + "live verify STRAND [--from-checkpoint] [--actions FILE]", "live control STRAND pause|resume|retire --by WHO --reason TEXT [--at TIME]"], about: "A resident individual (docs/persona.md §5.7): JSONL events (one object of inputs per line) from --events FILE or stdin, one stance per event on stdout (canonical JSON). The clock stamps each event's elapsed_hours (quantised to 1e-6 h), so moods decay by their half-lives between events; feedback moves the learned deltas of a persona with a learning block (§2.8).\n--strand FILE logs the life: a header (persona document, initial state, engine version), then per event the inputs as used, the stance and state digests and the sha256 of the line before. `probbit live verify STRAND` replays it.", before: &[], @@ -313,8 +313,9 @@ pub(crate) static COMMANDS: &[Command] = &[ Flag { name: "--checkpoint-every", arg: "K", help: "with --strand: a checkpoint line (the whole state) after every K-th event (default 1000; 0: none); `verify --from-checkpoint` and `monitor` start at the last one" }, ]], subs: &[ - Sub { name: "verify", args: "STRAND [--from-checkpoint]", help: "replay a strand: the earliest line that differs; from the header (every checkpoint checked), or from the last checkpoint", - flags: &[Flag { name: "--from-checkpoint", arg: "", help: "start at the last checkpoint instead of the header" }] }, + Sub { name: "verify", args: "STRAND [--from-checkpoint] [--actions FILE]", help: "replay a strand: the earliest line that differs; from the header (every checkpoint checked), or from the last checkpoint; with --actions, also the earliest turn whose host action differs from the level its stance released", + flags: &[Flag { name: "--from-checkpoint", arg: "", help: "start at the last checkpoint instead of the header" }, + Flag { name: "--actions", arg: "FILE", help: "the host's action log, one {\"turn\": T, \"action\": {trait: level}} per line: compared with each turn's released levels (summary `actions`: checked, differs); exit 1 when one differs" }] }, Sub { name: "control", args: "STRAND pause|resume|retire --by WHO --reason TEXT [--at TIME]", help: "pause, resume or retire an individual; appends a control line under the lock: while paused or retired every event is refused (exit 4); no credit crosses a control line; retire is final; `verify` replays them and reports the status", flags: &[Flag { name: "--by", arg: "WHO", help: "who decided it: human:ID or env:ID (required)" }, @@ -771,7 +772,7 @@ fn fuzz_cmd(args: &[String], path: &str, p: &persona::Persona, eng: fuzz::SyncEn if res.iter().any(|per| per.iter().any(Option::is_some)) { std::process::exit(1) } } /// `probbit live PERSONA [--seed N | --state FILE] [--strand FILE] [--events FILE [--watch]] [--clock real|fixed] [--checkpoint-every K]`; -/// `probbit live PERSONA --demo week`; `probbit live verify STRAND [--from-checkpoint]`; `probbit live control STRAND pause|resume|retire --by WHO --reason TEXT` +/// `probbit live PERSONA --demo week`; `probbit live verify STRAND [--from-checkpoint] [--actions FILE]`; `probbit live control STRAND pause|resume|retire --by WHO --reason TEXT` fn live_cmd(args: &[String]) { let engine = persona_engine(); let eng: persona::Engine = &engine; let opt = |f: &str| -> Option { args.iter().position(|x| x == f).and_then(|k| args.get(k + 1)).cloned() }; @@ -782,6 +783,19 @@ fn live_cmd(args: &[String]) { let mut a = vec!["live verify".to_string()]; a.extend(args.iter().skip(3).cloned()); let (v, w) = sub_flags("live", "verify").unwrap(); check_flags(&a, &v, &w); let Some(path) = args.get(2).filter(|a| !a.starts_with("--")) else { fail("live verify: the strand file: probbit live verify STRAND") }; let text = std::fs::read_to_string(path).unwrap_or_else(|e| fail(&format!("live verify: cannot read {path}: {e}"))); + // --actions (docs/persona.md §5.7): the host's action log against the released levels, replayed from the header + if let Some(af) = opt("--actions") { + if args.iter().any(|a| a == "--from-checkpoint") { fail("live verify: --actions replays from the header: drop --from-checkpoint") } + let at = std::fs::read_to_string(&af).unwrap_or_else(|e| fail(&format!("live verify: cannot read {af}: {e}"))); + let acts = live::read_actions(&at).unwrap_or_else(|e| bad_input("live verify: ", e)); + let turns: Vec = acts.iter().map(|a| a.turn).collect(); + match live::verify_keep(&text, eng, &turns) { + Ok((mut doc, kept, p)) => { let (checked, d) = live::first_difference(&p, &acts, &kept).unwrap_or_else(|e| bad_input("live verify: ", e)); let differs = d.is_some(); + if let Json::Obj(v) = &mut doc { v.push(("actions".into(), obj(vec![("checked", num(checked as f64)), ("differs", d.unwrap_or(Json::Null))]))); } + emit(&persona::canon(&doc)); if differs { std::process::exit(1) } } + Err((line, why)) => { emit(&persona::canon(&obj(vec![("ok", Json::Bool(false)), ("line", num(line as f64)), ("diverges", jstr(&why))]))); std::process::exit(1) } } + return; + } let res = if args.iter().any(|a| a == "--from-checkpoint") { live::verify_from_checkpoint(&text, eng) } else { live::verify(&text, eng) }; match res { Ok(doc) => emit(&persona::canon(&doc)), @@ -831,12 +845,15 @@ fn live_cmd(args: &[String]) { if !lock.as_ref().is_some_and(live::Lock::held) { refuse("live: ", json::InErr { code: "locked", path: "strand".into(), msg: format!("the writer lock {f}.lock is no longer this run's (removed or taken over): stopped before writing") }) } live::append(f, ls).unwrap_or_else(|e| fail(&format!("live: {}", e.msg))) }; if let Some(h) = &header { log(&[h]); } - let (mut bad, mut refused, mut warned) = (0, 0, false); + let (mut bad, mut refused, mut warned, mut warned_credit) = (0, 0, false, false); let mut one = |lv: &mut live::Live, i: usize, t: &str| { let res = json::parse(t).map_err(|e| persona::perr("event", format!("not JSON: {}", e.msg))).and_then(|ev| { // readings sent to a persona without a senses block are an undeclared input (listed in `ignored`): say so once if !warned && !lv.p.has_senses() && ev.get("senses").is_some() { warned = true; err_line(&format!("probbit: live: events[{i}]: this persona has no senses block: `senses` is an undeclared input (listed in ignored), no reading is judged")); } + // so are `await`, `for` and `cancel` without a credit block (docs/persona.md §2.8): say so once + if !warned_credit && !lv.p.has_credit() && ["await", "for", "cancel"].iter().any(|k| ev.get(k).is_some()) { warned_credit = true; + err_line(&format!("probbit: live: events[{i}]: this persona has no credit block: `await`, `for` and `cancel` are undeclared inputs (listed in ignored), feedback pays the previous stance")); } lv.event(&ev, eng) }); match res { Ok((stance, line)) => { let cp = (strand.is_some() && every > 0 && lv.n % every == 0).then(|| lv.checkpoint(&stance)); @@ -1115,7 +1132,7 @@ mod table_tests { let (v, w) = sub_flags("persona", "fuzz").unwrap(); assert!(v.contains(&"--fixture-src") && w.contains(&"--json") && w.contains(&"--pretty")); let (v, w) = flags_of("monitor"); assert!(v.contains(&"--port") && w.contains(&"--demo"), "--demo takes an optional value: parsed as a switch"); assert!(sub_flags("persona", "lnt").is_none()); - assert_eq!(sub_flags("live", "verify").unwrap(), (vec![], vec!["--from-checkpoint"]), "live's own flags are not verify's"); + assert_eq!(sub_flags("live", "verify").unwrap(), (vec!["--actions"], vec!["--from-checkpoint"]), "live's own flags are not verify's"); for c in COMMANDS { let (v, w) = flags_of(c.name); assert_eq!(v.len() + w.len(), c.flags().count(), "{}", c.name); } } #[test] diff --git a/probbit-cli/src/mcp.rs b/probbit-cli/src/mcp.rs index a85be05..93f067d 100644 --- a/probbit-cli/src/mcp.rs +++ b/probbit-cli/src/mcp.rs @@ -151,8 +151,9 @@ fn call(name: &str, args: Option<&Json>) -> Result<(String, Option, bool), fn persona_tool(name: &str, args: &[(String, Json)]) -> (String, Option, bool) { let t0 = std::time::Instant::now(); let eng = crate::persona_engine(); - // readings never come through the agent's channel (docs/persona.md §2.11, S7) - let r = if name == "probbit_persona_turn" { crate::persona::mcp_refuses_readings(args, "inputs") } else { Ok(()) }.and_then(|_| crate::persona::tool(name, args, &eng, true)); + // readings (docs/persona.md §2.11, S7) and cancels (§2.8) never come through the agent's channel + let r = if name == "probbit_persona_turn" { crate::persona::mcp_refuses_readings(args, "inputs").and_then(|_| crate::persona::mcp_refuses_cancel(args, "inputs")) } else { Ok(()) } + .and_then(|_| crate::persona::tool(name, args, &eng, true)); let (doc, is_error) = match r { Ok(d) => (d, false), Err(e) => (e.to_json(), true) }; log(&format!("tools/call {name} -> {}, {:.1} ms", if is_error { "error" } else { "ok" }, t0.elapsed().as_secs_f64() * 1e3)); (crate::persona::canon(&doc), Some(doc), is_error) @@ -171,7 +172,8 @@ fn fuzz_tool(args: &[(String, Json)]) -> (String, Option, bool) { fn live_tool(name: &str, args: &[(String, Json)]) -> (String, Option, bool) { let t0 = std::time::Instant::now(); let eng = crate::persona_engine(); - let r = if name == "probbit_live_event" { crate::persona::mcp_refuses_readings(args, "event") } else { Ok(()) }.and_then(|_| crate::live::tool(name, args, &eng)); + let r = if name == "probbit_live_event" { crate::persona::mcp_refuses_readings(args, "event").and_then(|_| crate::persona::mcp_refuses_cancel(args, "event")) } else { Ok(()) } + .and_then(|_| crate::live::tool(name, args, &eng)); let (doc, is_error) = match r { Ok(d) => (d, false), Err(e) => (e.to_json(), true) }; log(&format!("tools/call {name} -> {}, {:.1} ms", if is_error { "error" } else { "ok" }, t0.elapsed().as_secs_f64() * 1e3)); (crate::persona::canon(&doc), Some(doc), is_error) @@ -225,7 +227,7 @@ fn tools() -> Json { tool("probbit_persona_turn", "This turn's stance from a persona", "probbit persona turn: a persona (inline document or a file path), the individual's state and this turn's inputs (the persona's evidence: sentiment, error, loss, praise, criticism, stakes, time_pressure, claim_done, elapsed_hours, and the persona's own; `goals` for a persona with a drives block) -> {stance, state}. The stance has a level for every trait with exact odds, the mood, the habits in force and the ones that changed the stance (habits are hard rules: 0 violations by construction), status ok | partial | refused | fallback with an escalate reason, a one-line why, and `line`: a short stance line to put into the model's prompt (after any cached prefix). Pass the returned state back on the next turn. The persona never writes the reply; it decides how the reply is written.", p(&format!(r#"{{"type": "object", "additionalProperties": false, "required": ["state"], "properties": {{{PERSONA_ARG}, "state": {{"type": "object", "description": "the state returned by probbit_persona_init or by the previous probbit_persona_turn"}}, - "inputs": {{"type": "object", "description": "this turn's evidence, keyed by input id; flags true/false, level inputs a level name, numbers 0..max; inputs the persona does not declare are listed in stance.ignored", "properties": {{{GOALS_ARG}, {SENSES_ARG}}}, "additionalProperties": {{"type": ["boolean", "number", "string"]}}}}, + "inputs": {{"type": "object", "description": "this turn's evidence, keyed by input id; flags true/false, level inputs a level name, numbers 0..max; inputs the persona does not declare are listed in stance.ignored", "properties": {{{GOALS_ARG}, {SENSES_ARG}, {CREDIT_ARG}}}, "additionalProperties": {{"type": ["boolean", "number", "string"]}}}}, "flags": {{"type": "object", "additionalProperties": false, "properties": {{"timing": {{"type": "boolean", "description": "add a non-canonical timing object to the stance"}}, "no_inertia": {{"type": "boolean", "description": "ignore mood inertia for this turn (diagnostics)"}}}}}}}}}}"#))), tool("probbit_persona_fuzz", "Test a persona's character", "probbit persona fuzz: a persona (inline document or a file path) and a character property in habit syntax (never: {when, then}; or props: a list of them) -> for each individual (seeds, default 0-99) the shortest event script whose stance breaks it, shrunk, with the replay command; `found` says whether any did. It tests the stance a host gets, not the words a model writes; none found is evidence, not a proof. The document of probbit persona fuzz --json.", p(&format!(r#"{{"type": "object", "additionalProperties": false, "properties": {{{PERSONA_ARG}, @@ -240,7 +242,7 @@ fn tools() -> Json { p(&format!(r#"{{"type": "object", "additionalProperties": false, "properties": {{{PERSONA_ARG}, "state": {{"type": "object", "description": "the state returned by the previous event (or by probbit_persona_init); give this or seed"}}, "seed": {{"type": "integer", "minimum": 0, "description": "a new individual (default: the persona's identity.seed)"}}, - "event": {{"type": "object", "description": "the event's inputs keyed by input id, plus elapsed_hours (hours since the previous event, >= 0; default 0)", "properties": {{{GOALS_ARG}, {SENSES_ARG}}}, "additionalProperties": {{"type": ["boolean", "number", "string"]}}}}, + "event": {{"type": "object", "description": "the event's inputs keyed by input id, plus elapsed_hours (hours since the previous event, >= 0; default 0)", "properties": {{{GOALS_ARG}, {SENSES_ARG}, {CREDIT_ARG}}}, "additionalProperties": {{"type": ["boolean", "number", "string"]}}}}, "strand_path": {{"type": "string", "description": "a strand file on the server's disk to append the event's line to (created with its header if missing)"}}}}}}"#))), tool("probbit_live_verify", "Replay a strand", "probbit live verify: a strand (its text, or a file path on the server's disk) -> {ok: true, events, persona, seed, engine, final_state, last_line} when every line replays byte for byte from the header alone, else {ok: false, line, diverges} with the earliest line that differs and what (a changed input, a removed or reordered line, a changed header). A divergence is an answer, not a tool error.", p(r#"{"type": "object", "additionalProperties": false, "properties": {"strand": {"type": "string", "description": "the strand's text (header line, then one line per event)"}, "strand_path": {"type": "string", "description": "a strand file on the server's disk"}}}"#)), @@ -258,6 +260,12 @@ const GOALS_ARG: &str = r#""goals": {"type": "object", "description": "a persona /// `senses` in a turn's inputs or a live event: refused here for a persona with a senses block (readings come from the host's /// instruments, docs/persona.md 2.11, S7); a persona without one lists it in stance.ignored const SENSES_ARG: &str = r#""senses": {"type": "object", "description": "readings: refused through MCP for a persona with a senses block (the host sends them with probbit live or persona turn); a persona without one lists senses in stance.ignored"}"#; +/// `await`, `for` and `cancel` in a turn's inputs or a live event: a persona with a credit block reads them (docs/persona.md 2.8); +/// `cancel` is refused here for such a persona (the host or a person says no outcome will come, never the agent); a persona +/// without the block lists them in stance.ignored +const CREDIT_ARG: &str = r#""await": {"type": "boolean", "description": "a persona with a credit block: the host will report this decision's outcome"}, + "for": {"oneOf": [{"type": "integer", "minimum": 0}, {"type": "object", "additionalProperties": false, "required": ["turn", "stance"], "properties": {"turn": {"type": "integer", "minimum": 0}, "stance": {"type": "string", "description": "the paid stance's digest (its credit.stance)"}}}], "description": "a persona with a credit block: the turn of the decision this reward or correction pays"}, + "cancel": {"type": "array", "items": {"type": "integer", "minimum": 0}, "description": "refused through MCP for a persona with a credit block (the host sends it with probbit live or persona turn)"}"#; fn get_mut<'a>(j: &'a mut Json, k: &str) -> Option<&'a mut Json> { match j { Json::Obj(v) => v.iter_mut().find(|(x, _)| x == k).map(|(_, x)| x), _ => None } } /// `probbit_evaluate`'s input schema: the System One request (TypeSafe OpenAPI 0.2.0 and the Workers AI clef schema: `model`, /// `state`, `questions`, `images`) plus the `probbit` block, whose `rules` are the probbit-ir schema's own rule definitions. diff --git a/probbit-cli/src/monitor.html b/probbit-cli/src/monitor.html index 29eb648..59c1ccb 100644 --- a/probbit-cli/src/monitor.html +++ b/probbit-cli/src/monitor.html @@ -176,6 +176,9 @@ const bar=Array.from({length:12},(_,i)=>i===c?'●':i===t?'┃':'─').join(''),norm=x.kind==='flag'?'rate '+f2(mean):(x.scale==='log1p'?f2(Math.expm1(mean)):f2(mean))+' '+x.unit; fact(inputs,'Sense · '+(x.say||x.id),bar+' '+(r?'read '+JSON.stringify(r.raw)+' · z '+(r.z<0?'−':'+')+Math.abs(r.z).toFixed(1):'not read')+' · normal '+norm+' over '+(num(n)?n:0)+' readings'); if(num(nm.moved)&&nm.moved>x.drift_cap/2)fact(inputs,'⚠ Normal moved',(x.say||x.id)+': '+nm.moved+' within 50 events (over drift_cap / 2 = '+(x.drift_cap/2)+')');} + const cr=obj(d.credit);if(f.open)fact(inputs,'Open decisions',f.open.length?f.open.map(o=>o.turn+' (e '+f2(o.e)+')').join(' · '):'None'); + if(cr&&cr.paid)fact(inputs,'Paid',`turn ${cr.paid.turn} · e ${f2(cr.paid.e)} · sign ${cr.paid.sign}`+(cr.paid.absorbed?' · absorbed':'')); + if(cr&&cr.closed?.length)fact(inputs,'Closed',cr.closed.map(x=>x.turn+' '+x.as).join(' · ')); const habits=$('habit-list');habits.replaceChildren();const hb=d.habits||{},active=hb.active||[],bound=hb.bound||[]; for(const name of active)mk('span','chip'+(bound.includes(name)?' on':''),habits,name+(bound.includes(name)?' · bound':'')); if(!active.length)mk('span','chip',habits,'No rules in force');mk('span','chip',habits,'Violations: '+(num(hb.violations)?hb.violations:'unreported')); diff --git a/probbit-cli/src/monitor.rs b/probbit-cli/src/monitor.rs index 1c34877..ff8fbf9 100644 --- a/probbit-cli/src/monitor.rs +++ b/probbit-cli/src/monitor.rs @@ -5,7 +5,8 @@ //! with a sparkline of the last 50 events, the inputs (the event's inputs and the history features), the senses when the //! persona declares them (§2.11: per sense its normal as a tick over the range, the reading, z and n, and an alert when a //! normal moved over drift_cap / 2 within 50 events), the habits in force and the ones that bound, the learned deltas, the -//! drives when the documents carry them (feature-detected), and the stance line. +//! decisions awaiting an outcome with their eligibility (§2.8, with a credit block), the drives when the documents carry them +//! (feature-detected), and the stance line. //! `--serve` draws the same in a browser: one page embedded in the binary, fed by server-sent events from a server on //! 127.0.0.1. It changes no file (the demo's week goes through a temporary one, removed at once) and sends nothing anywhere. use crate::json::{self, Json}; @@ -310,6 +311,18 @@ fn frame(w: Option<&Watch>, bad_head: Option<&(usize, String)>, path: &str, note out.push(format!("{}{t:>().join(" ") }; + let mut row = format!("{}{} {ol}", lab("CREDIT"), s.paint(GREY, "open")); + if let Some(pd) = c.get("paid").filter(|x| !x.is_null()) { let g = |k: &str| pd.get(k).and_then(Json::as_f64).unwrap_or(0.0); + row += &format!(" {dot} {}", s.bold(CYAN, &format!("paid {} e {:.2} sign {}{}", whole(g("turn")), g("e"), whole(g("sign")), if pd.get("absorbed") == Some(&Json::Bool(true)) { " absorbed" } else { "" }))); } + let closed: Vec = c.get("closed").and_then(Json::as_arr).map_or(vec![], |a| a.iter().map(|x| format!("{} {}", x.get("turn").and_then(Json::as_f64).map_or(String::new(), whole), x.get("as").and_then(Json::as_str).unwrap_or(""))).collect()); + if !closed.is_empty() { row += &format!(" {dot} {} {}", s.paint(GREY, "closed"), closed.join(", ")); } + out.push(row); + } // 6. the drives, when the document carries them (feature-detected: documents without them draw no row) out.extend(drives(doc, m, s, idw, &lab)); // 7. the line, and why @@ -407,6 +420,10 @@ fn frame_json(w: Option<&Watch>, bad_head: Option<&(usize, String)>, note: Optio kv.push(("normals", Json::Arr(persona::normals(&w.rep.live.p, &w.rep.live.st).iter().enumerate().map(|(k, (id, mean, n, _))| json::obj(vec![("id", json::str(id)), ("mean", json::num(*mean)), ("n", json::num(*n as f64)), ("moved", json::num(moved.get(k).copied().unwrap_or(0.0)))])).collect()))); } + // the open decisions now (§2.8), only with a credit block: each turn and the eligibility a payment at the next event would get + if let Some(o) = w.and_then(|w| persona::open_decisions(&w.rep.live.p, &w.rep.live.st)) { + kv.push(("open", Json::Arr(o.iter().map(|(t, e)| json::obj(vec![("turn", json::num(*t as f64)), ("e", json::num(*e))])).collect()))); + } json::obj(kv) } diff --git a/probbit-cli/src/persona.rs b/probbit-cli/src/persona.rs index ece0d6a..f05702c 100644 --- a/probbit-cli/src/persona.rs +++ b/probbit-cli/src/persona.rs @@ -133,9 +133,13 @@ struct Habit { id: String, when: Vec<(String, Json)>, then: Vec<(String, Json)>, #[derive(Clone)] struct Eng { op: String, sweeps: usize, polish_sweeps: usize, exact_limit: u64, chains: usize, twin: bool, positional: bool, yields: bool } /// bounded learning (docs/persona.md §2.8): `from` = the reward flag, then (optional) the correction flag; the traits whose learned -/// deltas move; the step and total caps (natural-log weights) +/// deltas move; the step and total caps (natural-log weights); `credit` = action-addressed feedback, when declared #[derive(Clone)] -struct Learning { from: Vec, traits: Vec, rate: f64, step_cap: f64, total_cap: f64 } +struct Learning { from: Vec, traits: Vec, rate: f64, step_cap: f64, total_cap: f64, credit: Option } +/// `learning.credit` (§2.8): at most `max_open` decisions await an outcome; a payment's eligibility halves per `half_life_events` +/// of delay, and an open decision expires after 4 half-lives +#[derive(Clone)] +struct Credit { max_open: usize, half_life: f64 } /// Learned deltas or credits: per learned trait, one number per level (in `learning.traits` order) type Table = Vec<(String, Vec)>; #[derive(Clone)] @@ -147,6 +151,10 @@ impl Persona { fn why_past(&self) -> bool { self.why_past.unwrap_or(self.senses.is_some()) } /// A senses block (§2.11) pub fn has_senses(&self) -> bool { self.senses.is_some() } + /// A `learning.credit` block (§2.8) + fn credit(&self) -> Option<&Credit> { self.learning.as_ref().and_then(|l| l.credit.as_ref()) } + /// A `learning.credit` block (§2.8): `await`, `for` and `cancel` are read on every event + pub fn has_credit(&self) -> bool { self.credit().is_some() } fn var(&self, id: &str) -> Option<&Var> { self.vars.iter().find(|v| v.id == id) } fn input(&self, id: &str) -> Option<&Input> { self.inputs.iter().find(|x| x.id == id) } fn habit(&self, id: &str) -> &Habit { self.habits.iter().find(|h| h.id == id).expect("habit id") } @@ -408,9 +416,10 @@ fn habit_spec(hb: &Json, path: &str, inputs: &[Input], history: &[Hist], vars: & Ok(Habit { id, when, then, rules, say, priority }) } /// The `learning` block (docs/persona.md §2.8): `from` = 1-2 distinct flag inputs (the reward, then the correction), `traits` = -/// distinct trait ids (moods do not learn), `rate`, `step_cap` and `total_cap` positive, with step_cap <= total_cap <= 50 +/// distinct trait ids (moods do not learn), `rate`, `step_cap` and `total_cap` positive, with step_cap <= total_cap <= 50; `credit` +/// (optional): `max_open` a whole number 1-64 (default 8), `half_life_events` 1-10000 (default 32) fn learning_spec(l: &Json, vars: &[Var], inputs: &[Input]) -> R { - let kv = keys(l, "learning", &["from", "traits", "rate", "step_cap", "total_cap", "comment"], &["from", "traits", "rate", "step_cap", "total_cap"])?; + let kv = keys(l, "learning", &["from", "traits", "rate", "step_cap", "total_cap", "credit", "comment"], &["from", "traits", "rate", "step_cap", "total_cap"])?; let ids = |k: &str, max: usize, ok: &dyn Fn(&str) -> bool, what: &str| -> R> { let p = at("learning", k); let v = strs(get(kv, k).unwrap()).filter(|v| !v.is_empty() && v.len() <= max).ok_or_else(|| perr(&p, format!("a list of 1 to {max} ids")))?; for (i, x) in v.iter().enumerate() { need(ok(x), &ix(&p, i), what)?; need(!v[..i].contains(x), &ix(&p, i), "listed twice")?; } @@ -419,7 +428,10 @@ fn learning_spec(l: &Json, vars: &[Var], inputs: &[Input]) -> R { let traits = ids("traits", vars.len(), &|x| vars.iter().any(|v| v.id == x && !v.mood), "not a trait of this persona (moods do not learn)")?; let pos = |k: &str, hi: f64| -> R { let p = at("learning", k); let x = num(get(kv, k), &p, Some(0.0), Some(hi), false)?; need(x > 0.0, &p, "must be > 0")?; Ok(x) }; let (rate, total_cap) = (pos("rate", 50.0)?, pos("total_cap", 50.0)?); let step_cap = pos("step_cap", total_cap)?; - Ok(Learning { from, traits, rate, step_cap, total_cap }) + let credit = match get(kv, "credit") { None | Some(Json::Null) => None, Some(c) => { let ck = keys(c, "learning.credit", &["max_open", "half_life_events", "comment"], &[])?; + Some(Credit { max_open: num_or(ck, "max_open", 8.0, "learning.credit", Some(1.0), Some(64.0), true)? as usize, + half_life: num_or(ck, "half_life_events", 32.0, "learning.credit", Some(1.0), Some(10000.0), false)? }) } }; + Ok(Learning { from, traits, rate, step_cap, total_cap, credit }) } /// `reward_from` (docs/persona.md §2.10): the sources a reward-bearing input may come from -> per reward-bearing input (`bearing`: /// the learning block's flags, then `goals..win` per goal of a drives block) its allowed source kinds (None = any). A list of @@ -470,10 +482,12 @@ pub fn check_provenance(p: &Persona, raw: &Json) -> R<()> { if let Some(rw) = &p.reward { provenance(rw, raw)?; } // readings (§2.11, S2): each one's source, its own or the event's, of a kind its sense reads from if let Some(sn) = &p.senses { src_form(raw)?; sense_step(sn, &SState::zero(&p.name, sn, p.seed), raw, get(raw, "src"), true)?; } + // a cancel (§2.8, B-R5) comes from env or a person + if p.credit().is_some() && get(raw, "cancel").is_some() { src_form(raw)?; cancel_src(get(raw, "src"))?; } Ok(()) } -/// A persona whose events need a source: rewards (`reward_from`) or readings (a senses block) -pub fn has_reward_sources(p: &Persona) -> bool { p.reward.is_some() || p.senses.is_some() } +/// A persona whose events need a source: rewards (`reward_from`), readings (a senses block) or cancels (a credit block) +pub fn has_reward_sources(p: &Persona) -> bool { p.reward.is_some() || p.senses.is_some() || p.credit().is_some() } fn check_cond(k: &str, c: &Json, path: &str, inputs: &[Input], history: &[Hist]) -> R<()> { let range = |c: &Json| -> R<()> { if let Json::Num(_) = c { return Ok(()); } let kv = c.as_obj().filter(|kv| !kv.is_empty() && kv.iter().all(|(k, _)| k == "at_least" || k == "at_most")).ok_or_else(|| perr(path, "a number (at least) or {at_least, at_most}"))?; @@ -800,14 +814,159 @@ fn prep(p: &Persona, st: &State, raw: &[(String, Json)], src: Option<&Json>, che let ns = drive_step(d, ds, &x)?; let host = host_inputs(d, &ns, &drive_ctx(d, &ns), &x)?; s2.drives = Some(ns); Ok((s2, host)) } -/// An event's `src`, read (not compiled) with `reward_from` or a senses block: checked (`check`), taken out of the inputs and -/// returned; without either it stays an undeclared input +/// An event's `src`, read (not compiled) with `reward_from`, a senses block or a credit block: checked (`check`), taken out of the +/// inputs and returned; without any of them it stays an undeclared input fn take_src(p: &Persona, raw: Vec<(String, Json)>, check: bool) -> R<(Option, Vec<(String, Json)>)> { - if p.reward.is_none() && p.senses.is_none() { return Ok((None, raw)); } + if p.reward.is_none() && p.senses.is_none() && p.credit().is_none() { return Ok((None, raw)); } if check { match &p.reward { Some(rw) => provenance(rw, &raw)?, None => src_form(&raw)? } } let src = get(&raw, "src").cloned(); Ok((src, raw.into_iter().filter(|(k, _)| k != "src").collect())) } + +// ------------------------------------------------------------------------------------- action-addressed feedback (§2.8) +/// The event keys of a credit block, read (not compiled): `await` (the host will report this decision's outcome), `for` (the +/// decision a reward or correction pays: a turn, or {turn, stance} with the paid stance's digest) and `cancel` (the open decisions +/// no outcome will come for); `given` = the keys as given, echoed in the stance's inputs +#[derive(Default)] +struct Pay { wait: bool, pays: Option<(u64, Option)>, cancel: Option>, given: Vec<(String, Json)> } +const PAY_KEYS: [&str; 3] = ["await", "for", "cancel"]; +/// "sha256:" and 64 lower-case hex digits +fn is_digest(s: &str) -> bool { s.len() == 71 && s.starts_with("sha256:") && s[7..].bytes().all(|c| c.is_ascii_digit() || (b'a'..=b'f').contains(&c)) } +/// A stance's digest (§2.8): sha256 of the stance document's canonical JSON without `credit`, `state_digest` and `timing`. The +/// state remembers it (an open decision's, the previous stance's) without hashing itself, and `for: {turn, stance}` binds it. +pub fn stance_digest(doc: &Json) -> String { + match doc { Json::Obj(v) => sha(&Json::Obj(v.iter().filter(|(k, _)| !["credit", "state_digest", "timing"].contains(&k.as_str())).cloned().collect())), _ => sha(doc) } +} +/// With a credit block: `await`, `for` and `cancel` taken out of the inputs and read (B-R5: a malformed value refuses the event); +/// without one they stay undeclared inputs (listed in `ignored`) +fn take_pay(p: &Persona, raw: Vec<(String, Json)>) -> R<(Option, Vec<(String, Json)>)> { + let Some(c) = p.credit() else { return Ok((None, raw)) }; + let whole = |x: &Json| x.as_f64().filter(|v| *v >= 0.0 && v.fract() == 0.0 && *v <= 9_007_199_254_740_992.0).map(|v| v as u64); + let list = format!("a list of at most {} turns (max_open), each a whole number >= 0", c.max_open); + let mut k = Pay::default(); + for (key, x) in raw.iter().filter(|(key, _)| PAY_KEYS.contains(&key.as_str())) { + match key.as_str() { + "await" => k.wait = match x { Json::Bool(b) => *b, _ => return Err(perr("inputs.await", "true | false (true: the host will report this decision's outcome)")) }, + "for" => k.pays = Some(match x { + Json::Obj(_) => { let o = keys(x, "inputs.for", &["turn", "stance"], &["turn", "stance"])?; + let n = whole(get(o, "turn").unwrap()).ok_or_else(|| perr("inputs.for.turn", "a turn: a whole number >= 0"))?; + let s = get(o, "stance").and_then(Json::as_str).filter(|s| is_digest(s)).ok_or_else(|| perr("inputs.for.stance", "the paid stance's digest (sha256:<64 hex>: its credit.stance)"))?; + (n, Some(s.to_string())) } + _ => (whole(x).ok_or_else(|| perr("inputs.for", "the decision this feedback pays: a turn (a whole number >= 0) or {turn, stance}"))?, None) }), + _ => { let a = x.as_arr().filter(|a| a.len() <= c.max_open).ok_or_else(|| perr("inputs.cancel", list.clone()))?; + k.cancel = Some(a.iter().enumerate().map(|(i, n)| whole(n).ok_or_else(|| perr(&ix("inputs.cancel", i), "a turn: a whole number >= 0"))).collect::>>()?); } } + k.given.push((key.clone(), x.clone())); } + Ok((Some(k), raw.into_iter().filter(|(key, _)| !PAY_KEYS.contains(&key.as_str())).collect())) +} +/// B-R5: a cancel says no outcome will come, so it comes from env or a person: never from the individual, the clock or nowhere +fn cancel_src(src: Option<&Json>) -> R<()> { + match src.and_then(Json::as_str).and_then(src_kind) { Some("env" | "human") => Ok(()), + _ => Err(perr("inputs.src", "a cancel needs a source: env[:id] or human[:id] (never the individual itself or the clock)")) } +} +/// What the credit step settled before compile, for the stance's `credit` object: the payment (turn, eligibility, sign, absorbed, +/// the paid stance's digest) and the decisions closed (by a control line, expired, cancelled, paid), in that order +struct Settled { paid: Option<(u64, f64, f64, bool, String)>, closed: Vec<(u64, &'static str)> } +/// The credit step (§2.8, RFC 0001 B.2), after the drive step and before compile; t = this turn. Open decisions with t − n − 1 >= +/// 4 x half_life_events expire, the cancels close theirs (B-R4 against the open set after expiry), then feedback (a learning flag +/// on, or with drives κ x surprise != 0) pays one decision: the one `for` names (an open one, or the previous stance t − 1), else +/// t − 1 when no other decision is open (B-R1, B-R2, B-R3; B-R6 for a digest-bound `for`). The paid credit (the open decision's, +/// or the state's for t − 1) and its eligibility e = 0.5^((t − n − 1) / half_life_events), 6 decimals, go to compile's learner. +/// Anything refused is refused whole, before any change. -> (the state compile reads, what was settled) +fn credit_step(p: &Persona, st: &State, host: &[(String, Json)], k: &Pay, src: Option<&Json>, check: bool) -> R<(State, Settled)> { + let (c, l) = (p.credit().unwrap(), p.learning.as_ref().unwrap()); let t = st.turn; + if k.cancel.is_some() && check { cancel_src(src)?; } + // feedback, read as compile reads it (the inputs are checked before it) + let (vals, _, _, _) = resolve_inputs(p, st, host)?; + let on = |id: &String| matches!(get(&vals, id), Some(Json::Bool(true))); + let flags = l.from.iter().enumerate().fold(0.0, |s, (i, id)| if on(id) { s + if i == 0 { 1.0 } else { -1.0 } } else { s }); + let ks = match (&p.drives, &st.drives) { (Some(d), Some(ds)) => Some(drive_ctx(d, ds).learn_sign), _ => None }; + let feedback = l.from.iter().any(on) || ks.is_some_and(|x| x != 0.0); + let sign = match ks { Some(x) => (flags + x).clamp(-1.0, 1.0), None => flags }; + // B-R3: `for` names the decision a reward or a correction pays + if k.pays.is_some() && !feedback { return Err(perr("inputs.for", "this event carries no feedback: `for` names the decision a reward or a correction pays")); } + let prev = t.checked_sub(1); + let paid = if feedback { k.pays.as_ref().map(|x| x.0).or(prev) } else { None }; + let turns = |o: &[Open]| if o.is_empty() { "none".to_string() } else { o.iter().map(|x| x.turn.to_string()).collect::>().join(", ") }; + // a control line's closures are reported now; then expiry, then the cancels (B-R4) against the open set after it + let mut ns = st.clone(); let mut closed: Vec<(u64, &'static str)> = ns.control_closed.drain(..).map(|n| (n, "control")).collect(); + let (keep, gone): (Vec, Vec) = ns.open.drain(..).partition(|o| (t.saturating_sub(o.turn + 1) as f64) < 4.0 * c.half_life); + closed.extend(gone.iter().map(|o| (o.turn, "expired"))); ns.open = keep; + let cancel = k.cancel.as_deref().unwrap_or(&[]); + for (i, n) in cancel.iter().enumerate() { let path = ix("inputs.cancel", i); + need(!cancel[..i].contains(n), &path, "listed twice")?; + need(paid != Some(*n), &path, &format!("turn {n} is the decision this event's feedback pays"))?; + need(ns.open.iter().any(|o| o.turn == *n), &path, &format!("turn {n} is not open (open: {})", turns(&ns.open)))?; } + for n in cancel { ns.open.retain(|o| o.turn != *n); closed.push((*n, "cancelled")); } + let Some(n) = paid else { return Ok((ns, Settled { paid: None, closed })) }; + // B-R1: without `for`, feedback pays the previous stance only while no other decision is open + if k.pays.is_none() { let others: Vec = ns.open.iter().filter(|o| Some(o.turn) != prev).cloned().collect(); + need(others.is_empty(), "inputs.for", &format!("feedback without `for` while other decisions are open ({}): name the decision it pays", turns(&others)))?; } + // B-R2: an open decision, or the previous stance + let (credit, digest) = match ns.open.iter().position(|o| o.turn == n) { + Some(i) => { let o = ns.open.remove(i); closed.push((n, "paid")); (o.credit, o.stance) } + None if Some(n) == prev => (st.credit.clone(), st.prev_stance.clone().unwrap_or_default()), + None => return Err(perr("inputs.for", format!("turn {n} is neither open nor the previous stance ({}): paid, cancelled, expired, evicted, never opened or still to come (open: {})", + prev.map_or("none".to_string(), |x| x.to_string()), turns(&ns.open)))) }; + // B-R6: a digest-bound `for` pays the stance it names + if let Some(s) = k.pays.as_ref().and_then(|x| x.1.as_ref()) { need(*s == digest, "inputs.for.stance", &format!("turn {n}'s stance is {digest}, not {s}"))?; } + let e = if Some(n) == prev { 1.0 } else { r6(0.5f64.powf((t - n - 1) as f64 / c.half_life)) }; + let absorbed = credit.iter().all(|(_, v)| v.iter().all(|x| *x == 0.0)); + ns.credit = credit; ns.elig = e; + Ok((ns, Settled { paid: Some((n, e, sign, absorbed, digest)), closed })) +} +/// After the turn (§2.8): the keys echoed in the stance's inputs, its `credit` object (paid, closed, open, this stance's digest), +/// an awaited decision opened (beyond max_open the oldest is evicted), the state remembering this stance's digest +fn settle(p: &Persona, j: &mut Json, mut ns: State, k: &Pay, s: Settled) -> State { + let c = p.credit().unwrap(); let t = ns.turn - 1; + let Json::Obj(v) = j else { return ns }; + if let Some((_, Json::Obj(ins))) = v.iter_mut().find(|(key, _)| key == "inputs") { ins.extend(k.given.iter().cloned()); } + let digest = stance_digest(&Json::Obj(v.clone())); let mut closed = s.closed; + if k.wait { ns.open.push(Open { turn: t, credit: ns.credit.clone(), stance: digest.clone() }); + while ns.open.len() > c.max_open { closed.push((ns.open.remove(0).turn, "evicted")); } } + ns.prev_stance = Some(digest.clone()); ns.elig = 1.0; ns.seal(p); + let n = |x: u64| Json::Num(x as f64); + let paid = s.paid.map_or(Json::Null, |(turn, e, sign, absorbed, stance)| Json::Obj(vec![("turn".into(), n(turn)), ("e".into(), Json::Num(e)), ("sign".into(), Json::Num(sign)), + ("absorbed".into(), Json::Bool(absorbed)), ("stance".into(), Json::Str(stance))])); + v.push(("credit".into(), Json::Obj(vec![("paid".into(), paid), + ("closed".into(), Json::Arr(closed.iter().map(|(x, a)| Json::Obj(vec![("turn".into(), n(*x)), ("as".into(), Json::Str(a.to_string()))])).collect())), + ("open".into(), Json::Arr(ns.open.iter().map(|o| n(o.turn)).collect())), ("stance".into(), Json::Str(digest))]))); + if let Some((_, d)) = v.iter_mut().find(|(key, _)| key == "state_digest") { *d = Json::Str(ns.digest.clone()); } + ns +} +/// The fuzzer's payments (§2.8, a credit block only): `await`, then `for` and `cancel` as kinds that `resolve_payments` turns +/// into turns against the state an event runs on. -> (key, kinds) +pub fn payment_alphabet(p: &Persona) -> Vec<(String, Vec)> { + if p.credit().is_none() { return vec![]; } + let k = |v: &[&str]| v.iter().map(|x| Json::Str(x.to_string())).collect::>(); + vec![("await".into(), vec![Json::Bool(true)]), ("for".into(), k(&["late", "reordered", "previous", "closed", "unknown", "mismatch"])), ("cancel".into(), k(&["oldest", "unknown"]))] +} +/// A fuzz event's payment kinds resolved against the state it runs on: `for` names the oldest open decision (late), the newest +/// (reordered), the previous stance, a past turn no longer open (a duplicate, or a payment after a cancel or expiry), a turn to +/// come (unknown), or the oldest open decision bound to another stance's digest (mismatch); `cancel` the oldest open decision +/// or a turn to come. A kind with nothing to name is left out; every other input is as given. +pub fn resolve_payments(p: &Persona, st: &State, e: &[(String, Json)]) -> Vec<(String, Json)> { + if p.credit().is_none() { return e.to_vec(); } + let (t, open) = (st.turn, &st.open); let n = |x: u64| Json::Num(x as f64); + e.iter().filter_map(|(k, x)| { let kind = x.as_str().unwrap_or(""); + let v = match (k.as_str(), kind) { + ("for", "late") => open.first().map(|o| n(o.turn)), + ("for", "reordered") => open.last().filter(|_| open.len() > 1).map(|o| n(o.turn)), + ("for", "previous") => t.checked_sub(1).map(n), + ("for", "closed") => (0..t.saturating_sub(1)).rev().find(|x| !open.iter().any(|o| o.turn == *x)).map(n), + ("for", "unknown") | ("cancel", "unknown") => Some(if k == "for" { n(t + 3) } else { Json::Arr(vec![n(t + 5)]) }), + ("for", "mismatch") => open.first().map(|o| Json::Obj(vec![("turn".into(), n(o.turn)), ("stance".into(), Json::Str(format!("sha256:{}", "0".repeat(64))))])), + ("cancel", "oldest") => open.first().map(|o| Json::Arr(vec![n(o.turn)])), + _ => Some(x.clone()) }; + v.map(|v| (k.clone(), v)) }).collect() +} +/// Is `id` a learning block's reward or correction flag (§2.8)? +pub fn learning_flag(p: &Persona, id: &str) -> bool { p.learning.as_ref().is_some_and(|l| l.from.iter().any(|f| f == id)) } +/// The open decisions of a state with a credit block (§2.8): (turn, the eligibility a payment at the next turn would get); none +/// without one +pub fn open_decisions(p: &Persona, st: &State) -> Option> { + let c = p.credit()?; + Some(st.open.iter().map(|o| (o.turn, if o.turn + 1 == st.turn { 1.0 } else { r6(0.5f64.powf(st.turn.saturating_sub(o.turn + 1) as f64 / c.half_life)) })).collect()) +} /// The stance document of a drives turn: `pursue` leaves `stance` for its own object (goal, p, odds, released, say, the floor lift), /// `drives` = the values this turn used, `inputs` = the host's (the goals as given, the synthetic inputs left out) fn stance_drives(j: &mut Json, d: &Drives, ds: &DState, lift: &[(String, f64)], given: &[(String, Json)]) { @@ -1225,7 +1384,11 @@ fn values_of(p: &Persona) -> Vec { #[derive(Clone)] pub struct State { pub seed: u64, pub turn: u64, persona: [String; 3], genes: Json, mood: Vec<(String, Vec)>, history: Vec<(String, Vec)>, prev: HashMap, agenda: Option>, rest: Option>, learned: Table, credit: Table, drives: Option, senses: Option, - learned_from: Option>, pub digest: String } + learned_from: Option>, open: Vec, prev_stance: Option, control_closed: Vec, elig: f64, pub digest: String } +/// A decision awaiting its outcome (§2.8, `open_credit`): its turn, its credit (onehot(level) − odds per learned trait it released) +/// and its stance's digest +#[derive(Clone)] +struct Open { turn: u64, credit: Table, stance: String } /// `learned_from` (§2.11): per learned trait the feedback turns that moved it, (rewards, corrections), with a learning block and /// `line.why_past` on (None otherwise) fn learned_from0(p: &Persona) -> Option> { @@ -1235,14 +1398,15 @@ fn table(t: &Table) -> Json { Json::Obj(t.iter().map(|(k, v)| (k.clone(), Json:: /// A zero table over the learned traits (none without a learning block) fn zeros(p: &Persona) -> Table { p.learning.as_ref().map_or(vec![], |l| l.traits.iter().map(|t| (t.clone(), vec![0.0; p.var(t).unwrap().levels.len()])).collect()) } /// The learner (docs/persona.md §2.8). `sign` is this turn's feedback (+1 reward, -1 correction, 0 none: nothing moves); `credit` -/// is the previous stance's onehot(level) - odds per learned trait. The step sign · rate · credit is clipped to ±step_cap per -/// level and recentred to sum 0 (it moves weight between levels; zero credit moves nothing), added, and every delta is clipped to -/// ±total_cap. It returns nothing but the delta table, which compile adds to trait unaries: habits and allowed levels are not -/// reachable from here, so learning can never remove a rule. -fn learn(l: &Learning, credit: &Table, sign: f64, delta: &Table) -> Table { +/// is the paid stance's onehot(level) - odds per learned trait (the previous stance's without a credit block). The step sign · +/// rate · credit is clipped to ±step_cap per level, scaled by the payment's eligibility `e` (1 for the previous stance, so the +/// step is 0.8's) and recentred to sum 0 (it moves weight between levels; zero credit moves nothing), added, and every delta is +/// clipped to ±total_cap. It returns nothing but the delta table, which compile adds to trait unaries: habits and allowed levels +/// are not reachable from here, so learning can never remove a rule. +fn learn(l: &Learning, credit: &Table, sign: f64, e: f64, delta: &Table) -> Table { if sign == 0.0 { return delta.clone(); } delta.iter().zip(credit).map(|((t, d), (_, g))| { - let step: Vec = g.iter().map(|x| (sign * l.rate * x).clamp(-l.step_cap, l.step_cap)).collect(); + let step: Vec = g.iter().map(|x| e * (sign * l.rate * x).clamp(-l.step_cap, l.step_cap)).collect(); let mean = step.iter().fold(0.0, |a, b| a + b) / step.len() as f64; (t.clone(), d.iter().zip(&step).map(|(a, x)| r6((a + (x - mean)).clamp(-l.total_cap, l.total_cap))).collect()) }).collect() } @@ -1271,15 +1435,23 @@ impl State { if let (Some(sn), Some(ss)) = (&p.senses, &self.senses) { v.push(("senses".into(), ss.to_json(sn))); } if let Some(lf) = &self.learned_from { v.push(("learned_from".into(), Json::Obj(lf.iter().map(|(t, r, c)| (t.clone(), Json::Obj(vec![("rewards".into(), Json::Num(*r as f64)), ("corrections".into(), Json::Num(*c as f64))]))).collect()))); } + // a credit block (§2.8): the decisions awaiting an outcome, the previous stance's digest, the decisions a control line closed + if p.credit().is_some() { + v.push(("open_credit".into(), Json::Arr(self.open.iter().map(|o| Json::Obj(vec![("turn".into(), Json::Num(o.turn as f64)), ("credit".into(), table(&o.credit)), + ("stance".into(), Json::Str(o.stance.clone()))])).collect()))); + v.push(("prev_stance".into(), self.prev_stance.as_ref().map_or(Json::Null, |s| Json::Str(s.clone())))); + v.push(("control_closed".into(), Json::Arr(self.control_closed.iter().map(|t| Json::Num(*t as f64)).collect()))); } Json::Obj(v) } pub fn to_json(&self, p: &Persona) -> Json { let mut b = self.body(p); if let Json::Obj(v) = &mut b { v.push(("digest".into(), Json::Str(self.digest.clone()))); } b } fn seal(&mut self, p: &Persona) { self.digest = sha(&self.body(p)); } - /// This state with every credit 0 (a control line's, §5.7: feedback after it credits no stance before it); the same state - /// when there is no credit to clear (no learning block, or a stance that released no learned trait) + /// This state with every credit 0 and (a credit block, §2.8) every open decision closed: a control line's (§5.7), feedback + /// after it credits no stance before it; the next stance lists the closed decisions (as `control`). The same state when there + /// is nothing to clear (no learning block, or a stance that released no learned trait, and no decision open) pub fn zero_credit(&self, p: &Persona) -> State { - if self.credit.iter().all(|(_, c)| c.iter().all(|x| *x == 0.0)) { return self.clone(); } - let mut s = self.clone(); for (_, c) in s.credit.iter_mut() { c.iter_mut().for_each(|x| *x = 0.0); } s.seal(p); s + if self.credit.iter().all(|(_, c)| c.iter().all(|x| *x == 0.0)) && self.open.is_empty() { return self.clone(); } + let mut s = self.clone(); for (_, c) in s.credit.iter_mut() { c.iter_mut().for_each(|x| *x = 0.0); } + let closed: Vec = s.open.drain(..).map(|o| o.turn).collect(); s.control_closed.extend(closed); s.seal(p); s } /// A state document -> State, for this persona: the format, the persona digest, the state's own digest and the genes are /// checked (in that order), then every field's type (a well-formed state never fails those). @@ -1294,16 +1466,19 @@ impl State { need(p.senses.is_none() || get(kv, "senses").is_some(), "state.senses", "required with a senses block")?; let keeps_from = learned_from0(p).is_some(); need(!keeps_from || get(kv, "learned_from").is_some(), "state.learned_from", "required with a learning block and line.why_past")?; - const SK: [&str; 15] = ["probbit_persona_state", "persona", "seed", "turn", "genes", "mood", "history", "prev", "rest", "digest", "learned", "credit", "drives", "senses", "learned_from"]; + const SK: [&str; 18] = ["probbit_persona_state", "persona", "seed", "turn", "genes", "mood", "history", "prev", "rest", "digest", "learned", "credit", "drives", "senses", "learned_from", + "open_credit", "prev_stance", "control_closed"]; let mut sk: Vec<&str> = SK[..10].to_vec(); if p.learning.is_some() { sk.extend(&SK[10..12]); } if p.drives.is_some() { sk.push(SK[12]); } if p.senses.is_some() { sk.push(SK[13]); } if keeps_from { sk.push(SK[14]); } + if p.credit().is_some() { sk.extend(&SK[15..18]); for k in &SK[15..18] { need(get(kv, k).is_some(), &at("state", k), "required with a credit block")?; } } keys(j, "state", &sk, &["persona", "seed", "turn", "genes", "mood", "history", "prev", "digest"]) .map_err(|e| if e.msg.starts_with("unknown field") && (e.path == "state.learned" || e.path == "state.credit") { perr(&e.path, "this persona has no learning block") } else if e.msg.starts_with("unknown field") && e.path == "state.drives" { perr(&e.path, "this persona has no drives block") } else if e.msg.starts_with("unknown field") && e.path == "state.senses" { perr(&e.path, "this persona has no senses block") } + else if e.msg.starts_with("unknown field") && ["state.open_credit", "state.prev_stance", "state.control_closed"].contains(&e.path.as_str()) { perr(&e.path, "this persona has no credit block (learning.credit)") } else if e.msg.starts_with("unknown field") && e.path == "state.learned_from" { perr(&e.path, "this persona keeps no learned_from (a learning block with line.why_past)") } else { e })?; let whole = |k: &str| num(get(kv, k), &at("state", k), Some(0.0), Some(9_007_199_254_740_992.0), true).map(|x| x as u64); let (seed, turn) = (whole("seed")?, whole("turn")?); @@ -1343,7 +1518,27 @@ impl State { Some(z.iter().map(|(t, _, _)| { let tp = at("state.learned_from", t); let e = keys(get(o, t).ok_or_else(|| perr(&tp, "required"))?, &tp, &["rewards", "corrections"], &["rewards", "corrections"])?; let w = |k: &str| num(get(e, k), &at(&tp, k), Some(0.0), Some(9_007_199_254_740_992.0), true).map(|x| x as u64); Ok((t.clone(), w("rewards")?, w("corrections")?)) }).collect::>>()?) } }; - Ok(State { seed, turn, persona, genes: g.clone(), mood, history, prev, agenda, rest, learned, credit, drives, senses, learned_from, digest: get(kv, "digest").and_then(Json::as_str).unwrap_or("").to_string() }) + // a credit block (§2.8): at most max_open open decisions, turns increasing and before this state's turn, credits within ±1, a + // stance digest each; the previous stance's digest (null before any turn); the decisions a control line closed + let (mut open, mut prev_stance, mut control_closed) = (vec![], None, vec![]); + if let (Some(c), Some(l)) = (p.credit(), &p.learning) { + let turn_at = |x: &Json, path: &str, after: Option| -> R { let n = num(Some(x), path, Some(0.0), Some(9_007_199_254_740_992.0), true)? as u64; + need(n < turn, path, "a turn before this state's turn")?; need(after.map_or(true, |a| n > a), path, "turns increasing")?; Ok(n) }; + let oa = get(kv, "open_credit").and_then(Json::as_arr).filter(|a| a.len() <= c.max_open).ok_or_else(|| perr("state.open_credit", format!("a list of at most {} open decisions (max_open)", c.max_open)))?; + for (i, o) in oa.iter().enumerate() { let op = ix("state.open_credit", i); let ok = keys(o, &op, &["turn", "credit", "stance"], &["turn", "credit", "stance"])?; + let n = turn_at(get(ok, "turn").unwrap(), &at(&op, "turn"), open.last().map(|x: &Open| x.turn))?; + let cp = at(&op, "credit"); let co = get(ok, "credit").and_then(Json::as_obj).filter(|o| o.len() == l.traits.len()).ok_or_else(|| perr(&cp, "one entry per learned trait"))?; + let credit = l.traits.iter().map(|t| { let lv = p.var(t).unwrap().levels.len(); + let a = get(co, t).and_then(Json::as_arr).filter(|a| a.len() == lv && a.iter().all(|x| x.as_f64().is_some_and(|x| x.abs() <= 1.0 + 5e-7))).ok_or_else(|| perr(&at(&cp, t), "one number per level, each within ±1"))?; + Ok((t.clone(), a.iter().map(|x| x.as_f64().unwrap()).collect())) }).collect::>()?; + let stance = get(ok, "stance").and_then(Json::as_str).filter(|s| is_digest(s)).ok_or_else(|| perr(&at(&op, "stance"), "a stance digest (sha256:<64 hex>)"))?.to_string(); + open.push(Open { turn: n, credit, stance }); } + prev_stance = match get(kv, "prev_stance").unwrap() { Json::Null if turn == 0 => None, Json::Str(s) if turn > 0 && is_digest(s) => Some(s.clone()), + _ => return Err(perr("state.prev_stance", "the previous stance's digest (sha256:<64 hex>); null before any turn")) }; + let ca = get(kv, "control_closed").and_then(Json::as_arr).filter(|a| a.len() <= c.max_open).ok_or_else(|| perr("state.control_closed", format!("a list of at most {} turns", c.max_open)))?; + for (i, x) in ca.iter().enumerate() { let n = turn_at(x, &ix("state.control_closed", i), control_closed.last().copied())?; control_closed.push(n); } } + Ok(State { seed, turn, persona, genes: g.clone(), mood, history, prev, agenda, rest, learned, credit, drives, senses, learned_from, open, prev_stance, control_closed, elig: 1.0, + digest: get(kv, "digest").and_then(Json::as_str).unwrap_or("").to_string() }) } } @@ -1421,7 +1616,7 @@ fn compile(p: &Persona, st: &State, raw: &[(String, Json)], o: &Opts) -> R<(Json let new_learned = match &p.learning { None => vec![], Some(l) => { let sign = l.from.iter().enumerate().fold(0.0, |s, (i, id)| if matches!(get(&vals, id), Some(Json::Bool(true))) { s + if i == 0 { 1.0 } else { -1.0 } } else { s }); let sign = match &dctx { Some(c) => (sign + c.learn_sign).clamp(-1.0, 1.0), None => sign }; learn_sign = sign; - learn(l, &st.credit, sign, &st.learned) } }; + learn(l, &st.credit, sign, st.elig, &st.learned) } }; for (i, v) in p.vars.iter().enumerate() { contrib[i].push(("prior".into(), v.base.clone())); if let Some(g) = st.shift(&v.id) { contrib[i].push(("genes".into(), centered(v.levels.len()).iter().map(|c| g * c).collect())); } if let Some((_, d)) = new_learned.iter().find(|(t, d)| *t == v.id && d.iter().any(|x| *x != 0.0)) { contrib[i].push(("learned".into(), d.clone())); } } @@ -1729,9 +1924,14 @@ fn turn_src(p: &Persona, st: &State, raw: &Json, no_inertia: bool, eng: Engine, // reward provenance (§2.10), first: with `reward_from` (or a senses block, §2.11), `src` is read here (not compiled, so not // `ignored`) and comes back in the stance's inputs; without either `src` is an undeclared input as before let (src, raw) = take_src(p, raw, check)?; + // with a credit block (§2.8) `await`, `for` and `cancel` are read here too (not compiled, so not `ignored`) and come back in + // the stance's inputs + let (pay, raw) = take_pay(p, raw)?; // a senses block steps the normals and a drives block the drives before the turn, which runs on the stepped state with the - // lowering's inputs - let given = raw; let (st2, raw) = prep(p, st, &given, src.as_ref(), check)?; let st = &st2; + // lowering's inputs; then the credit step settles what this turn's feedback pays + let given = raw; let (st2, raw) = prep(p, st, &given, src.as_ref(), check)?; + let (st2, settled) = match &pay { Some(k) => { let (s, d) = credit_step(p, &st2, &raw, k, src.as_ref(), check)?; (s, Some(d)) } None => (st2, None) }; + let st = &st2; let t0 = Instant::now(); let mut calls = 0; let o = Opts { no_inertia, ..Default::default() }; let (mut prog, mut meta) = compile(p, st, &raw, &o)?; let mut ptext = digest_of(&text(&prog)); @@ -1773,6 +1973,7 @@ fn turn_src(p: &Persona, st: &State, raw: &Json, no_inertia: bool, eng: Engine, if let (Some(sn), Some(ss)) = (&p.senses, &st.senses) { stance_senses(&mut j, sn, ss, &given); } if let (Some(d), Some(ds)) = (&p.drives, &st.drives) { stance_drives(&mut j, d, ds, &out.lift, &given); } if let (Some(s), Json::Obj(v)) = (src, &mut j) { if let Some((_, Json::Obj(ins))) = v.iter_mut().find(|(k, _)| k == "inputs") { ins.push(("src".into(), s)); } } + if let (Some(k), Some(d)) = (&pay, settled) { ns = settle(p, &mut j, ns, k, d); } Ok((j, ns)) } @@ -1789,7 +1990,7 @@ pub fn init(p: &Persona, seed: Option, rest: bool, eng: Engine) -> State { history: { let mut h: Vec<(String, Vec)> = vec![]; for x in &p.history { if !h.iter().any(|(k, _)| *k == x.of) { h.push((x.of.clone(), vec![])); } } h }, prev: p.vars.iter().map(|v| (v.id.clone(), v.fallback.clone())).collect(), agenda: (!p.steps.is_empty()).then(|| p.steps.clone()), rest: None, learned: zeros(p), credit: zeros(p), drives: p.drives.as_ref().map(|d| DState::zero(p, d, seed)), senses: p.senses.as_ref().map(|sn| SState::zero(&p.name, sn, seed)), - learned_from: learned_from0(p), digest: String::new() }; + learned_from: learned_from0(p), open: vec![], prev_stance: None, control_closed: vec![], elig: 1.0, digest: String::new() }; if rest { if let Ok((prog, _)) = compile(p, &st, &[], &Opts { twin: Some(false), ..Default::default() }) { let doc = eng(&prog, &flags(p, &st)); if let Some(plan) = doc.get("plan").and_then(Json::as_obj) { @@ -1837,6 +2038,17 @@ pub fn mcp_refuses_readings(args: &[(String, Json)], key: &str) -> R<()> { return Err(perr(&format!("arguments.{key}.senses"), "readings come from the host's instruments, never through the agent's channel: MCP refuses an event that carries readings (the host sends them with probbit live or persona turn)")); } Ok(()) } +/// §2.8: a cancel says no outcome will come for a decision, so an agent could cancel to dodge a correction: through the MCP tools +/// (the agent's own channel) an event that carries `cancel` is refused for a persona with a credit block; a persona without one +/// lists it in stance.ignored +pub fn mcp_refuses_cancel(args: &[(String, Json)], key: &str) -> R<()> { + let get = |k: &str| args.iter().find(|(x, _)| x == k).map(|(_, v)| v).filter(|v| !v.is_null()); + if get(key).and_then(|e| e.get("cancel")).is_none() { return Ok(()); } + let p = match (get("persona"), get("persona_path")) { (Some(d), None) => build(d).ok(), (None, Some(Json::Str(f))) => load(f).ok().map(|x| x.0), _ => None }; + if p.is_some_and(|p| p.credit().is_some()) { + return Err(perr(&format!("arguments.{key}.cancel"), "a cancel comes from the host or a person, never through the agent's channel: MCP refuses an event that carries cancel (the host sends it with probbit live or persona turn)")); } + Ok(()) +} /// `init` at `seed`, then every turn of the script -> (the stance documents, the final state) pub fn replay(p: &Persona, seed: Option, turns: &[Json], no_inertia: bool, eng: Engine, timing: bool) -> R<(Vec, State)> { let mut st = init(p, seed, true, eng); let mut out = vec![]; @@ -1846,8 +2058,10 @@ pub fn replay(p: &Persona, seed: Option, turns: &[Json], no_inertia: bool, /// `compile`: the turn's program (insertion order; its sha256 is the stance's `engine.program`) pub fn program(p: &Persona, st: &State, raw: &Json) -> R { let raw: Vec<(String, Json)> = match raw { Json::Null => vec![], Json::Obj(v) => v.clone(), _ => return Err(perr("inputs", "must be a JSON object")) }; - let (src, raw) = if p.senses.is_some() { take_src(p, raw, true)? } else { (None, raw) }; + let (src, raw) = if p.senses.is_some() || p.credit().is_some() { take_src(p, raw, true)? } else { (None, raw) }; + let (pay, raw) = take_pay(p, raw)?; let (st, raw) = prep(p, st, &raw, src.as_ref(), true)?; + let st = match &pay { Some(k) => credit_step(p, &st, &raw, k, src.as_ref(), true)?.0, None => st }; Ok(text(&compile(p, &st, &raw, &Opts::default())?.0)) } @@ -2017,9 +2231,13 @@ pub fn describe(p: &Persona) -> Json { ("inputs".into(), Json::Obj(p.inputs.iter().filter(|x| !lowered(p, &x.id)).map(|x| (x.id.clone(), Json::Obj(match x.kind { Kind::Level => vec![("kind".into(), s("level")), ("levels".into(), jstrs(&x.levels))], Kind::Flag => vec![("kind".into(), s("flag"))], Kind::Number => vec![("kind".into(), s("number"))] }))).collect())), ("habits".into(), Json::Arr(p.habits.iter().map(|h| s(&h.id)).collect())), ("agenda".into(), jstrs(&p.steps))]); - // the learning block (§2.8), when there is one: what moves the learned deltas, which traits, and the caps - if let (Json::Obj(v), Some(l)) = (&mut d, &p.learning) { v.push(("learning".into(), Json::Obj(vec![("from".into(), jstrs(&l.from)), ("traits".into(), jstrs(&l.traits)), - ("rate".into(), Json::Num(l.rate)), ("step_cap".into(), Json::Num(l.step_cap)), ("total_cap".into(), Json::Num(l.total_cap))]))); } + // the learning block (§2.8), when there is one: what moves the learned deltas, which traits, and the caps; the credit block's + // settings when declared + if let (Json::Obj(v), Some(l)) = (&mut d, &p.learning) { let mut lv = vec![("from".into(), jstrs(&l.from)), ("traits".into(), jstrs(&l.traits)), + ("rate".into(), Json::Num(l.rate)), ("step_cap".into(), Json::Num(l.step_cap)), ("total_cap".into(), Json::Num(l.total_cap))]; + if let Some(c) = &l.credit { lv.push(("credit".into(), Json::Obj(vec![("max_open".into(), Json::Num(c.max_open as f64)), ("half_life_events".into(), Json::Num(c.half_life)), + ("expires_after".into(), Json::Num(r6(4.0 * c.half_life)))]))); } + v.push(("learning".into(), Json::Obj(lv))); } // the drives block (§2.9), when there is one: the goals (pursue's levels) in order, their phrases, floors and starve_after if let (Json::Obj(v), Some(dr)) = (&mut d, &p.drives) { let per = |f: &dyn Fn(&Goal) -> Option| Json::Obj(dr.goals.iter().filter_map(|g| f(g).map(|x| (g.id.clone(), x))).collect()); v.push(("drives".into(), Json::Obj(vec![("goals".into(), Json::Arr(dr.goals.iter().map(|g| s(&g.id)).collect())), ("say".into(), per(&|g| Some(s(&g.say)))), @@ -2060,8 +2278,10 @@ pub fn check(p: &Persona, eng: Engine) -> R { /// where it differs, the program's size and digest, the line and the why pub fn explain(p: &Persona, st: &State, raw: &Json, eng: Engine) -> R { let rawv: Vec<(String, Json)> = match raw { Json::Null => vec![], Json::Obj(v) => v.clone(), _ => return Err(perr("inputs", "must be a JSON object")) }; - let (src, rawv) = if p.senses.is_some() { take_src(p, rawv, true)? } else { (None, rawv) }; + let (src, rawv) = if p.senses.is_some() || p.credit().is_some() { take_src(p, rawv, true)? } else { (None, rawv) }; + let (pay, rawv) = take_pay(p, rawv)?; let (st2, host) = prep(p, st, &rawv, src.as_ref(), true)?; + let st2 = match &pay { Some(k) => credit_step(p, &st2, &host, k, src.as_ref(), true)?.0, None => st2 }; let (prog, meta) = compile(p, &st2, &host, &Opts::default())?; let doc = eng(&prog, &flags(p, st)); let (out, _) = turn(p, st, raw, false, eng, false)?; let plan: HashMap = doc.get("plan").and_then(Json::as_obj).map_or_else(HashMap::new, |o| o.iter().map(|(k, v)| (k.clone(), back(p, k, v.as_str().unwrap_or("")))).collect()); let g = |k: &str| out.get(k).cloned().unwrap_or(Json::Null); let s = |j: &Json| j.as_str().map_or_else(|| canon(j), str::to_string); @@ -2630,7 +2850,7 @@ mod tests { fn the_learning_block_and_state_fields_are_strict() { let bad = |l: &str| err(persona(&format!(r#","learning":{{{l}}}"#))); let base = r#""from":["praise","criticism"],"traits":["verbosity"],"rate":0.5,"step_cap":0.2,"total_cap":0.6"#; - assert_eq!(bad(&format!(r#"{base},"spread":1"#)), "learning.spread: unknown field (allowed: comment, from, rate, step_cap, total_cap, traits)"); + assert_eq!(bad(&format!(r#"{base},"spread":1"#)), "learning.spread: unknown field (allowed: comment, credit, from, rate, step_cap, total_cap, traits)"); assert_eq!(bad(r#""from":["praise"],"traits":["verbosity"],"rate":0.5,"step_cap":0.2"#), "learning.total_cap: required"); assert_eq!(bad(&base.replace(r#"["praise","criticism"]"#, r#"["praise","valence"]"#)), "learning.from[1]: not a flag input of this persona"); assert_eq!(bad(&base.replace(r#"["verbosity"]"#, r#"["valence"]"#)), "learning.traits[0]: not a trait of this persona (moods do not learn)"); @@ -3118,4 +3338,122 @@ mod tests { let q = build(&json::parse(&BOX.replace("2.5", "6.5")).unwrap()).unwrap(); assert_eq!(prove_seed(&q, &props(&q, &rule, "--never", "never").unwrap()[0], 0, &run).ok(), Some((1, 2))); } + + // ------------------------------------------------------------- action-addressed feedback (§2.8, RFC 0001 B.2 and B.3) + const CREDIT: &str = r#","learning":{"from":["praise","criticism"],"traits":["verbosity","humour"],"rate":0.5,"step_cap":0.2,"total_cap":0.6,"credit":{"max_open":3,"half_life_events":32}}"#; + /// One turn on the event `ev`: (stance, new state), or the refusal as "path: message" + fn tn(p: &Persona, st: &State, ev: &str) -> Result<(Json, State), String> { turn(p, st, &json::parse(ev).unwrap(), false, &run, false).map_err(|e| format!("{}: {}", e.path, e.msg)) } + fn opened(st: &State) -> Vec { st.open.iter().map(|o| o.turn).collect() } + + /// The RFC arithmetic: a payment `age` events late (age = t − n − 1) gets e = 0.5^(age / 32), 6 decimals (1, 0.937084, 0.805245, + /// 0.5 and 0.063869 at ages 0, 3, 10, 32 and 127) and moves the 0.8 step scaled by e; at age 128 the decision has expired + /// (closed as expired before anything is paid) and paying it is refused (B-R2) + #[test] + fn eligibility_halves_per_half_life_and_a_decision_expires_after_four() { + let p = persona(CREDIT).unwrap(); let l = p.learning.clone().unwrap(); + for (age, e) in [(0u64, 1.0), (3, 0.937084), (10, 0.805245), (32, 0.5), (127, 0.063869)] { + let mut st = tn(&p, &init(&p, Some(1), true, &run), r#"{"await":true}"#).unwrap().1; let c0 = st.open[0].credit.clone(); + assert!(c0.iter().any(|(_, v)| v.iter().any(|x| *x != 0.0)), "the awaited stance carries credit"); + for _ in 0..age { st = tn(&p, &st, "{}").unwrap().1; } + let (doc, ns) = tn(&p, &st, r#"{"praise":true,"for":0}"#).unwrap(); + assert_eq!(g(&doc, &["credit", "paid", "e"]).as_f64(), Some(e), "age {age}"); + assert_eq!(canon(&table(&ns.learned)), canon(&table(&learn(&l, &c0, 1.0, e, &st.learned))), "age {age}: the step scaled by e"); + assert_eq!((canon(g(&doc, &["credit", "closed"])), ns.open.len()), (r#"[{"as":"paid","turn":0}]"#.to_string(), 0), "age {age}"); + } + let mut st = tn(&p, &init(&p, Some(1), true, &run), r#"{"await":true}"#).unwrap().1; + for _ in 0..128 { st = tn(&p, &st, "{}").unwrap().1; } + assert_eq!(opened(&st), [0], "open until an event 128 late"); + let (doc, ns) = tn(&p, &st, "{}").unwrap(); assert_eq!(canon(g(&doc, &["credit", "closed"])), r#"[{"as":"expired","turn":0}]"#); assert!(ns.open.is_empty()); + let e = tn(&p, &st, r#"{"praise":true,"for":0}"#).err().unwrap(); assert!(e.starts_with("inputs.for: turn 0 is neither open nor the previous stance (128)"), "{e}"); + } + + /// At most max_open decisions wait (a fourth `await` evicts the oldest, which can no longer be paid), and every refusal row + /// B-R1 to B-R6 refuses its event whole at its path; a payment of a habit-forced stance moves nothing and says `absorbed` + #[test] + fn eviction_every_refusal_row_and_absorbed() { + let p = persona(CREDIT).unwrap(); let mut st = init(&p, Some(2), true, &run); let mut docs = vec![]; + for _ in 0..4 { let (d, s) = tn(&p, &st, r#"{"await":true}"#).unwrap(); docs.push(d); st = s; } + assert_eq!((canon(g(&docs[3], &["credit", "closed"])), canon(g(&docs[3], &["credit", "open"]))), (r#"[{"as":"evicted","turn":0}]"#.to_string(), "[1,2,3]".to_string())); + let st = tn(&p, &st, "{}").unwrap().1; // turn 5: open 1, 2, 3; the previous stance is 4 + let s5 = tn(&p, &st, r#"{"praise":true,"for":1}"#).unwrap().1; let s6 = tn(&p, &s5, r#"{"cancel":[2],"src":"env:executor"}"#).unwrap().1; // turn 7: open 3 + let z = "0".repeat(64); let d3 = g(&docs[3], &["credit", "stance"]).as_str().unwrap().to_string(); + let rows: Vec<(&State, String, &str)> = vec![ + (&st, r#"{"praise":true}"#.into(), "inputs.for: feedback without `for` while other decisions are open (1, 2, 3)"), // B-R1 + (&st, r#"{"praise":true,"for":0}"#.into(), "inputs.for: turn 0 is neither open nor the previous stance (4)"), // B-R2 evicted + (&st, r#"{"praise":true,"for":9}"#.into(), "inputs.for: turn 9 is neither open"), // B-R2 future + (&s6, r#"{"praise":true,"for":1}"#.into(), "inputs.for: turn 1 is neither open"), // B-R2 paid + (&s6, r#"{"praise":true,"for":2}"#.into(), "inputs.for: turn 2 is neither open"), // B-R2 cancelled + (&s6, r#"{"praise":true,"for":4}"#.into(), "inputs.for: turn 4 is neither open"), // B-R2 never opened + (&st, r#"{"for":1}"#.into(), "inputs.for: this event carries no feedback"), // B-R3 + (&st, r#"{"cancel":[0],"src":"env"}"#.into(), "inputs.cancel[0]: turn 0 is not open (open: 1, 2, 3)"), // B-R4 not open + (&st, r#"{"cancel":[1,1],"src":"env"}"#.into(), "inputs.cancel[1]: listed twice"), // B-R4 twice + (&st, r#"{"praise":true,"for":1,"cancel":[1],"src":"env"}"#.into(), "inputs.cancel[0]: turn 1 is the decision this event's feedback pays"), // B-R4 paid now + (&st, r#"{"await":"yes"}"#.into(), "inputs.await: "), (&st, r#"{"await":1}"#.into(), "inputs.await: "), // B-R5 + (&st, r#"{"praise":true,"for":1.5}"#.into(), "inputs.for: "), (&st, r#"{"praise":true,"for":-1}"#.into(), "inputs.for: "), + (&st, r#"{"praise":true,"for":"1"}"#.into(), "inputs.for: "), (&st, r#"{"praise":true,"for":{"turn":1}}"#.into(), "inputs.for"), + (&st, r#"{"praise":true,"for":{"turn":1,"stance":"1"}}"#.into(), "inputs.for.stance: "), + (&st, r#"{"cancel":1,"src":"env"}"#.into(), "inputs.cancel: "), (&st, r#"{"cancel":[1,2,3,4],"src":"env"}"#.into(), "inputs.cancel: "), + (&st, r#"{"cancel":[0.5],"src":"env"}"#.into(), "inputs.cancel[0]: "), (&st, r#"{"cancel":[1]}"#.into(), "inputs.src: a cancel needs a source"), + (&st, r#"{"cancel":[1],"src":"self"}"#.into(), "inputs.src: a cancel needs a source"), (&st, r#"{"cancel":[1],"src":"clock"}"#.into(), "inputs.src: a cancel needs a source"), + (&s6, format!(r#"{{"praise":true,"for":{{"turn":3,"stance":"sha256:{z}"}}}}"#), "inputs.for.stance: turn 3's stance is sha256:"), // B-R6 + ]; + for (s, ev, want) in &rows { let e = tn(&p, s, ev).map(|_| "accepted".to_string()).unwrap_or_else(|e| e); assert!(e.starts_with(want), "{ev}: {e}"); } + // the digest-bound payment of the stance it names is accepted and echoes it + let (doc, ns) = tn(&p, &s6, &format!(r#"{{"praise":true,"for":{{"turn":3,"stance":"{d3}"}}}}"#)).unwrap(); + assert_eq!((g(&doc, &["credit", "paid", "stance"]).as_str(), g(&doc, &["credit", "paid", "turn"]).as_f64(), opened(&ns)), (Some(d3.as_str()), Some(3.0), vec![])); + // a habit-forced stance carries no credit: paying it moves nothing (absorbed), and learned_from does not count it + let q = persona(&CREDIT.replace(r#""traits":["verbosity","humour"]"#, r#""traits":["humour"]"#)).unwrap(); + let s1 = tn(&q, &init(&q, Some(3), true, &run), r#"{"loss":true,"await":true}"#).unwrap().1; let s2 = tn(&q, &s1, "{}").unwrap().1; + let (doc, s3) = tn(&q, &s2, r#"{"praise":true,"for":0}"#).unwrap(); + assert_eq!((g(&doc, &["credit", "paid", "absorbed"]), &s3.learned), (&Json::Bool(true), &s2.learned)); + } + + /// The credit state is read strictly: at most max_open open decisions, turns increasing and before the state's turn, credits + /// within ±1, stance digests; prev_stance a digest once a turn has run; without the block the fields are refused + #[test] + fn the_credit_state_is_strict() { + let p = persona(CREDIT).unwrap(); let mut st = init(&p, Some(4), true, &run); + for ev in [r#"{"await":true}"#, r#"{"await":true}"#, "{}"] { st = tn(&p, &st, ev).unwrap().1; } + assert_eq!((opened(&st), State::read(&p, &st.to_json(&p)).is_ok()), (vec![0, 1], true)); + let bad = |f: &dyn Fn(&mut State)| { let mut s = st.clone(); f(&mut s); s.seal(&p); err(State::read(&p, &s.to_json(&p))) }; + let cases: Vec<(String, &str)> = vec![(bad(&|s| s.open[0].credit[0].1[0] = 1.5), "state.open_credit[0].credit"), (bad(&|s| s.open[1].turn = 0), "state.open_credit[1].turn"), + (bad(&|s| s.open[1].turn = 3), "state.open_credit[1].turn"), (bad(&|s| s.open[0].stance = "sha256:1".into()), "state.open_credit[0].stance"), + (bad(&|s| { let o = s.open[1].clone(); for k in 0..2 { s.open.push(Open { turn: o.turn + 1 + k, ..o.clone() }); } s.turn += 2; }), "state.open_credit"), + (bad(&|s| s.prev_stance = None), "state.prev_stance"), (bad(&|s| s.control_closed = vec![2, 1]), "state.control_closed[1]")]; + for (e, want) in &cases { assert!(e.starts_with(want), "{want}: {e}"); } + // the same fields for a persona without the block are refused by name + let o = persona(LEARN).unwrap(); let Json::Obj(v) = st.to_json(&p) else { unreachable!() }; + let mut v: Vec<(String, Json)> = v.into_iter().filter(|(k, _)| k != "digest").map(|(k, x)| if k == "persona" { (k, json::parse(&canon(&x).replace(&p.digest, &o.digest)).unwrap()) } else { (k, x) }).collect(); + let d = sha(&Json::Obj(v.clone())); v.push(("digest".into(), Json::Str(d))); + let e = err(State::read(&o, &Json::Obj(v))); assert!(e.contains("this persona has no credit block (learning.credit)"), "{e}"); + } + + /// e = 1 is 0.8 (RFC 0001 B.2, B.4): on every shipped learning persona, a copy with a credit block whose feedback names the + /// previous stance (`for: t − 1`), and the same copy unaddressed, learn exactly what the persona without the block learns: the + /// same Δ and learned_from after every turn + #[test] + fn paying_the_previous_stance_by_name_learns_as_0_8() { + let ex = |f: &str| format!("{}/../examples/{f}", env!("CARGO_MANIFEST_DIR")); + let with = |doc: &Json, c: Option| { let Json::Obj(v) = doc else { unreachable!() }; + build(&Json::Obj(v.iter().map(|(k, x)| (k.clone(), if k != "learning" { x.clone() } else { + let mut l: Vec<(String, Json)> = x.as_obj().unwrap().iter().filter(|(k, _)| k != "credit").cloned().collect(); + if let Some(c) = &c { l.push(("credit".into(), c.clone())); } Json::Obj(l) })).collect())).unwrap() }; + let go = |p: &Persona, st: &State, e: &[(String, Json)]| turn_any_source(p, st, &event_json(e), false, &run, false).unwrap().1; + for (i, f) in ["agent-harness/adaptive.json", "agent-harness/guarded.json", "agent-harness/addressed.json", "persona/sensed.yaml", "persona/dispatch-policy.yaml"].iter().enumerate() { + let doc = load(&ex(f)).unwrap().1; let (old, new) = (with(&doc, None), with(&doc, Some(json::parse(r#"{"max_open":8,"half_life_events":32}"#).unwrap()))); + assert!(old.credit().is_none() && new.credit().is_some(), "{f}"); + let alpha = alphabet(&old, &[0.5, 1.0], &[0.5, 6.0]); let mut r = Philox4x32::new(77, i as u64); let seed = Some(i as u64); + let (mut so, mut sa, mut sb) = (init(&old, seed, true, &run), init(&new, seed, true, &run), init(&new, seed, true, &run)); let mut moved = 0; + for t in 0..160u64 { + let mut e: Vec<(String, Json)> = vec![]; + for (id, kind, vals) in &alpha { if r.f64() < if learning_flag(&old, id) { 0.5 } else if *kind == "flag" { 0.3 } else { 0.2 } { e.push((id.clone(), vals[r.below(vals.len())].clone())); } } + let mut named = e.clone(); + if t > 0 && e.iter().any(|(k, x)| learning_flag(&old, k) && *x == Json::Bool(true)) { named.push(("for".into(), Json::Num((t - 1) as f64))); } + let (no, na, nb) = (go(&old, &so, &e), go(&new, &sa, &named), go(&new, &sb, &e)); + for s in [&na, &nb] { assert_eq!((canon(&table(&s.learned)), &s.learned_from), (canon(&table(&no.learned)), &no.learned_from), "{f} turn {t}"); } + if no.learned != so.learned { moved += 1; } + (so, sa, sb) = (no, na, nb); } + assert!(moved >= 5, "{f}: feedback moved the deltas on {moved} turns"); // a one-sided learner reaches total_cap in 8 steps + } + } } diff --git a/probbit-cli/tests/live.rs b/probbit-cli/tests/live.rs index ff3be99..ac5ea6f 100644 --- a/probbit-cli/tests/live.rs +++ b/probbit-cli/tests/live.rs @@ -1,6 +1,8 @@ //! `probbit live` with senses (docs/persona.md §2.11, §5.7): readings logged in the strand as used, `live verify` recomputing the //! normals (summary `normals` with `max_move_50`), a life split across runs equal to one run, the one stderr line for readings -//! sent to a persona without the block, the refusal property P3s, and `probbit check` on a sensed persona. +//! sent to a persona without the block, the refusal property P3s, and `probbit check` on a sensed persona. With action-addressed +//! feedback (§2.8): the refusal property P3c with random payments, every refusal row byte for byte, control lines closing open +//! decisions, and `probbit check` on a credit persona. use std::io::Write; use std::process::{Command, Stdio}; #[allow(dead_code)] @@ -154,6 +156,149 @@ fn p3s_a_refused_event_changes_nothing() { eprintln!("p3s: {refused} refused, {accepted} accepted"); assert!(refused >= 1000 && accepted >= 4000, "a mix of both: {refused} refused, {accepted} accepted"); } +const ADDRESSED: &str = "examples/agent-harness/addressed.json"; +fn lines_of(v: &[&str]) -> Vec { v.iter().map(|x| x.to_string()).collect() } + +/// P3c's generator for the addressed policy (a credit block, max_open 8, half_life_events 32, `reward_from: [env]`): a model of +/// the bookkeeping (RFC 0001 B.2: the next turn, the open decisions after expiry, eviction beyond max_open, which turns were +/// awaited) picks mostly valid payments (late, reordered, the previous stance by name, unaddressed when unambiguous, cancels) +/// and some that a row refuses (B-R1 ambiguous, B-R2 paid/cancelled/evicted/never opened/to come, B-R3, B-R4, B-R5, B-R6), +/// and predicts whether the engine accepts each event +struct Book { t: u64, open: Vec, awaited: Vec } +impl Book { + fn event(&mut self, r: &mut Mix) -> (String, bool) { + let t = self.t; let prev = t.checked_sub(1); let live: Vec = self.open.iter().copied().filter(|n| t - n - 1 < 128).collect(); + let gone: Vec = self.awaited.iter().copied().filter(|n| !live.contains(n) && Some(*n) != prev).collect(); + let never: Vec = (0..t).filter(|n| !self.awaited.contains(n) && Some(*n) != prev).collect(); + let pick = |r: &mut Mix, v: &[u64]| v[r.below(v.len())]; + let ambiguous = live.iter().any(|n| Some(*n) != prev); + let (mut kv, mut ok, mut pays, mut cancels): (Vec, bool, Option, Option) = (vec![], true, None, None); + match r.below(100) { + 0..=39 => {} // a decision (when awaited) or an idle event + 40..=74 => { kv.push(r#""praise":true,"src":"env:probe""#.into()); + match r.below(20) { + 0..=8 if !live.is_empty() => { let n = pick(r, &live); kv.push(format!(r#""for":{n}"#)); pays = Some(n); } // late or reordered + 9 | 10 if prev.is_some() => { kv.push(format!(r#""for":{}"#, t - 1)); pays = prev; } // the previous stance by name + 13 | 14 if !gone.is_empty() => { kv.push(format!(r#""for":{}"#, pick(r, &gone))); ok = false; } // paid, cancelled, evicted, expired + 15 if !never.is_empty() => { kv.push(format!(r#""for":{}"#, pick(r, &never))); ok = false; } // never opened + 16 => { kv.push(format!(r#""for":{}"#, t + 2)); ok = false; } // still to come + 17 if !live.is_empty() => { kv.push(format!(r#""for":{{"turn":{},"stance":"sha256:{}"}}"#, pick(r, &live), "0".repeat(64))); ok = false; } // B-R6 + 18 => { kv.push(r#""for":1.5"#.into()); ok = false; } // B-R5 + _ => { if ambiguous { ok = false; } else { pays = prev; } } } } // unaddressed: B-R1 when ambiguous + 75..=86 => { kv.push(r#""src":"env:executor""#.into()); + match r.below(10) { 0..=6 if !live.is_empty() => { let n = pick(r, &live); kv.push(format!(r#""cancel":[{n}]"#)); cancels = Some(n); } + 7 if !live.is_empty() => { let n = pick(r, &live); kv.push(format!(r#""cancel":[{n},{n}]"#)); ok = false; } // B-R4 twice + _ => { kv.push(format!(r#""cancel":[{}]"#, if gone.is_empty() { t + 5 } else { pick(r, &gone) })); ok = false; } } } // B-R4 not open + _ => { ok = false; kv.push(match r.below(5) { 0 => r#""await":"yes""#.to_string(), 1 => r#""praise":true,"src":"self""#.into(), 2 => r#""praise":true"#.into(), + 3 => format!(r#""cancel":[{}],"src":"self""#, t.saturating_sub(1)), _ => format!(r#""for":{}"#, t.saturating_sub(1)) }); } } // B-R5, provenance, B-R3 + let wait = r.below(10) < 4 && !kv.iter().any(|k| k.contains("await")); if wait { kv.push(r#""await":true"#.into()); } + if r.below(5) == 0 { kv.push(r#""error":true"#.into()); } + if r.below(4) == 0 { kv.push(format!(r#""elapsed_hours":{}"#, r.below(4) as f64 * 0.5)); } + if ok { self.open = live.into_iter().filter(|n| Some(*n) != pays && Some(*n) != cancels).collect(); + if wait { self.open.push(t); self.awaited.push(t); while self.open.len() > 8 { self.open.remove(0); } } self.t += 1; } + (format!("{{{}}}", kv.join(",")), ok) + } +} + +/// P3c: a refused event changes nothing, with payments. 40 individuals x 300 random events with random `await`, `for` and +/// `cancel` (late, reordered, duplicated, cancelled, unknown, mismatched, malformed): the run with the refused events equals the +/// run without them, byte for byte (every stance, the strand with a checkpoint after each event, the final state) +#[test] +fn p3c_a_refused_payment_changes_nothing() { + let (mut refused, mut accepted, mut paid, mut late) = (0usize, 0usize, 0usize, 0usize); + for seed in 0..40u64 { + let (mut r, mut book) = (Mix(0xC4ED_17C0 + seed), Book { t: 0, open: vec![], awaited: vec![] }); + let (evs, model): (Vec, Vec) = (0..300).map(|_| book.event(&mut r)).unzip(); + let all = events_file("p3c-all.jsonl", &evs); + let st = init(ADDRESSED, seed, "p3c-state.json"); let strand = tmp("p3c.strand"); clean(&[&strand]); + let (c, out, _) = live(ADDRESSED, &st, &all, &strand, "1"); + let docs: Vec<&str> = out.lines().collect(); assert_eq!(docs.len(), 300, "seed {seed}: one line per event"); + let ok: Vec = (0..300).filter(|&i| !docs[i].starts_with(r#"{"error""#)).collect(); + for i in 0..300 { assert_eq!(ok.contains(&i), model[i], "seed {seed} event {i}: the model of B.2-B.3 and the engine disagree on {}: {}", evs[i], docs[i]); } + assert_eq!(c, if ok.len() < 300 { 2 } else { 0 }, "seed {seed}"); + refused += 300 - ok.len(); accepted += ok.len(); + for &i in &ok { let p = s(&parse(docs[i]), &["credit", "paid"]).clone(); if p != Json::Null { paid += 1; if s(&p, &["e"]).as_f64() != Some(1.0) { late += 1; } } } + let kept = events_file("p3c-kept.jsonl", &ok.iter().map(|&i| evs[i].clone()).collect::>()); + let st2 = init(ADDRESSED, seed, "p3c-state2.json"); let strand2 = tmp("p3c2.strand"); clean(&[&strand2]); + let (c, out2, e) = live(ADDRESSED, &st2, &kept, &strand2, "1"); assert_eq!(c, 0, "seed {seed}: {e}"); + assert_eq!(out2, ok.iter().map(|&i| format!("{}\n", docs[i])).collect::(), "seed {seed}: the stances"); + assert_eq!(read(&strand2), read(&strand), "seed {seed}: the strand"); assert_eq!(read(&st2), read(&st), "seed {seed}: the state"); + let (c, v, e) = probbit(&["live", "verify", &strand]); assert_eq!((c, s(&parse(&v), &["ok"])), (0, &Json::Bool(true)), "seed {seed}: {e}"); + clean(&[&st, &strand, &st2, &strand2, &all, &kept]); + } + eprintln!("p3c: {refused} refused, {accepted} accepted, {paid} paid ({late} late)"); + assert!(refused >= 1000 && accepted >= 4000 && late >= 200, "a mix: {refused} refused, {accepted} accepted, {paid} paid, {late} late"); +} + +/// Each refusal row (B-R1 to B-R6) refuses its event whole: one {"error"} at its path, exit 2, and the run equals the run without +/// the event, byte for byte (stances, strand, state) +#[test] +fn every_refusal_row_changes_nothing() { + // turn 0 and 1 await, 2 pays 0, 3 awaits and 4 cancels it, 5 awaits: then turn 6 has 1 and 5 open, 5 the previous stance + let base = lines_of(&[r#"{"await":true}"#, r#"{"await":true,"error":true,"src":"env:probe"}"#, r#"{"praise":true,"for":0,"src":"env:probe"}"#, r#"{"await":true}"#, + r#"{"cancel":[3],"src":"env:executor"}"#, r#"{"await":true}"#]); + let tail = lines_of(&[r#"{"praise":true,"for":5,"src":"env:probe"}"#, r#"{"cancel":[1],"src":"env:executor"}"#, r#"{"praise":true,"src":"env:probe"}"#]); + let z = "0".repeat(64); + let rows: Vec<(&str, String, &str)> = vec![("B-R1", r#"{"praise":true,"src":"env:probe"}"#.into(), "inputs.for"), ("B-R2 paid", r#"{"praise":true,"for":0,"src":"env:probe"}"#.into(), "inputs.for"), + ("B-R2 cancelled", r#"{"praise":true,"for":3,"src":"env:probe"}"#.into(), "inputs.for"), ("B-R2 never opened", r#"{"praise":true,"for":2,"src":"env:probe"}"#.into(), "inputs.for"), + ("B-R2 to come", r#"{"praise":true,"for":9,"src":"env:probe"}"#.into(), "inputs.for"), ("B-R3", r#"{"for":1}"#.into(), "inputs.for"), + ("B-R4 not open", r#"{"cancel":[3],"src":"env:executor"}"#.into(), "inputs.cancel[0]"), ("B-R4 twice", r#"{"cancel":[1,1],"src":"env:executor"}"#.into(), "inputs.cancel[1]"), + ("B-R4 paid now", r#"{"praise":true,"for":1,"cancel":[1],"src":"env:probe"}"#.into(), "inputs.cancel[0]"), ("B-R5 await", r#"{"await":1}"#.into(), "inputs.await"), + ("B-R5 for", r#"{"praise":true,"for":-1,"src":"env:probe"}"#.into(), "inputs.for"), ("B-R5 cancel", r#"{"cancel":3,"src":"env:executor"}"#.into(), "inputs.cancel"), + ("B-R5 cancel src", r#"{"cancel":[1],"src":"self"}"#.into(), "inputs.src"), + ("B-R6", format!(r#"{{"praise":true,"for":{{"turn":1,"stance":"sha256:{z}"}},"src":"env:probe"}}"#), "inputs.for.stance")]; + let without: Vec = base.iter().chain(&tail).cloned().collect(); let ev0 = events_file("rows-without.jsonl", &without); + let st0 = init(ADDRESSED, 3, "rows-state0.json"); let strand0 = tmp("rows0.strand"); clean(&[&strand0]); + let (c, out0, e) = live(ADDRESSED, &st0, &ev0, &strand0, "1"); assert_eq!(c, 0, "{e}"); + for (row, ev, path) in &rows { + let with: Vec = base.iter().cloned().chain([ev.clone()]).chain(tail.iter().cloned()).collect(); let ev1 = events_file("rows-with.jsonl", &with); + let st = init(ADDRESSED, 3, "rows-state.json"); let strand = tmp("rows.strand"); clean(&[&strand]); + let (c, out, e) = live(ADDRESSED, &st, &ev1, &strand, "1"); assert_eq!(c, 2, "{row}: {e}"); + let lines: Vec<&str> = out.lines().collect(); let err = parse(lines[6]); + assert!(err.get("error").is_some() && jw(&err).contains(&format!("\"events[6].{path}\"")), "{row}: {}", lines[6]); + assert_eq!(lines.iter().enumerate().filter(|(i, _)| *i != 6).map(|(_, l)| format!("{l}\n")).collect::(), out0, "{row}: the stances"); + assert_eq!((read(&strand), read(&st)), (read(&strand0), read(&st0)), "{row}: the strand and the state"); + clean(&[&st, &strand, &ev1]); + } + clean(&[&st0, &strand0, &ev0]); +} + +/// A control line closes every open decision (closed as control): `live verify` lists them in `open` before it and none after, +/// the next stance lists them as closed, a payment naming one is refused (B-R2), and the strand replays +#[test] +fn control_lines_close_open_decisions() { + let st = init(ADDRESSED, 0, "ctl-state.json"); let strand = tmp("ctl.strand"); clean(&[&strand]); + let ev = events_file("ctl1.jsonl", &lines_of(&[r#"{"await":true}"#, r#"{"await":true}"#, "{}"])); + let (c, _, e) = live(ADDRESSED, &st, &ev, &strand, "1"); assert_eq!(c, 0, "{e}"); + let open = |f: &str| { let (c, v, e) = probbit(&["live", "verify", f]); assert_eq!(c, 0, "{e}"); let v = parse(&v); assert_eq!(s(&v, &["ok"]), &Json::Bool(true)); jw(s(&v, &["open"])) }; + assert_eq!(open(&strand), "[0,1]"); + for what in ["pause", "resume"] { let (c, _, e) = probbit(&["live", "control", &strand, what, "--by", "human:ops", "--reason", "maintenance", "--at", "2026-10-14T09:00:00Z"]); assert_eq!(c, 0, "{e}"); } + assert_eq!(open(&strand), "[]"); + let ev2 = events_file("ctl2.jsonl", &lines_of(&[r#"{"praise":true,"for":1,"src":"env:probe"}"#, r#"{"await":true}"#, r#"{"praise":true,"src":"env:probe"}"#])); + let (c, out, e) = live(ADDRESSED, &st, &ev2, &strand, "1"); assert_eq!(c, 2, "{e}"); + let docs: Vec = out.lines().map(parse).collect(); assert_eq!(docs.len(), 3); + assert!(docs[0].get("error").is_some() && jw(&docs[0]).contains("inputs.for"), "{}", jw(&docs[0])); + assert_eq!((jw(s(&docs[1], &["credit", "closed"])), jw(s(&docs[1], &["credit", "open"]))), (r#"[{"as":"control","turn":0},{"as":"control","turn":1}]"#.into(), "[3]".into())); + assert_eq!((s(&docs[2], &["credit", "paid", "turn"]).as_f64(), s(&docs[2], &["credit", "paid", "e"]).as_f64()), (Some(3.0), Some(1.0)), "the previous stance, paid unaddressed"); + assert_eq!(open(&strand), "[]"); + clean(&[&st, &strand, &ev, &ev2]); +} + +/// `probbit check` on a persona with a credit block: the retry rule held by its habit, and a strand with late, cancelled and +/// digest-bound payments replays +#[test] +fn probbit_check_holds_a_credit_persona() { + let props = tmp("retry-props.json"); std::fs::write(&props, r#"{"props":[{"id":"ask_after_two_errors","when":{"error_streak":2},"then":{"action":["ask"]}}]}"#).unwrap(); + let golden = parse(&read(concat!(env!("CARGO_MANIFEST_DIR"), "/../examples/agent-harness/golden/events.json"))); + let ev = events_file("check-credit.jsonl", &golden.as_arr().unwrap().iter().map(jw).collect::>()); + let st = init(ADDRESSED, 0, "check-credit-state.json"); let strand = tmp("check-credit.strand"); clean(&[&strand]); + let (c, _, e) = live(ADDRESSED, &st, &ev, &strand, "4"); assert_eq!(c, 0, "{e}"); + let (c, out, e) = probbit(&["check", ADDRESSED, "--props", &props, "--seeds", "0-9", "--strand", &strand]); assert_eq!(c, 0, "{out}\n{e}"); + assert!(out.lines().any(|l| l.starts_with("rule ") && l.contains("ask_after_two_errors") && l.contains("held")), "{out}"); + assert!(out.ends_with("check: held 1 · broken 0 · unproven 0 · strands 1/1\n"), "{out}"); + clean(&[&st, &strand, &ev, &props]); +} + /// `probbit check` reuses the lint pipeline: on the sensed persona both habit rules are held by construction, and a sensed /// strand replays #[test] diff --git a/probbit-cli/tests/persona.rs b/probbit-cli/tests/persona.rs index 0020a88..82c3062 100644 --- a/probbit-cli/tests/persona.rs +++ b/probbit-cli/tests/persona.rs @@ -145,6 +145,33 @@ fn stdout_matches_the_sensed_golden() { let _ = std::fs::remove_file(&st); } +/// The addressed-outcome golden (examples/agent-harness/addressed.json, docs/persona.md §2.8): 16 events with decisions awaiting +/// their outcome, late payments (`for`, one bound to its stance's digest), a cancel, an unaddressed payment of the previous stance +/// and a payment of a habit-forced stance (absorbed): `init`, `compile` of turn 0, every turn, the final state, `replay` and +/// `describe`. CI runs it on Linux, macOS and Windows: the same bytes on each. +#[test] +fn stdout_matches_the_addressed_golden() { + let ah = |f: &str| format!("{}/../examples/agent-harness/{f}", env!("CARGO_MANIFEST_DIR")); let p = ah("addressed.json"); + let g = |f: &str| read(&ah(&format!("golden/{f}"))); + let script = parse(&g("events.json")); let turns = script.as_arr().unwrap(); assert_eq!(turns.len(), 16); + let (c, s0, e) = probbit(&["persona", "init", &p], ""); assert_eq!(c, 0, "{e}"); assert_eq!(s0, g("state0.json"), "state0"); + let st = tmp("addressed-state.json"); std::fs::write(&st, &s0).unwrap(); + let (c, prog, e) = probbit(&["persona", "compile", &p, "--state", &st, "--inputs", &jw(&turns[0])], ""); assert_eq!(c, 0, "{e}"); + assert_eq!(prog, g("program-turn0.json"), "program of turn 0"); + let gold = g("turns.jsonl"); let lines: Vec<&str> = gold.lines().collect(); assert_eq!(lines.len(), 16); + for (i, t) in turns.iter().enumerate() { + let (c, out, e) = probbit(&["persona", "turn", &p, "--state", &st, "--inputs", &jw(t)], ""); assert_eq!(c, 0, "{e}"); + assert_eq!(out.trim_end(), lines[i], "addressed turn {i}"); } + assert_eq!(read(&st), g("final-state.json"), "final state"); + let (c, rep, e) = probbit(&["persona", "replay", &p, "--script", &ah("golden/events.json")], ""); assert_eq!(c, 0, "{e}"); assert_eq!(rep, gold, "replay"); + let (c, d, e) = probbit(&["persona", "describe", &p], ""); assert_eq!(c, 0, "{e}"); assert_eq!(d, g("describe.json"), "describe"); + // a late payment carries its eligibility; the digest-bound one pays the habit-forced stance, which moves nothing + assert!(lines[2].contains(r#""paid":{"absorbed":false,"e":0.978572,"sign":1,"stance":"#), "{}", lines[2]); + assert!(lines[10].contains(r#""paid":{"absorbed":true,"e":1,"sign":1,"stance":"#), "{}", lines[10]); + assert!(lines[4].contains(r#""closed":[{"as":"cancelled","turn":1}]"#), "{}", lines[4]); + let _ = std::fs::remove_file(&st); +} + /// `probbit persona --help` documents every subcommand and the exit codes; bad flags and subcommands exit 2. #[test] fn persona_help_and_flags() {