Repository navigation
Releases
v1.6.0
Documentation and package metadata only. The code is the same as 1.5.0.
- The README opens with what Crucible decides, who uses it, a first run checked in a clean environment, a comparison with promptfoo, DeepEval, Inspect, OpenAI Evals and Ragas, and its limits.
- The licence section states the FSL-1.1-MIT terms, and README images use absolute URLs so the PyPI page shows them.
- The PyPI summary is rewritten, and the author entry gains zaindharper@gmail.com.
Install: pip install crucible-bench==1.6.0
v1.5.0
Adds judging modes for when a model or a panel does the judging, measured once with a 2B local
judge. Both-order pairwise lost to pointwise scoring for that judge; decomposition made the named
weakest claim more stable across reruns.
- Pairwise judging in both orders:
crucible.pairwiseasks a comparator with each answer first and
returns a winner only when both orders agree; a split isORDER_DISAGREE, never a preference.
pairwise_reportgives order-swap consistency and the first-slot rate with Wilson intervals, and
PairwiseMeasureputs the check on the measure seam. - Decomposed claims:
crucible.decomposesplits a claim into typed sub-questions (yes or no, number,
choice), decides each with the same pure verdict function, combines them demote-only and names the
single weakest sub-question. The parent claim's hash is unchanged. - Minority views kept:
crucible.viewsandreport --viewslist the majority beside every minority
position with its sources, anddissent_survivalscores any summary on the minorities it kept. - New CLI commands
pairwise,decomposeandviews, and MCP toolscrucible.pairwise,
crucible.decomposeandcrucible.views(17 tools in all). - Measured with a 2B local judge in
docs/benchmarks/judging-v1: order-swap consistency 0.07, so
both-order pairwise (0.07 accuracy) lost to pointwise scoring (0.87) for that judge; decomposition
raised rerun agreement on the weakest claim from 0.20 to 0.70. Human-preference agreement is untested. - MCP tool schemas move to
crucible.mcp_schema;mcp_toolsre-exports them. The status envelope
now lists MCP tools from the schema instead of a second hand-kept list. - Claude plugin listing: the Claude manifest in
client-plugin/gains a display name, keywords,
homepage, documentation, support, privacy and terms links, and a 1024 px icon. The workspace,
measurement-command consent and measurement command now come fromuserConfig, so Claude Code
asks for them when you enable the plugin and the launch arguments carry no placeholder. The
portable and Codex manifests are unchanged. - The client README gains a data and network table, and the client privacy note names the two
temporary files the optional measurement command uses. - The client README and privacy note gain a "What this plugin runs and handles" section: hooks,
the exact Claude launch command, network use, files written and the environment variables read. - The environment section now lists what a traced run of the server read, split into Crucible's
own reads and Python's standard library reads (argument parser andtempfile). - The server code now ships inside the plugin folder at
client-plugin/server/src/, so a plugin
installed from that folder alone starts.python scripts/build_client_package.py --sync-vendored
rewrites it fromsrc/, and a test fails when the copy drifts. The launcher no longer falls back
to the repository'ssrc/; a missing copy exits with a one-line message. crucible.measurement_gatedescribes itself in plain terms, and the client privacy note says the
measurement command gets two temporary files per run.
Crucible 1.4.0
Adds local client packages with explicit launch permissions. Client-specific installation
and marketplace acceptance remain separate qualification steps.
- Add a local MCP profile with an explicit readable workspace, typed permission refusals, and process/network denial at launch. The full CLI/MCP remains available separately.
- Add portable source plugins for Claude/Codex-compatible clients and Windows x64 ZIP/MCPB packages containing the runtime, licenses, source hashes and checksums.
- Check actual stdio behavior before packaging, reject untracked or credential-like release payloads, and attach checked client assets to the same product release.
- Add an explicit launch-time grant for one fixed measurement command. Reuse bounded subprocess measurement and witnessed assessment; tool arguments and ambient environment cannot grant execution. The approved child has OS user permissions, not sandboxed access.
- Keep network retrieval and persistent-state operations on the full CLI/MCP. The client profile provides local assessment and explicitly approved measurement commands.
crucible 1.3.0
Verdict-integrity fixes, a release that carries them, and the files a user needs after
pip install. Upgrade from 1.2.0 or earlier: the fixes below change verdicts that 1.2.0 accepted.
Security and verdict integrity
Items marked "1.2.0 and earlier" shipped in a release; a GitHub security advisory for 1.2.0
accompanies this release. Items marked "unreleased" were defects in code added after 1.2.0 and
fixed before any release carried them.
- HIGH, 1.2.0 and earlier. A measurement could widen the tolerance that decides MATCH or DRIFT and
still re-derive MATCH: the deciding number was bound by no seal, atoleranceon a thesis claim
was ignored, andverify_assessmentandrecheck_assessmentrecomputed from the stored
tolerance. A claim may now seal its tolerance ("tolerance"on a thesis claim, or
make_claim(..., tolerance=)), andverdict_forrefuses a measurement carrying any other
tolerance with UNVERIFIABLE. A hand-forged MATCH with recomputed seals fails
verdicts_rederive. Reproduction: a claim that seals tolerance 0.5, a measured deviation of 8
and a measurement tolerance of 10 returned MATCH on 1.2.0 and returns UNVERIFIABLE now
(tests/fixtures/sealed-tolerance/). Claims without a sealed tolerance keep their hashes and the
old behavior; seal the tolerance on every new claim. - HIGH, 1.2.0 and earlier.
doctoremitted MATCH for three checks it never ran, and the status and
demo envelopes defaulted to MATCH. Informational envelopes now use the operational tokenOK,
anddoctorresolves each capability's entry point and reportsavailableorabsent. - MEDIUM, 1.2.0 and earlier.
verify_browser_evidenceturned a packet's own carried MATCH into
crucible's MATCH after a shape check. A well-formed packet carrying MATCH is now UNVERIFIABLE,
with the packet's claim kept undercarried_verdict; a carried DRIFT or UNVERIFIABLE still
passes through. - MEDIUM, 1.2.0 and earlier. CLI oracle replay packs must carry the template's top-level
assessment binding. A missing, malformed or mismatched thesis ID, assessment seal or measurement
seal now fails closed before replay instead of letting an unbound pack run. - LOW, 1.2.0 and earlier. The Telos content check accepted content on a 32-bit FNV-1a match alone.
When a descriptor carries a SHA-256 (content_sha256), that digest decides and a mismatch is
refused; FNV stays for protocol parity and is documented as accident-evident only. - Unreleased.
refinegraded correctness against the measurement's tolerance instead of the
claim's sealed tolerance, so a widened tolerance read as "cohesively verified" while
verdict_forrefused it. The grader now honors the seal the same way. - Unreleased.
export, the bundlespec.jsonand the cleanroom review reconstruction dropped a
sealed tolerance, so a thesis with a sealed tolerance failed its own review. The tolerance is now
carried on all three surfaces when sealed; unsealed rows stay byte-identical.
Added
ProofMeasure: a proof or type checker (Lean, Coq, any command) as a measurement oracle. An
accepted proof is MATCH, a rejected one DRIFT, and an absent or failing checker UNVERIFIABLE. The
measurement carries a recheck descriptor with the command and the artifact's SHA-256. A checker
command must be a non-empty list of non-empty strings, or the claim is UNVERIFIABLE. Library
only; the CLI and MCP server do not start it.- MCP:
crucible.recheck_templatereturnscrucible.replay-template/1over stdio, and
crucible.recheckacceptstemplate: truewhile keepingpackandtemplateexclusive. Replay
packs that recheck took: falseare normal tool results, not transport errors. - Replay interop:
crucible.replay-template/1outputs carry a privacy-bounded
crucible.replay-set/1binding over the descriptor-bearing replay contracts, without exporting
descriptorless rows or their evidence.crucible.replay-pack/1inputs preserve that binding;
supplied bindings are checked exactly, while older bound packs may omit them. A present pack
schema must be exactlycrucible.replay-pack/1; schema-less legacy packs stay compatible. crucible examples --out DIRwrites the quickstart inputs, which now ship inside the package, to
a new folder, so the README's first run works afterpip installwithout a clone. The command
refuses a folder that already exists.verify_seals.pyat the repository root: a stdlib-only verifier that re-derives an assessment
artifact's three seals without importing crucible.- Organ-bundle interop (
crucible.interop) andcrucible.interop.json, the manifest plexus reads
to wire crucible into the tool mesh.
Changed
- License: FSL-1.1-MIT (
LicenseRef-FSL-1.1-MIT) replaces the crucible Fair-Source License 1.0
for this and later versions. Versions already published keep the license they shipped with. SECURITY.mdnames the private reporting route and the supported versions.- One version, checked everywhere:
scripts/check_version_sites.pyfails whenpyproject.toml,
crucible.__version__, the README or the latest changelog heading disagree, and the release
workflow runs it against the tag.statusderives its version text from the package. - Release workflow: every action is pinned by commit. A read-only build job checks the tag and
version sites, builds, runstwine check, and smoke-tests the wheel in a fresh environment
(version, sealed-tolerance probe, packaged examples, MCP server). Only the upload job can mint a
publishing token, and its upload tolerates a re-run (skip-existing). A third job attaches the
wheel, the sdist andSHA256SUMS.txtto the GitHub Release, downloaded from PyPI and checked
against PyPI's digests and this run's build. - CI runs the version guard and the wheel smoke test.
- README: the install section shows the packaged quickstart, and presentation surfaces carry the
status, doctor, MCP and CI commands.
v1.2.0
What's Changed
- MATCH-provenance gate: witnessed vs asserted verdicts (--require-witnessed-match) by @HarperZ9 in #4
- Browser-evidence pipeline (parallel-session work, preserved + integrated) by @HarperZ9 in #6
- feat: explain missing evidence for UNVERIFIABLE and warn on ill-posed measurements by @HarperZ9 in #5
- feat(ci): native CI regression gate over registry verdicts by @HarperZ9 in #7
- Style: spectrum banner + feature-first README header by @HarperZ9 in #8
- Release v1.2.0 by @HarperZ9 in #9
Full Changelog: v1.1.0...v1.2.0
Crucible 1.1.0
Crucible checks claims against evidence and returns a closed verdict: MATCH, DRIFT, or UNVERIFIABLE. First release published to PyPI (crucible-bench) via OIDC Trusted Publishing.
crucible run THESIS --registry DIR (--measurements FILE | --substrate FILE)runs the steelman -> measurement -> witnessed assessment -> disk-recheck path as one session;--jsonemits a complete run record and--report FILEa deterministic Markdown report.- Creative measurement gate (
crucible measurement-gate) verifies Telos measurement packets without exporting raw pixels/assets/prompts; keeps the decision outcome separate from the verification verdict. - MCP parity across the status/doctor/assess/run/review/report/batch/registry/drift/refine/verdicts workflows through the same CLI contract.
- stdlib-only, zero runtime dependencies; installable console script
crucible.
Install
pip install crucible-bench
crucible --version
MPL-2.0.