- explore dequeues its goal only after the engine call succeeds
- model-supplied list fields go through as_list/str_list, so null or
string values can't crash a run or turn into per-character tests
- run_ab_eval rejects blank problems before any model call and
randomizes baseline/treated solver call order
- middleware merges into a leading system message with block content
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01YbuVfbQEpaitM5TMjBMzkF
The original upload never called a model, its autonomous actions only
logged that they had happened, and its benchmark was rigged. This
replaces it with:
- museengine.engine: analyze -> map -> generate -> adversarial critique
-> Pareto selection, each step an LLM call with a JSON contract.
Offline mode returns labelled keyword suggestions and no fake scores.
- museengine.memory: plain-SQLite episodes, notes, state and audit log.
- museengine.governance + agent: an autonomous loop behind an
allowlist, step budget, kill switch and human approval for
self-chosen goals, with every decision and real effect audited.
- museengine.evaluation: blinded, order-swapped A/B eval with an exact
sign test, replacing the keyword scorer and fudge constants.
- Optional Anthropic adapter; the core accepts any (str) -> str callable.
- pyproject, CLI, 24 offline tests, CI workflow.
The original files are kept unchanged in legacy/ (minus a duplicate).
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01YbuVfbQEpaitM5TMjBMzkF