deterministic-scenario-engine 3.0.0__tar.gz → 3.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {deterministic_scenario_engine-3.0.0/src/deterministic_scenario_engine.egg-info → deterministic_scenario_engine-3.0.1}/PKG-INFO +24 -9
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/README.md +23 -8
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/api.md +3 -2
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/dsl2-reference.md +2 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/quickstart.md +7 -2
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/release-notes-3.0.0.md +12 -8
- deterministic_scenario_engine-3.0.1/docs/release-notes-3.0.1.md +38 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1/src/deterministic_scenario_engine.egg-info}/PKG-INFO +24 -9
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/deterministic_scenario_engine.egg-info/SOURCES.txt +1 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/_version.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/cli/main.py +31 -2
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_1_0e_packaging_release_candidate.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_2_10_workflow_demonstrators.py +2 -2
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_2_12_public_contract_docs_freeze.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_2_13_packaging_fresh_install_rc.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_2_1_v1_read_contract.py +18 -2
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_2_2_composition.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_2_3_matrix.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_2_4_batch.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_2_5_inspect_explain.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_2_7_cli_product_surface.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_3_11_public_contract_docs_freeze.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_3_1_evidence_bundle_contract.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_4_10_canonical_workflow_help.py +11 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_5_12a_r2_quickstart_installed_consumer.py +49 -2
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_5_12b_1_version_promotion.py +13 -3
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_5_6_public_cli_python_execution.py +66 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/LICENSE +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/MANIFEST.in +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/compatibility.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/determinism.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/dsl-reference.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/hypothesis.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/phase2-architecture.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/phase2-public-contract.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/phase3-architecture.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/phase3-public-contract.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/phase4-architecture.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/phase5-architecture.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/plugins.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/product-evidence-gate.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/release-notes-2.2.0.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/release-process.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/reproducibility.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/schemathesis.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/security-and-non-goals.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/sqlalchemy.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/testing-oracle.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/api_scenario.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/cart.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/control_flow.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/ecommerce.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/openapi.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/oracle_fault.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/phase0_1b_cart.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/phase0_3_resources.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/phase0_4_control_flow.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/phase0_5_oracle_fault.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/phase0_6_sqlalchemy_rows.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/phase0_7_ecommerce_plugin.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/phase0_8_api_scenario.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/phase0_8_openapi.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/phase3_ecommerce_evidence.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/resources.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/examples/sqlalchemy_rows.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/pyproject.toml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/setup.cfg +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/setup.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/deterministic_scenario_engine.egg-info/dependency_links.txt +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/deterministic_scenario_engine.egg-info/entry_points.txt +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/deterministic_scenario_engine.egg-info/requires.txt +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/deterministic_scenario_engine.egg-info/top_level.txt +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/adapters/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/adapters/json_file.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/adapters/sqlalchemy.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/address.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/artifacts.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/batch/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/batch/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/batch/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/batch/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/batch/runtime.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/cli/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/cli/__main__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/clock.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/compatibility.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/compatibility_fixtures.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/composition/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/composition/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/composition/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/composition/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/composition/parser.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/composition/resolver.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/composition/runtime.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/context.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/control_flow.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase4_11/artifacts/current-2.1.2-suite-run-v1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase4_11/artifacts/historical-1.0.0-result-v1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase4_11/artifacts/historical-2.0.0-suite-run-v1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-incomplete-suite-run-v1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-scenario-mismatch-suite-run-v1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-unknown-engine-suite-run-v1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-unknown-manifest-suite-run-v9.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-unsupported-contract.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase4_11/compatibility-fixtures.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase4_11/inputs/current-2.1.2-suite-run-v1.inputs.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase4_11/inputs/historical-2.0.0-suite-run-v1.inputs.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase4_11/scenarios/compatibility_case.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase4_11/scenarios/mismatch_case.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/artifacts/manifest-v2.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/artifacts/result-v2.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/artifacts/schedule-v1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/artifacts/suite-run-v2.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/compatibility-fixtures.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/references/legacy-result1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/corrupt-result-hash.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/duplicate-key.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/incomplete-coordinates.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/invalid-type.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/missing-field.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/mixed-contract-tuple.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/noncanonical-address.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/unknown-contract.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/unknown-engine.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/unknown-field.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-input-hashes.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-root-seed.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-scenario-hash.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-schedule-hash.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-schedule-seed.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-scheduler-contract.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/data/compatibility/phase5_10/scenarios/scenario-v2.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/definition_diff.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/diagnostics.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/diff/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/diff/compare.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/diff/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/diff/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/diff/render.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/diff/serialization.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/domain_packs/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/domain_packs/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/domain_packs/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/domain_packs/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/domain_packs/registry.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/dsl/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/dsl/actor_runtime.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/dsl/compiler.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/dsl/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/dsl/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/dsl/parser.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/dsl/runtime.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/engine2.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/evidence/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/evidence/adapter.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/evidence/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/evidence/compatibility.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/evidence/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/evidence/export.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/evidence/fixture.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/evidence/migration.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/evidence/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/evidence/read.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/expressions.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/faults.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/history.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/ids.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/impact.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/inspection/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/inspection/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/inspection/explain.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/inspection/inspect.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/inspection/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/inspection/redaction.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/inspection/serialization.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/integrations/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/integrations/hypothesis.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/integrations/schemathesis.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/invariants.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/manifest.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/matrix/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/matrix/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/matrix/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/matrix/expand.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/matrix/filtering.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/matrix/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/matrix/runtime.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/oracle.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/oracle_assertions/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/oracle_assertions/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/oracle_assertions/evaluate.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/oracle_assertions/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/oracle_assertions/serialization.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/plugins.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/provenance.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/pytest_plugin.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/reference_packs/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/reference_packs/ecommerce.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/reference_packs/ecommerce_evidence.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/resources.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/result.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/rng.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/runner.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/scaffolding.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/schedule.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/scheduler.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/state.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/suite/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/suite/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/suite/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/suite/publication.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/suite/read.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/suite/serialization.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/trace_view.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/validation.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/src/scenario_engine/values.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_0_1a_semantic_kernel.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_0_1b_linear_dsl.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_0_1c_integrated_phase0_1.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_0_1c_r1_missing_sentinel_repair.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_0_2a_reproducible_results.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_0_2b_json_pytest_integration.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_0_3_resources_constraints.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_0_4_control_flow.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_0_5_oracle_faults.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_0_6_sqlalchemy_materializer.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_0_7_plugins_ecommerce.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_0_8_hypothesis_schemathesis.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_1_0b_public_api_error_contract.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_1_0c_dsl_compatibility_contract.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_1_0d_documentation_examples.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_2_11_performance_scale_hardening.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_2_1_models_serialization.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_2_6_structured_semantic_diff.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_2_8_domain_pack_foundation.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_2_9_oracle_assertions.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_3_10_performance_security_hardening.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_3_12_packaging_fresh_install_rc.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_3_2_safe_bundle_reader_validator.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_3_3_ordered_export.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_3_4_evidence_adapter_contract.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_3_5_compatibility_migration_planner.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_3_6_lossless_migrations_fixture_export.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_3_7_cli_interchange_surface.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_3_8_ecommerce_evidence_workflow.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_4_11_cross_version_fixtures.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_4_12_hardening.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_4_12r2_public_fixture_packaging.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_4_12r3_consumer_secret_redaction.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_4_1_cli_replay_workflow.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_4_2_replay_compatibility_diagnostics.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_4_3_filesystem_trust_boundary.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_4_4_actionable_human_diagnostics.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_4_5_machine_readable_error_envelope.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_4_6_author_time_scaffolding.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_4_7_scenario_definition_structural_diff.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_4_8_conservative_impact_analysis.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_4_9_static_trace_viewer.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_5_10_public_api_cli_compatibility_fixtures.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_5_11_performance_security_contract_freeze.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_5_1_dsl2_actor_lane_foundation.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_5_2_scheduler_kernel.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_5_3_actor_execution_shared_state.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_5_4_schedule_identity_replay.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_5_5_result2_engine2_compatibility.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_5_7_actor_aware_analysis.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_phase_5_9_actor_aware_static_trace_viewer.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_readme_pypi_portability.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/tests/test_test_portability.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deterministic-scenario-engine
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.1
|
|
4
4
|
Summary: Reproducible, state-consistent business scenarios with deterministic ground truth
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://github.com/imshahinul/deterministic-scenario-engine
|
|
@@ -41,11 +41,13 @@ Dynamic: license-file
|
|
|
41
41
|
|
|
42
42
|
Deterministic Scenario Engine (DSE) creates reproducible, state-consistent
|
|
43
43
|
business histories and deterministic scenario suites with ground truth for
|
|
44
|
-
testing.
|
|
44
|
+
testing. Distribution 3.0.0 was published on October 9, 2026, on
|
|
45
|
+
[PyPI](https://pypi.org/project/deterministic-scenario-engine/3.0.0/) and as a
|
|
46
|
+
[GitHub Release](https://github.com/imshahinul/deterministic-scenario-engine/releases/tag/3.0.0).
|
|
45
47
|
Distribution and execution compatibility identities are separate: public
|
|
46
48
|
`ENGINE_VERSION` is 2.0.0, while the preserved DSL 1 path records Engine 1.0.0.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
PyPI and GitHub Releases remain authoritative for public-release availability
|
|
50
|
+
and history.
|
|
49
51
|
|
|
50
52
|
## Why it exists
|
|
51
53
|
|
|
@@ -84,9 +86,9 @@ make expected behavior explicit.
|
|
|
84
86
|
- canonical evidence bundles, ordered JSON/JSONL export, compatibility reports,
|
|
85
87
|
explicit adapters, closed lossless migrations, and fixture-directory export
|
|
86
88
|
|
|
87
|
-
The 3.0.0
|
|
89
|
+
The 3.0.0 release adds Engine 2.0.0 and DSL 2 while preserving Engine 1/DSL 1
|
|
88
90
|
behavior and immutable evidence. See the
|
|
89
|
-
[3.0.0
|
|
91
|
+
[3.0.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md).
|
|
90
92
|
|
|
91
93
|
Core execution does not require a database, network service, plugin, or property
|
|
92
94
|
testing framework. See [security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md).
|
|
@@ -106,6 +108,18 @@ python3 -m pip install deterministic-scenario-engine
|
|
|
106
108
|
scenario --help
|
|
107
109
|
```
|
|
108
110
|
|
|
111
|
+
Verify that the same active Python interpreter sees the expected distribution
|
|
112
|
+
and observe the module location it actually imports:
|
|
113
|
+
|
|
114
|
+
```console
|
|
115
|
+
python3 -c 'from importlib.metadata import version; from pathlib import Path; import scenario_engine; print("DSE distribution:", version("deterministic-scenario-engine")); print("Imported module:", Path(scenario_engine.__file__).resolve())'
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
For this release the distribution is `3.0.1`; a source-development editable
|
|
119
|
+
install resolves the module under its `src/scenario_engine` directory. The DSE
|
|
120
|
+
distribution version is distinct from Engine 1 (`1.0.0`) and Engine 2 (`2.0.0`)
|
|
121
|
+
compatibility versions.
|
|
122
|
+
|
|
109
123
|
Install only the named optional integrations you need:
|
|
110
124
|
|
|
111
125
|
```console
|
|
@@ -165,15 +179,16 @@ self-contained offline HTML file from supported result/evidence.
|
|
|
165
179
|
- [Security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md)
|
|
166
180
|
- [Compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md)
|
|
167
181
|
- [2.2.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-2.2.0.md)
|
|
168
|
-
- [3.0.0
|
|
182
|
+
- [3.0.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md)
|
|
183
|
+
- [3.0.1 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.1.md)
|
|
169
184
|
- [Phase 2 public contract, CLI, and hard bounds](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md)
|
|
170
185
|
- [Phase 3 public contract and evidence interchange](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md)
|
|
171
186
|
|
|
172
187
|
## Status
|
|
173
188
|
|
|
174
189
|
Distribution release identity and deterministic engine compatibility are
|
|
175
|
-
separate contracts. This
|
|
176
|
-
|
|
190
|
+
separate contracts. This source tree reports published distribution version
|
|
191
|
+
3.0.1 and public Engine 2.0.0. Engine 1 manifests remain exactly 1.0.0
|
|
177
192
|
with integer DSL 1; Engine 2 manifests use 2.0.0 with integer DSL 2. Supported
|
|
178
193
|
Python versions are 3.11–3.14. Suite Run/2 is reader/schema support only; Engine
|
|
179
194
|
2 suite orchestration, cross-major promotion, remote URI input, and implicit
|
|
@@ -4,11 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
Deterministic Scenario Engine (DSE) creates reproducible, state-consistent
|
|
6
6
|
business histories and deterministic scenario suites with ground truth for
|
|
7
|
-
testing.
|
|
7
|
+
testing. Distribution 3.0.0 was published on October 9, 2026, on
|
|
8
|
+
[PyPI](https://pypi.org/project/deterministic-scenario-engine/3.0.0/) and as a
|
|
9
|
+
[GitHub Release](https://github.com/imshahinul/deterministic-scenario-engine/releases/tag/3.0.0).
|
|
8
10
|
Distribution and execution compatibility identities are separate: public
|
|
9
11
|
`ENGINE_VERSION` is 2.0.0, while the preserved DSL 1 path records Engine 1.0.0.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
PyPI and GitHub Releases remain authoritative for public-release availability
|
|
13
|
+
and history.
|
|
12
14
|
|
|
13
15
|
## Why it exists
|
|
14
16
|
|
|
@@ -47,9 +49,9 @@ make expected behavior explicit.
|
|
|
47
49
|
- canonical evidence bundles, ordered JSON/JSONL export, compatibility reports,
|
|
48
50
|
explicit adapters, closed lossless migrations, and fixture-directory export
|
|
49
51
|
|
|
50
|
-
The 3.0.0
|
|
52
|
+
The 3.0.0 release adds Engine 2.0.0 and DSL 2 while preserving Engine 1/DSL 1
|
|
51
53
|
behavior and immutable evidence. See the
|
|
52
|
-
[3.0.0
|
|
54
|
+
[3.0.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md).
|
|
53
55
|
|
|
54
56
|
Core execution does not require a database, network service, plugin, or property
|
|
55
57
|
testing framework. See [security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md).
|
|
@@ -69,6 +71,18 @@ python3 -m pip install deterministic-scenario-engine
|
|
|
69
71
|
scenario --help
|
|
70
72
|
```
|
|
71
73
|
|
|
74
|
+
Verify that the same active Python interpreter sees the expected distribution
|
|
75
|
+
and observe the module location it actually imports:
|
|
76
|
+
|
|
77
|
+
```console
|
|
78
|
+
python3 -c 'from importlib.metadata import version; from pathlib import Path; import scenario_engine; print("DSE distribution:", version("deterministic-scenario-engine")); print("Imported module:", Path(scenario_engine.__file__).resolve())'
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
For this release the distribution is `3.0.1`; a source-development editable
|
|
82
|
+
install resolves the module under its `src/scenario_engine` directory. The DSE
|
|
83
|
+
distribution version is distinct from Engine 1 (`1.0.0`) and Engine 2 (`2.0.0`)
|
|
84
|
+
compatibility versions.
|
|
85
|
+
|
|
72
86
|
Install only the named optional integrations you need:
|
|
73
87
|
|
|
74
88
|
```console
|
|
@@ -128,15 +142,16 @@ self-contained offline HTML file from supported result/evidence.
|
|
|
128
142
|
- [Security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md)
|
|
129
143
|
- [Compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md)
|
|
130
144
|
- [2.2.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-2.2.0.md)
|
|
131
|
-
- [3.0.0
|
|
145
|
+
- [3.0.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md)
|
|
146
|
+
- [3.0.1 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.1.md)
|
|
132
147
|
- [Phase 2 public contract, CLI, and hard bounds](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md)
|
|
133
148
|
- [Phase 3 public contract and evidence interchange](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md)
|
|
134
149
|
|
|
135
150
|
## Status
|
|
136
151
|
|
|
137
152
|
Distribution release identity and deterministic engine compatibility are
|
|
138
|
-
separate contracts. This
|
|
139
|
-
|
|
153
|
+
separate contracts. This source tree reports published distribution version
|
|
154
|
+
3.0.1 and public Engine 2.0.0. Engine 1 manifests remain exactly 1.0.0
|
|
140
155
|
with integer DSL 1; Engine 2 manifests use 2.0.0 with integer DSL 2. Supported
|
|
141
156
|
Python versions are 3.11–3.14. Suite Run/2 is reader/schema support only; Engine
|
|
142
157
|
2 suite orchestration, cross-major promotion, remote URI input, and implicit
|
|
@@ -13,8 +13,9 @@ exports.
|
|
|
13
13
|
- `scenario_engine._version.ENGINE1_VERSION` — explicit historical Engine 1
|
|
14
14
|
execution coordinate, `1.0.0`; not added to the frozen package-root exports.
|
|
15
15
|
|
|
16
|
-
- `ENGINE_VERSION` — engine compatibility version recorded in manifests
|
|
17
|
-
|
|
16
|
+
- `ENGINE_VERSION` — engine compatibility version recorded in manifests:
|
|
17
|
+
Engine 1 Manifest/1 records 1.0.0, while Engine 2 Manifest/2 records 2.0.0;
|
|
18
|
+
both are independent of the distribution version.
|
|
18
19
|
- `MISSING` — singleton semantic missing value, distinct from null.
|
|
19
20
|
- `LogicalID(value: str)` — deterministic logical identifier value; users
|
|
20
21
|
normally receive it from `$id` generation.
|
{deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/dsl2-reference.md
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# DSL 2 logical-actor reference
|
|
2
2
|
|
|
3
|
-
**Status:
|
|
3
|
+
**Status: RELEASED — DSE distribution 3.0.0, published October 9, 2026.** See
|
|
4
|
+
the [GitHub Release](https://github.com/imshahinul/deterministic-scenario-engine/releases/tag/3.0.0).
|
|
4
5
|
|
|
5
6
|
DSL 2 is selected only by integer `dsl_version: 2` and executes with Engine
|
|
6
7
|
2.0.0. It preserves DSL 1 expression, deterministic value, resource, plugin,
|
{deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.0.1}/docs/quickstart.md
RENAMED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# Canonical installed-package workflows
|
|
2
2
|
|
|
3
|
-
**3.0.
|
|
4
|
-
qualified candidate installation and do not assert that 3.0.0 is on PyPI.
|
|
3
|
+
**3.0.1 release documentation.** These commands apply to distribution 3.0.1.
|
|
5
4
|
|
|
6
5
|
This is the canonical DSE user workflow document. Every ordinary command below
|
|
7
6
|
uses the installed package and portable files created here; no source checkout,
|
|
@@ -16,6 +15,7 @@ example, a symlinked temporary-directory prefix) at filesystem trust boundaries.
|
|
|
16
15
|
|
|
17
16
|
```console
|
|
18
17
|
python3 -m pip install deterministic-scenario-engine
|
|
18
|
+
python3 -c 'from importlib.metadata import version; from pathlib import Path; import scenario_engine; print("DSE distribution:", version("deterministic-scenario-engine")); print("Imported module:", Path(scenario_engine.__file__).resolve())'
|
|
19
19
|
export DSE_DEMO="$(cd "${TMPDIR:-/tmp}" && pwd -P)/dse-demo"
|
|
20
20
|
rm -rf "$DSE_DEMO"
|
|
21
21
|
mkdir -p "$DSE_DEMO"
|
|
@@ -37,6 +37,11 @@ sed 's/{$literal: 1}/{$literal: 2}/' "$DSE_DEMO/scenario.yaml" > "$DSE_DEMO/scen
|
|
|
37
37
|
scenario --help
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
+
The identity check uses the same active Python interpreter as installation. It
|
|
41
|
+
should report DSE distribution `3.0.1`; the resolved module path shows the code
|
|
42
|
+
Python actually imports. This distribution version is distinct from Engine 1
|
|
43
|
+
(`1.0.0`) and Engine 2 (`2.0.0`) compatibility versions.
|
|
44
|
+
|
|
40
45
|
Installing a checkout with `python3 -m pip install .` is
|
|
41
46
|
**source-development-only**. Installed-package workflows are primary.
|
|
42
47
|
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
# Deterministic Scenario Engine 3.0.0
|
|
1
|
+
# Deterministic Scenario Engine 3.0.0
|
|
2
2
|
|
|
3
|
-
**Status:
|
|
4
|
-
|
|
3
|
+
**Status: RELEASED October 9, 2026.** Distribution 3.0.0 is published on
|
|
4
|
+
[PyPI](https://pypi.org/project/deterministic-scenario-engine/3.0.0/) and as a
|
|
5
|
+
[GitHub Release](https://github.com/imshahinul/deterministic-scenario-engine/releases/tag/3.0.0).
|
|
6
|
+
|
|
7
|
+
This copy on `main` records the post-release publication state. The original
|
|
8
|
+
published 3.0.0 tag retains the historical prepublication release-notes bytes.
|
|
5
9
|
|
|
6
10
|
## Added
|
|
7
11
|
|
|
@@ -38,8 +42,8 @@ promotion is supported.
|
|
|
38
42
|
|
|
39
43
|
## Publication verification
|
|
40
44
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
DSL 1 and DSL 2 run/replay and
|
|
45
|
-
|
|
45
|
+
The published release uses the exact retained reproducible wheel and sdist.
|
|
46
|
+
Their production PyPI and GitHub Release SHA256 digests match the qualification
|
|
47
|
+
evidence. Release verification installed the published artifacts outside the
|
|
48
|
+
source tree on every supported Python, reran DSL 1 and DSL 2 run/replay and
|
|
49
|
+
hostile-input smokes, and inspected rendered metadata and links.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Deterministic Scenario Engine 3.0.1
|
|
2
|
+
|
|
3
|
+
DSE 3.0.1 is a compatibility-preserving patch release. The distribution version
|
|
4
|
+
advances from 3.0.0 to 3.0.1; Engine 1/Manifest 1 remains 1.0.0 and Engine
|
|
5
|
+
2/Manifest 2 remains 2.0.0. DSL, schema, canonical serialization, CLI grammar,
|
|
6
|
+
and public Python API contracts are unchanged.
|
|
7
|
+
|
|
8
|
+
## Changes since 3.0.0
|
|
9
|
+
|
|
10
|
+
- Clarifies Engine 2 replay help, including the required Schedule/1 input.
|
|
11
|
+
- Makes missing-schedule human diagnostics actionable while preserving the
|
|
12
|
+
machine-readable error contract.
|
|
13
|
+
- Includes safe, allowlisted failing-field identifiers in relevant diagnostics
|
|
14
|
+
without exposing arbitrary input values.
|
|
15
|
+
- Improves installed-distribution identity onboarding so users can verify both
|
|
16
|
+
package metadata and the module path imported by the active interpreter.
|
|
17
|
+
- Clarifies the distinction between distribution, engine, and manifest versions.
|
|
18
|
+
- Extends regression and release-maintenance coverage, including permanent
|
|
19
|
+
verification of authentic historical release tags.
|
|
20
|
+
|
|
21
|
+
The earlier TRACK-A4 repair aligned a maintainer's local editable environment;
|
|
22
|
+
it is not a shipped runtime feature of this release.
|
|
23
|
+
|
|
24
|
+
## Compatibility and upgrade guidance
|
|
25
|
+
|
|
26
|
+
Python 3.11, 3.12, 3.13, and 3.14 remain declared as supported. The runtime
|
|
27
|
+
dependency remains `PyYAML==6.0.3`. Upgrade the distribution through the same
|
|
28
|
+
Python interpreter used to run DSE, then verify `importlib.metadata.version` and
|
|
29
|
+
`scenario_engine.__file__` as shown in the quickstart. Existing Engine 1 and
|
|
30
|
+
Engine 2 evidence retains its established compatibility and fail-closed replay
|
|
31
|
+
checks.
|
|
32
|
+
|
|
33
|
+
## Known limits
|
|
34
|
+
|
|
35
|
+
Engine 2 suite orchestration, cross-major promotion, remote URI input, implicit
|
|
36
|
+
schedule-seed derivation, distributed execution, and evidence federation remain
|
|
37
|
+
unsupported. This patch does not introduce new engine algorithms, performance
|
|
38
|
+
claims, scientific benchmarks, or security certification.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deterministic-scenario-engine
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.1
|
|
4
4
|
Summary: Reproducible, state-consistent business scenarios with deterministic ground truth
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://github.com/imshahinul/deterministic-scenario-engine
|
|
@@ -41,11 +41,13 @@ Dynamic: license-file
|
|
|
41
41
|
|
|
42
42
|
Deterministic Scenario Engine (DSE) creates reproducible, state-consistent
|
|
43
43
|
business histories and deterministic scenario suites with ground truth for
|
|
44
|
-
testing.
|
|
44
|
+
testing. Distribution 3.0.0 was published on October 9, 2026, on
|
|
45
|
+
[PyPI](https://pypi.org/project/deterministic-scenario-engine/3.0.0/) and as a
|
|
46
|
+
[GitHub Release](https://github.com/imshahinul/deterministic-scenario-engine/releases/tag/3.0.0).
|
|
45
47
|
Distribution and execution compatibility identities are separate: public
|
|
46
48
|
`ENGINE_VERSION` is 2.0.0, while the preserved DSL 1 path records Engine 1.0.0.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
PyPI and GitHub Releases remain authoritative for public-release availability
|
|
50
|
+
and history.
|
|
49
51
|
|
|
50
52
|
## Why it exists
|
|
51
53
|
|
|
@@ -84,9 +86,9 @@ make expected behavior explicit.
|
|
|
84
86
|
- canonical evidence bundles, ordered JSON/JSONL export, compatibility reports,
|
|
85
87
|
explicit adapters, closed lossless migrations, and fixture-directory export
|
|
86
88
|
|
|
87
|
-
The 3.0.0
|
|
89
|
+
The 3.0.0 release adds Engine 2.0.0 and DSL 2 while preserving Engine 1/DSL 1
|
|
88
90
|
behavior and immutable evidence. See the
|
|
89
|
-
[3.0.0
|
|
91
|
+
[3.0.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md).
|
|
90
92
|
|
|
91
93
|
Core execution does not require a database, network service, plugin, or property
|
|
92
94
|
testing framework. See [security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md).
|
|
@@ -106,6 +108,18 @@ python3 -m pip install deterministic-scenario-engine
|
|
|
106
108
|
scenario --help
|
|
107
109
|
```
|
|
108
110
|
|
|
111
|
+
Verify that the same active Python interpreter sees the expected distribution
|
|
112
|
+
and observe the module location it actually imports:
|
|
113
|
+
|
|
114
|
+
```console
|
|
115
|
+
python3 -c 'from importlib.metadata import version; from pathlib import Path; import scenario_engine; print("DSE distribution:", version("deterministic-scenario-engine")); print("Imported module:", Path(scenario_engine.__file__).resolve())'
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
For this release the distribution is `3.0.1`; a source-development editable
|
|
119
|
+
install resolves the module under its `src/scenario_engine` directory. The DSE
|
|
120
|
+
distribution version is distinct from Engine 1 (`1.0.0`) and Engine 2 (`2.0.0`)
|
|
121
|
+
compatibility versions.
|
|
122
|
+
|
|
109
123
|
Install only the named optional integrations you need:
|
|
110
124
|
|
|
111
125
|
```console
|
|
@@ -165,15 +179,16 @@ self-contained offline HTML file from supported result/evidence.
|
|
|
165
179
|
- [Security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md)
|
|
166
180
|
- [Compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md)
|
|
167
181
|
- [2.2.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-2.2.0.md)
|
|
168
|
-
- [3.0.0
|
|
182
|
+
- [3.0.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md)
|
|
183
|
+
- [3.0.1 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.1.md)
|
|
169
184
|
- [Phase 2 public contract, CLI, and hard bounds](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md)
|
|
170
185
|
- [Phase 3 public contract and evidence interchange](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md)
|
|
171
186
|
|
|
172
187
|
## Status
|
|
173
188
|
|
|
174
189
|
Distribution release identity and deterministic engine compatibility are
|
|
175
|
-
separate contracts. This
|
|
176
|
-
|
|
190
|
+
separate contracts. This source tree reports published distribution version
|
|
191
|
+
3.0.1 and public Engine 2.0.0. Engine 1 manifests remain exactly 1.0.0
|
|
177
192
|
with integer DSL 1; Engine 2 manifests use 2.0.0 with integer DSL 2. Supported
|
|
178
193
|
Python versions are 3.11–3.14. Suite Run/2 is reader/schema support only; Engine
|
|
179
194
|
2 suite orchestration, cross-major promotion, remote URI input, and implicit
|
|
@@ -220,7 +220,11 @@ def _parser() -> argparse.ArgumentParser:
|
|
|
220
220
|
"Missing required replay data fails closed with exit 5."
|
|
221
221
|
),
|
|
222
222
|
)
|
|
223
|
-
replay.add_argument(
|
|
223
|
+
replay.add_argument(
|
|
224
|
+
"source",
|
|
225
|
+
help=("local suite.run/1 or scenario.result/2 artifact path (or - for stdin); "
|
|
226
|
+
"scenario.result/2 replay requires scenario.schedule/1 via --schedule"),
|
|
227
|
+
)
|
|
224
228
|
replay.add_argument("--scenario", required=True, help="explicit local scenario YAML path")
|
|
225
229
|
replay.add_argument(
|
|
226
230
|
"--inputs",
|
|
@@ -1290,6 +1294,29 @@ def _render_replay_human(diagnostic: HumanDiagnostic) -> None:
|
|
|
1290
1294
|
_diagnostic("; ".join(fields))
|
|
1291
1295
|
|
|
1292
1296
|
|
|
1297
|
+
_SAFE_ENGINE2_EVIDENCE_FIELDS = frozenset({
|
|
1298
|
+
"actors", "artifacts", "classification", "contract", "dsl_version", "engine_version",
|
|
1299
|
+
"evidence", "execution", "execution.dsl_version", "execution.engine_version",
|
|
1300
|
+
"execution.generator_versions", "execution.id_algorithm_version", "execution.locale",
|
|
1301
|
+
"execution.reference_clock_start", "execution.rng_algorithm_version", "execution.root_seed",
|
|
1302
|
+
"failure", "final_logical_clock", "final_state", "generator_versions", "history",
|
|
1303
|
+
"input_resource_hashes", "json", "manifest", "manifest_hash", "members", "outcome",
|
|
1304
|
+
"outcome.schedule", "records", "records.outcome", "records.ready_actors",
|
|
1305
|
+
"records.selected_actor", "reference_clock_start", "result", "result_hash", "root_seed",
|
|
1306
|
+
"run_index", "scenario_hash", "scenario_id", "schedule", "schedule_hash",
|
|
1307
|
+
"schedule_reference", "schedule_reference.contract", "schedule_reference.scenario_hash",
|
|
1308
|
+
"schedule_reference.schedule_hash", "schedule_seed", "scheduler_contract", "semantic value",
|
|
1309
|
+
"suite", "suite_hash", "terminal", "terminal.classification", "terminal.failure",
|
|
1310
|
+
})
|
|
1311
|
+
|
|
1312
|
+
|
|
1313
|
+
def _render_engine2_evidence_human(diagnostic: HumanDiagnostic, field: str) -> None:
|
|
1314
|
+
"""Render one source-defined field identifier without reflecting supplied values."""
|
|
1315
|
+
sys.stderr.write(render_human_diagnostic(diagnostic))
|
|
1316
|
+
if field in _SAFE_ENGINE2_EVIDENCE_FIELDS:
|
|
1317
|
+
sys.stderr.write(f"field:\n{field}\n")
|
|
1318
|
+
|
|
1319
|
+
|
|
1293
1320
|
def _path_reason(error: Exception) -> PathReason | None:
|
|
1294
1321
|
"""Classify existing path-security failures without replacing their checks."""
|
|
1295
1322
|
if isinstance(error, _CLIError):
|
|
@@ -1435,6 +1462,8 @@ def main(argv: Sequence[str] | None = None) -> int:
|
|
|
1435
1462
|
)
|
|
1436
1463
|
if json_mode:
|
|
1437
1464
|
_emit_machine(diagnostic, error.code)
|
|
1465
|
+
elif error.diagnostic_code == "SCHEDULE_EVIDENCE_REQUIRED":
|
|
1466
|
+
sys.stderr.write(render_human_diagnostic(diagnostic))
|
|
1438
1467
|
else:
|
|
1439
1468
|
_diagnostic(str(error))
|
|
1440
1469
|
return int(error.code)
|
|
@@ -1489,7 +1518,7 @@ def main(argv: Sequence[str] | None = None) -> int:
|
|
|
1489
1518
|
if json_mode:
|
|
1490
1519
|
_emit_machine(diagnostic, code)
|
|
1491
1520
|
else:
|
|
1492
|
-
|
|
1521
|
+
_render_engine2_evidence_human(diagnostic, error.field)
|
|
1493
1522
|
return int(code)
|
|
1494
1523
|
if code is CLIExitCode.INTERNAL:
|
|
1495
1524
|
message = "unexpected internal error"
|
|
@@ -54,7 +54,7 @@ class Phase10EPackagingReleaseCandidateTests(unittest.TestCase):
|
|
|
54
54
|
"scenario_engine._version.VERSION",
|
|
55
55
|
)
|
|
56
56
|
# Phase 2 changes package identity, not the frozen deterministic contract.
|
|
57
|
-
self.assertEqual(VERSION, "3.0.
|
|
57
|
+
self.assertEqual(VERSION, "3.0.1")
|
|
58
58
|
self.assertEqual(ENGINE_VERSION, "2.0.0")
|
|
59
59
|
|
|
60
60
|
def test_license_readme_and_build_backend_metadata(self):
|
|
@@ -148,7 +148,7 @@ def test_fresh_tree_wheel_supports_workflow_public_commands(tmp_path: Path) -> N
|
|
|
148
148
|
check=True,
|
|
149
149
|
)
|
|
150
150
|
wheels = list(wheelhouse.glob(f"deterministic_scenario_engine-{VERSION}-*.whl"))
|
|
151
|
-
assert VERSION == "3.0.
|
|
151
|
+
assert VERSION == "3.0.1"
|
|
152
152
|
assert len(wheels) == 1
|
|
153
153
|
wheel = wheels[0]
|
|
154
154
|
installed = tmp_path / "installed"
|
|
@@ -175,7 +175,7 @@ def test_fresh_tree_wheel_supports_workflow_public_commands(tmp_path: Path) -> N
|
|
|
175
175
|
text=True,
|
|
176
176
|
)
|
|
177
177
|
distribution_version, import_path = identity.stdout.splitlines()
|
|
178
|
-
assert distribution_version == VERSION == "3.0.
|
|
178
|
+
assert distribution_version == VERSION == "3.0.1"
|
|
179
179
|
assert Path(import_path).is_relative_to(installed)
|
|
180
180
|
validate = subprocess.run(
|
|
181
181
|
[sys.executable, "-m", "scenario_engine.cli", "--json", "validate", "examples/cart.yaml"],
|
|
@@ -63,7 +63,7 @@ def test_versions_errors_commands_and_entry_points_are_frozen() -> None:
|
|
|
63
63
|
from scenario_engine.oracle_assertions import ORACLE_ASSERTION_SCHEMA_VERSION
|
|
64
64
|
from scenario_engine.suite import READ_SCHEMA_VERSION, SUITE_SCHEMA_VERSION
|
|
65
65
|
|
|
66
|
-
assert VERSION == "3.0.
|
|
66
|
+
assert VERSION == "3.0.1"
|
|
67
67
|
assert (COMPOSITION_CONTRACT_VERSION, MATRIX_PLAN_CONTRACT_VERSION) == (
|
|
68
68
|
"composition.modules/1", "matrix.plan/1")
|
|
69
69
|
assert (READ_SCHEMA_VERSION, SUITE_SCHEMA_VERSION) == (
|
|
@@ -59,7 +59,7 @@ def _cases():
|
|
|
59
59
|
def test_version_roles_are_explicit_and_dsl_remains_one() -> None:
|
|
60
60
|
config = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8"))
|
|
61
61
|
assert config["tool"]["setuptools"]["dynamic"]["version"]["attr"] == "scenario_engine._version.VERSION"
|
|
62
|
-
assert VERSION == "3.0.
|
|
62
|
+
assert VERSION == "3.0.1"
|
|
63
63
|
assert ENGINE_VERSION == scenario_engine.ENGINE_VERSION == "2.0.0"
|
|
64
64
|
assert ENGINE1_VERSION == "1.0.0"
|
|
65
65
|
_, result = _result("cart.yaml", "s")
|
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from hashlib import sha256
|
|
4
4
|
import importlib
|
|
5
|
+
import inspect
|
|
5
6
|
import json
|
|
6
7
|
from pathlib import Path
|
|
7
8
|
import unittest
|
|
@@ -100,12 +101,27 @@ class V1ReadTests(unittest.TestCase):
|
|
|
100
101
|
|
|
101
102
|
def test_suite_import_has_no_runtime_side_effects(self):
|
|
102
103
|
import scenario_engine.suite as suite
|
|
103
|
-
|
|
104
|
+
|
|
105
|
+
real_open = open
|
|
106
|
+
|
|
107
|
+
def reject_module_file_io(*args, **kwargs):
|
|
108
|
+
frame = inspect.currentframe().f_back
|
|
109
|
+
while frame is not None and frame.f_globals.get("__name__") == "unittest.mock":
|
|
110
|
+
frame = frame.f_back
|
|
111
|
+
if (
|
|
112
|
+
frame is not None
|
|
113
|
+
and frame.f_globals.get("__name__") == "_pytest.assertion.rewrite"
|
|
114
|
+
and frame.f_code.co_name == "_read_pyc"
|
|
115
|
+
):
|
|
116
|
+
return real_open(*args, **kwargs)
|
|
117
|
+
raise AssertionError("file attempted")
|
|
118
|
+
|
|
119
|
+
with patch("builtins.open", side_effect=reject_module_file_io):
|
|
104
120
|
self.assertIs(importlib.reload(suite), suite)
|
|
105
121
|
|
|
106
122
|
def test_v1_api_version_and_three_result_goldens_remain_unchanged(self):
|
|
107
123
|
expected = scenario_engine.__all__
|
|
108
|
-
self.assertEqual(VERSION, "3.0.
|
|
124
|
+
self.assertEqual(VERSION, "3.0.1")
|
|
109
125
|
self.assertEqual(scenario_engine.__all__, expected)
|
|
110
126
|
cart_source = (ROOT / "examples" / "phase0_1b_cart.yaml").read_text()
|
|
111
127
|
cart = run_scenario(compile_document(parse_yaml(cart_source)), "s")
|
|
@@ -376,7 +376,7 @@ def test_suite_manifest_identity_order_child_reference_and_v1_preservation(tmp_p
|
|
|
376
376
|
|
|
377
377
|
def test_top_level_api_and_v1_parser_are_unchanged(tmp_path: Path) -> None:
|
|
378
378
|
assert "load_composed_suite" not in scenario_engine.__all__
|
|
379
|
-
assert VERSION == "3.0.
|
|
379
|
+
assert VERSION == "3.0.1"
|
|
380
380
|
root_without_composition = _root(" alpha: alpha.yaml").replace(
|
|
381
381
|
"composition:\n modules:\n alpha: alpha.yaml\n", "",
|
|
382
382
|
)
|
|
@@ -235,7 +235,7 @@ steps:
|
|
|
235
235
|
|
|
236
236
|
def test_top_level_api_and_package_version_are_unchanged() -> None:
|
|
237
237
|
assert "MatrixPlan" not in scenario_engine.__all__
|
|
238
|
-
assert VERSION == "3.0.
|
|
238
|
+
assert VERSION == "3.0.1"
|
|
239
239
|
|
|
240
240
|
|
|
241
241
|
def test_static_matrix_package_has_no_nondeterministic_or_unsafe_imports() -> None:
|
|
@@ -277,7 +277,7 @@ def test_public_boundary_version_preservation_and_static_safety() -> None:
|
|
|
277
277
|
from scenario_engine._version import VERSION
|
|
278
278
|
|
|
279
279
|
assert "BatchPlan" not in scenario_engine.__all__
|
|
280
|
-
assert VERSION == "3.0.
|
|
280
|
+
assert VERSION == "3.0.1"
|
|
281
281
|
forbidden = {"random", "secrets", "socket", "subprocess", "importlib", "os", "time", "urllib"}
|
|
282
282
|
root = Path(__file__).parents[1] / "src/scenario_engine/batch"
|
|
283
283
|
for path in root.glob("*.py"):
|
|
@@ -151,4 +151,4 @@ def test_bounds_are_exact_and_fail_deterministically(monkeypatch) -> None:
|
|
|
151
151
|
|
|
152
152
|
def test_root_api_and_package_version_remain_frozen() -> None:
|
|
153
153
|
assert "inspect_result" not in scenario_engine.__all__
|
|
154
|
-
assert VERSION == "3.0.
|
|
154
|
+
assert VERSION == "3.0.1"
|
|
@@ -250,4 +250,4 @@ def test_cli_static_purity_version_and_console_script_contract() -> None:
|
|
|
250
250
|
assert imported.isdisjoint(forbidden)
|
|
251
251
|
pyproject = (ROOT / "pyproject.toml").read_text(encoding="utf-8")
|
|
252
252
|
assert 'scenario = "scenario_engine.cli:main"' in pyproject
|
|
253
|
-
assert 'VERSION = "3.0.
|
|
253
|
+
assert 'VERSION = "3.0.1"' in (ROOT / "src/scenario_engine/_version.py").read_text(encoding="utf-8")
|
|
@@ -166,7 +166,7 @@ def test_versions_publication_security_reference_and_links_are_frozen(tmp_path:
|
|
|
166
166
|
from scenario_engine.reference_packs import ecommerce_domain_pack, export_ecommerce_evidence
|
|
167
167
|
|
|
168
168
|
result = run_scenario(compile_document(parse_yaml((ROOT / "examples/cart.yaml").read_text())), "phase3.11")
|
|
169
|
-
assert VERSION == "3.0.
|
|
169
|
+
assert VERSION == "3.0.1" and ENGINE_VERSION == "2.0.0"
|
|
170
170
|
assert result.manifest.engine_version == "1.0.0" and result.manifest.dsl_version == 1
|
|
171
171
|
contract = CONTRACT.read_text()
|
|
172
172
|
assert "current source distribution version=2.1.0" in contract
|
|
@@ -253,7 +253,7 @@ def test_phase2_root_api_and_version_roles_remain_frozen() -> None:
|
|
|
253
253
|
from scenario_engine.suite import RUN_SCHEMA_VERSION, SUITE_SCHEMA_VERSION
|
|
254
254
|
|
|
255
255
|
assert tuple(scenario_engine.__all__) == FROZEN_ROOT_EXPORTS
|
|
256
|
-
assert VERSION == "3.0.
|
|
256
|
+
assert VERSION == "3.0.1"
|
|
257
257
|
assert ENGINE_VERSION == "2.0.0"
|
|
258
258
|
assert RUN_SCHEMA_VERSION == "suite.run/1"
|
|
259
259
|
assert SUITE_SCHEMA_VERSION == "suite.manifest/1"
|
|
@@ -65,6 +65,17 @@ def test_top_level_and_phase4_command_help_are_coherent() -> None:
|
|
|
65
65
|
assert all(phrase in result.stdout for phrase in phrases)
|
|
66
66
|
|
|
67
67
|
|
|
68
|
+
def test_replay_help_identifies_engine1_and_engine2_evidence() -> None:
|
|
69
|
+
result = invoke("replay", "--help")
|
|
70
|
+
assert result.returncode == 0
|
|
71
|
+
help_text = " ".join(result.stdout.decode("utf-8").split())
|
|
72
|
+
for phrase in (
|
|
73
|
+
"suite.run/1", "scenario.result/2", "- for stdin", "--scenario", "--inputs",
|
|
74
|
+
"--schedule", "scenario.result/2 replay requires scenario.schedule/1 via --schedule",
|
|
75
|
+
):
|
|
76
|
+
assert phrase in help_text
|
|
77
|
+
|
|
78
|
+
|
|
68
79
|
def test_public_docs_have_no_checkpoint_or_checkout_dependency() -> None:
|
|
69
80
|
docs = (ROOT / "README.md").read_text() + QUICKSTART.read_text()
|
|
70
81
|
forbidden = (
|