diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 0d72496..07346d6 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -14,19 +14,18 @@ concurrency: cancel-in-progress: true jobs: - installed-examples: + published-examples: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.11' - - name: Build and install MateProbe wheels outside the source tree - run: | - python -m pip install build - python -m build --wheel --outdir /tmp/mateprobe-wheels - python -m build --wheel packages/pytest-mateprobe --outdir /tmp/mateprobe-wheels - python -m pip install /tmp/mateprobe-wheels/*.whl -r requirements-integrations.txt + - name: Install the published MateProbe alpha from PyPI + run: >- + python -m pip install --index-url https://pypi.org/simple + mateprobe==0.1.0a4 pytest-mateprobe==0.1.0a4 + -r requirements-integrations.txt - run: python scripts/check_alpha_install.py --output /tmp/published-docs-evidence - run: python scripts/check_launch_package.py --output /tmp/launch-evidence - uses: actions/upload-artifact@v4 @@ -87,7 +86,7 @@ jobs: deploy: if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request' - needs: [build, installed-examples, historical-a2-trial, historical-a3-trial] + needs: [build, published-examples, historical-a2-trial, historical-a3-trial] runs-on: ubuntu-latest permissions: pages: write diff --git a/README.md b/README.md index f949b27..3af2840 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,9 @@ See [choosing an evaluation method](docs/choosing-an-evaluator.md). ## Install the current alpha -Install the pinned alpha from PyPI with: +Both [mateprobe](https://pypi.org/project/mateprobe/0.1.0a4/) and +[pytest-mateprobe](https://pypi.org/project/pytest-mateprobe/0.1.0a4/) are published +and verified. Install the pinned alpha with: ```sh python -m pip install mateprobe==0.1.0a4 pytest-mateprobe==0.1.0a4 diff --git a/docs/pypi-a4-verification.json b/docs/pypi-a4-verification.json new file mode 100644 index 0000000..c37e6e2 --- /dev/null +++ b/docs/pypi-a4-verification.json @@ -0,0 +1,231 @@ +{ + "version": "0.1.0a4", + "source_commit": "e842d66faa5d2dd6d8cc9a7dd8abd7e31bc49078", + "status": "passed", + "files": [ + { + "project": "mateprobe", + "filename": "mateprobe-0.1.0a4-py3-none-any.whl", + "sha256": "462419a35c7f3cdecfde6609748331aaaaf77aeaca7836bb2db89a01ea79f1ca", + "matches_release": true + }, + { + "project": "mateprobe", + "filename": "mateprobe-0.1.0a4.tar.gz", + "sha256": "b7af4085f13cf96ebca572d844ff8fe1a68afacc5666783dc456a9ea16238924", + "matches_release": true + }, + { + "project": "pytest-mateprobe", + "filename": "pytest_mateprobe-0.1.0a4-py3-none-any.whl", + "sha256": "7dfab82a48c27224c9e2b30f705530c9cde13dabb0891322ba772a5ca0cc1fef", + "matches_release": true + }, + { + "project": "pytest-mateprobe", + "filename": "pytest_mateprobe-0.1.0a4.tar.gz", + "sha256": "4c57f2ed9e0385413681199e641e0a3b825d15a7f91e581bbb004a0a9b578746", + "matches_release": true + } + ], + "installed_checks": { + "status": "passed", + "library_version": "0.1.0a4", + "policy_regression": { + "total": 3, + "counts": { + "detected": 2, + "preserved": 1 + }, + "eligible_faults": 2, + "detected_faults": 2, + "detection_score": 1.0, + "eligible_controls": 1, + "preserved_controls": 1, + "preservation_rate": 1.0, + "obligations": [ + { + "id": "refund-policy", + "description": "Refunds must be USD and no greater than the limit.", + "scope": "contract", + "assessment": "no_failures_observed", + "has_known_gaps": false, + "has_incomplete_evidence": false, + "has_fault_tests": true, + "has_controls": true, + "has_exclusions": false, + "counts": { + "detected": 2, + "preserved": 1 + }, + "case_ids": [ + "over-limit", + "unsupported-currency", + "at-limit-usd" + ] + } + ] + }, + "checks": [ + "installed paths and versions", + "consumer docs", + "CLI", + "pytest plugin", + "policy regression", + "refund demo", + "JSON Schema and Pydantic trials" + ], + "scope": "Installed artifact checks; not independent adoption or semantic accuracy." + }, + "consumer_checks": { + "status": "passed", + "versions": { + "mateprobe": "0.1.0a4", + "pytest-mateprobe": "0.1.0a4", + "pytest": "9.1.1", + "pydantic": "2.13.5" + }, + "python": "3.12.13", + "markdown_tests": 2, + "recorded_evaluations": 4, + "examples": [ + "examples/five_minute_demo.py", + "examples/mutation_audit.py", + "examples/pydantic_reply.py" + ], + "cli": "passed", + "source_sha256": { + "docs/quickstart.md": "9f2dcc6487bdfb189d6b79229c7f5cf594c9c881a476d9325d0f79de3ffff661", + "docs/agent-guide.md": "2dc449d4ee6bd7bd5801574355b71bee1dcabf9f1856de35d98e9c1c80629b5b", + "examples/five_minute_demo.py": "63f17e361c7e75fba177a9c353fd43c86eb040c8c91db0e8e5192bf3e2cb65d5", + "examples/mutation_audit.py": "7d3dba138fceb7c7589f9fbfad4396bad42998292baa8e0759184b3e191a9dac", + "examples/pydantic_reply.py": "623e036801408d7144084bba9977beba66ca5967af92abe3401fe0f26fcfe692" + }, + "scope": "Consumer example compatibility; not agent discovery or semantic accuracy." + }, + "launch_checks": { + "status": "passed", + "versions": { + "mateprobe": "0.1.0a4", + "pytest-mateprobe": "0.1.0a4" + }, + "python": "3.12.13", + "source_sha256": "66001adf0170f3deb038317dea4ee2471f505e74d7f2a1658e96ca776b57683a", + "corpus_digest": "04ab14ea8030e5082a4db05179573481f10d9a3691155d305ce67f95de2d815a", + "before": { + "total": 4, + "counts": { + "preserved": 1, + "survived": 3 + }, + "eligible_faults": 3, + "detected_faults": 0, + "detection_score": 0.0, + "eligible_controls": 1, + "preserved_controls": 1, + "preservation_rate": 1.0, + "obligations": [ + { + "id": "completion", + "description": "A completion claim needs a completed receipt for this request.", + "scope": "contract", + "assessment": "known_gaps", + "has_known_gaps": true, + "has_incomplete_evidence": false, + "has_fault_tests": true, + "has_controls": true, + "has_exclusions": false, + "counts": { + "preserved": 1, + "survived": 2 + }, + "case_ids": [ + "missing-receipt", + "wrong-request", + "honest-pending" + ] + }, + { + "id": "prose", + "description": "The prose must agree with the evidence.", + "scope": "challenge", + "assessment": "known_gaps", + "has_known_gaps": true, + "has_incomplete_evidence": false, + "has_fault_tests": true, + "has_controls": false, + "has_exclusions": false, + "counts": { + "survived": 1 + }, + "case_ids": [ + "prose-only" + ] + } + ] + }, + "after": { + "total": 4, + "counts": { + "detected": 2, + "preserved": 1, + "survived": 1 + }, + "eligible_faults": 3, + "detected_faults": 2, + "detection_score": 0.6666666666666666, + "eligible_controls": 1, + "preserved_controls": 1, + "preservation_rate": 1.0, + "obligations": [ + { + "id": "completion", + "description": "A completion claim needs a completed receipt for this request.", + "scope": "contract", + "assessment": "no_failures_observed", + "has_known_gaps": false, + "has_incomplete_evidence": false, + "has_fault_tests": true, + "has_controls": true, + "has_exclusions": false, + "counts": { + "detected": 2, + "preserved": 1 + }, + "case_ids": [ + "missing-receipt", + "wrong-request", + "honest-pending" + ] + }, + { + "id": "prose", + "description": "The prose must agree with the evidence.", + "scope": "challenge", + "assessment": "known_gaps", + "has_known_gaps": true, + "has_incomplete_evidence": false, + "has_fault_tests": true, + "has_controls": false, + "has_exclusions": false, + "counts": { + "survived": 1 + }, + "case_ids": [ + "prose-only" + ] + } + ] + }, + "pytest_checks": { + "fixed": "passed", + "removed_fix": "failed as expected; JSON retained", + "reject_all": "failed as expected; JSON retained" + }, + "scope": "Authored demo compatibility and regression behavior, not independent adoption." + }, + "publication_runs": { + "core": "https://github.com/Mate4b/mateprobe/actions/runs/36640476132", + "plugin": "https://github.com/Mate4b/mateprobe/actions/runs/36640621431" + } +} diff --git a/docs/pypi-publishing.md b/docs/pypi-publishing.md index 535f945..848eee8 100644 --- a/docs/pypi-publishing.md +++ b/docs/pypi-publishing.md @@ -8,9 +8,23 @@ The project is now **MateProbe by Mate4B**. The renamed distributions are The [GitHub alpha release](https://github.com/Mate4b/mateprobe/releases/tag/v0.1.0a4) contains wheels and source distributions built from commit `e842d66faa5d2dd6d8cc9a7dd8abd7e31bc49078`. The [artifact manifest](../scripts/release-a4.json) -pins their SHA-256 hashes. Publication under the new PyPI names is pending; -use the release wheels in the meantime. The historical verification records below -apply to their original distributions. +pins their SHA-256 hashes. Both packages are published on PyPI: +[mateprobe](https://pypi.org/project/mateprobe/0.1.0a4/) and +[pytest-mateprobe](https://pypi.org/project/pytest-mateprobe/0.1.0a4/). + +```sh +python -m pip install mateprobe==0.1.0a4 pytest-mateprobe==0.1.0a4 +``` + +All four downloaded PyPI wheel/sdist hashes match the GitHub release. A clean +Python 3.12 environment installed both packages from PyPI and passed the consumer +docs, CLI, pytest, policy-regression, integration and launch checks. Removing the +demo fix and rejecting every input both fail while retaining their JSON reports. +See [machine-readable verification](pypi-a4-verification.json), +[core publication](https://github.com/Mate4b/mateprobe/actions/runs/36640476132) and +[plugin publication](https://github.com/Mate4b/mateprobe/actions/runs/36640621431). + +The historical verification records below apply to their original distributions. ## Historical release: Narrative Contracts 0.1.0a3 diff --git a/docs/validator-audit.md b/docs/validator-audit.md index a47d48e..39d0af5 100644 --- a/docs/validator-audit.md +++ b/docs/validator-audit.md @@ -1,7 +1,7 @@ # Audit your existing validator Requires `mateprobe==0.1.0a4`. These APIs are not available in a2. -After publication, install the core and optional pytest plugin from PyPI; see the +Install the core and optional pytest plugin from PyPI; see the [migration guide](migration-mateprobe.md). An editable checkout is only needed for development. Use `audit_validator` when you already have a validator and want to test its