You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
All notable changes to this project are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project uses [Semantic Versioning](https://semver.org/).
4
+
5
+
## [Unreleased]
6
+
7
+
## [0.1.0] - Unreleased
8
+
9
+
Initial public-alpha release candidate.
10
+
11
+
### Added
12
+
13
+
- Versioned benchmark packs and deterministic local sample execution.
14
+
- Harbor 0.18.0 Docker and optional Daytona 0.196.0 execution boundaries.
15
+
- Pi 0.80.6 trajectory capture, strict evidence validation, checksummed run bundles, and reviewer-safe projections.
16
+
- Guarded BlindBench legacy-artifact and strict-evidence upload commands.
Tests must not require paid provider calls unless they use the existing explicit live gate. Add behavior-first tests for changes to validation, publication, uploads, or evidence handling. Do not add credentials, customer data, verifier canaries, generated run output, or mutable runtime references.
26
+
27
+
## Pull requests
28
+
29
+
- Link the issue and explain the observable behavior change.
30
+
- Keep dependency and runtime-pin changes separate and explicitly approved.
31
+
- Update user or release documentation when a command or operational boundary changes.
32
+
- Do not weaken count reconciliation, identity checks, checksum checks, cleanup checks, or reviewer blinding to make a test pass.
33
+
34
+
By contributing, you agree that your contribution is licensed under the repository's MIT license.
Copy file name to clipboardExpand all lines: README.md
+44-9Lines changed: 44 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,19 @@
1
1
# Mogil Bench
2
2
3
-
Mogil Bench v1 is a local Python CLI for running versioned, real-work-like benchmark packs. It keeps Hermes/text and Pi/coding tasks distinct while exporting both as BlindBench `eval-record` v1 JSON and JSONL for blind human review.
[](CHANGELOG.md)
7
+
8
+
Mogil Bench 0.1.0 is a **public alpha** CLI for reproducible coding-agent evaluation: versioned benchmark packs, Harbor execution, checksummed evidence, reviewer-safe BlindBench exports, and deterministic paired comparisons. Its core execution/evidence path is live-proven, but command and evidence contracts may still change before a stable release.
9
+
10
+
## Status and boundaries
11
+
12
+
- Supported: Python 3.12, `harbor==0.18.0`, optional `daytona==0.196.0`, and container Pi `0.80.6`.
13
+
- Credential-free local sample and Docker fixture workflows are continuously tested.
- Local Docker is not VM-grade isolation. BlindBench campaign creation, training, PyPI publication, and backend/storage changes are outside this alpha.
16
+
- Never use customer data or secrets in packs. See [`SECURITY.md`](SECURITY.md), [`CONTRIBUTING.md`](CONTRIBUTING.md), and the [release runbook](docs/release.md).
4
17
5
18
## Install
6
19
@@ -212,16 +225,38 @@ A completed run can be re-exported offline from its retained, checksummed per-at
Create a **fresh BlindBench project** for a corrected re-export; do not upload it into a project containing rows from an earlier diagnostic import. Validate and dry-run the exact fresh-project uploads before adding `--confirm`:
228
+
Turn that completed two-arm run into BlindBench's paired-comparison CSV without rerunning a provider. Candidate configuration IDs are selected explicitly on the command line; rows are ordered by immutable task ID and one-based attempt, and only a complete quality-eligible matrix with stable task revisions is accepted. For the shipped 3-task × 2-arm × 3-attempt profile this writes exactly nine cases. Re-exporting the same evidence produces identical bytes, and validation finishes before the destination is replaced.
`context`, `candidate_a`, and `candidate_b` come only from the blinded reviewer projection. The standard `candidate_a_model`, `candidate_b_model`, and harness columns retain owner-visible, provider-qualified route and harness provenance; Mogil emits no ignored custom owner columns and adds no arm labels to reviewer-visible text. Import the CSV through BlindBench's paired-comparison flow; campaign creation remains a manual BlindBench operation.
238
+
239
+
A credential-free, fixture-backed reproduction of the nine-case contract is available from a repository checkout:
Create a **fresh BlindBench project** for a corrected re-export; do not upload it into a project containing rows from an earlier diagnostic import. Validate and dry-run the exact fresh-project uploads before adding `--confirm`. The default upload timeout is 120 seconds (bounded to at most 600); set `--timeout 120` explicitly in recorded runbooks:
The private envelope retains provider/model provenance and stable logical task/configuration identity. Its `reviewer` projection contains the shared task identity, blinded `isolated-sandbox` class, trajectory, objective outcomes, and bounded evidence—but no provider, model, vendor, configuration ID, credential, canary, absolute path, secret name, or secret value—so BlindBench can group same-task attempts without exposing the comparison arm to reviewers.
@@ -250,10 +285,10 @@ Upload is dry-run by default and validates both artifact and endpoint without ma
A real upload additionally requires `BLINDBENCH_INGEST_TOKEN` and `--confirm`. Only HTTPS `*.convex.site/ingest/v1/traces` endpoints are accepted. The CLI never prints the token or record content and reports only response counts. It treats `invalid > 0`, `truncated: true`, a malformed counts response, or an imported-plus-deduped count that differs from the intended batch size as an upload failure. Tests make no network calls.
291
+
A real upload additionally requires `BLINDBENCH_INGEST_TOKEN` and `--confirm`. Only HTTPS `*.convex.site/ingest/v1/traces` endpoints are accepted. Both upload paths default to a bounded 120-second timeout suitable for the canonical 18-record batch and accept `--timeout` values only through 600 seconds. A timeout means the outcome is unknown—the server may have completed—so Mogil never retries automatically. Check destination state, then resend the exact artifact if needed; deterministic IDs make that retry idempotent. HTTP errors report only status and a bounded, sanitized diagnostic. The CLI never prints the token or request content and reports only response counts. It treats `invalid > 0`, `truncated: true`, a malformed counts response, or an imported-plus-deduped count that differs from the intended batch size as an upload failure. Tests make no external network calls.
257
292
258
293
Prompts and outputs are reviewer-visible and free text is not automatically scrubbed by legacy BlindBench exports. Never benchmark secrets or customer data; set `privacy_class` accurately. Hidden verifier expectations are not exported.
259
294
@@ -270,9 +305,9 @@ Upload is dry-run by default. The public endpoint must be HTTPS (HTTP is accepte
The request body is a bounded batch of complete authoritative Pydantic artifacts, not reviewer projections or legacy trace records:
@@ -301,7 +336,7 @@ A successful consumer response uses exactly these completion counters (additiona
301
336
}
302
337
```
303
338
304
-
`complete` must equal the submitted `runs` count, `imported + deduped` must equal that same count, and `invalid` must be zero. A conflict or partial batch must not report a complete count. The token is a project Automation token and is never printed. Errors disclose only exception classes, never token, response body, prompts, or outputs.
339
+
`complete` must equal the submitted `runs` count, `imported + deduped` must equal that same count, and `invalid` must be zero. A conflict or partial batch must not report a complete count. The token is a project Automation token and is never printed. HTTP errors disclose only status and a bounded, sanitized diagnostic—never authorization, request payloads, or unrestricted response bodies.
Mogil Bench is a public alpha. Security fixes are applied to the latest code on `main`; no older release line is currently supported.
6
+
7
+
## Reporting a vulnerability
8
+
9
+
Do **not** open a public issue with vulnerability details, credentials, customer data, or benchmark evidence. Use the repository's **Security** tab to submit a private vulnerability report. If private reporting is unavailable, contact the repository owner, [@nmogil](https://github.com/nmogil), privately and ask for a secure reporting channel before sharing details.
10
+
11
+
Include the affected version/commit, impact, minimal reproduction, and any suggested mitigation. Remove all live credentials and private evidence from the report. Maintainers will acknowledge receipt, coordinate validation and remediation privately, and publish an advisory when appropriate.
12
+
13
+
## Operational boundaries
14
+
15
+
Mogil Bench intentionally treats benchmark packs, provider credentials, retained trajectories, hidden verifiers, and upload destinations as sensitive boundaries. The local Docker backend is not a VM-grade isolation boundary. Follow the README's explicit execution gates and never place secret values in packs, command arguments, logs, fixtures, or repository files.
This is an operator checklist, not authorization to publish. A human maintainer must review the release candidate and explicitly approve tagging and the GitHub release. PyPI publication is deferred.
4
+
5
+
## 1. Establish a clean release candidate
6
+
7
+
-[ ] Confirm the implementation PR is reviewed, merged, and all required GitHub checks pass.
8
+
-[ ] Start from an up-to-date, clean `main`; `git status --short` must be empty.
9
+
-[ ] Confirm `pyproject.toml`, `CHANGELOG.md`, and the intended tag all say `0.1.0` / `v0.1.0`.
10
+
-[ ] Confirm Python 3.12, Harbor 0.18.0, Daytona SDK 0.196.0, and container Pi 0.80.6 pins are unchanged.
-[ ] Run the organization-approved secret scan over the checkout **and Git history**; investigate every finding without printing credential values.
58
+
-[ ] Confirm fixtures and docs contain only fictional/public data.
59
+
-[ ] Confirm `packs/daytona-provider-parity-v1.yaml` uses the reviewed immutable `image@sha256` reference.
60
+
-[ ] Follow `docs/daytona-runtime-image.md` to verify that immutable runtime reference and its Python 3.12, `/bin/sh`, and Pi 0.80.6 contract. Do not rebuild or repoint it as part of this release.
61
+
-[ ] Confirm the release commit is exactly the reviewed clean `main` commit.
62
+
63
+
## 5. Publish after explicit approval
64
+
65
+
-[ ] Create the annotated `v0.1.0` tag at the reviewed release commit and push it without rewriting history.
66
+
-[ ] Create the GitHub release from that tag, mark it as a pre-release/public alpha, and use the `CHANGELOG.md` notes.
67
+
-[ ] Attach the freshly built wheel and sdist and record their SHA-256 digests.
68
+
-[ ] Recheck the tag, GitHub release assets, and immutable runtime reference from a fresh client.
69
+
-[ ] Do not publish to PyPI until package-data policy and trusted publishing receive separate approval.
0 commit comments