deterministic-scenario-engine 2.1.0__tar.gz → 2.1.2__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-2.1.0/src/deterministic_scenario_engine.egg-info → deterministic_scenario_engine-2.1.2}/PKG-INFO +39 -35
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/README.md +32 -34
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/phase2-architecture.md +1 -1
- deterministic_scenario_engine-2.1.2/docs/product-evidence-gate.md +65 -0
- deterministic_scenario_engine-2.1.2/docs/release-process.md +63 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/pyproject.toml +8 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2/src/deterministic_scenario_engine.egg-info}/PKG-INFO +39 -35
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/deterministic_scenario_engine.egg-info/SOURCES.txt +5 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/deterministic_scenario_engine.egg-info/requires.txt +1 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/_version.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_0_2b_json_pytest_integration.py +9 -15
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_0_4_control_flow.py +5 -2
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_0_6_sqlalchemy_materializer.py +5 -3
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_0_7_plugins_ecommerce.py +5 -2
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_0_8_hypothesis_schemathesis.py +2 -2
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_1_0c_dsl_compatibility_contract.py +2 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_1_0e_packaging_release_candidate.py +24 -19
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_2_10_workflow_demonstrators.py +2 -2
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_2_12_public_contract_docs_freeze.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_2_13_packaging_fresh_install_rc.py +4 -6
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_2_1_v1_read_contract.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_2_2_composition.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_2_3_matrix.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_2_4_batch.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_2_5_inspect_explain.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_2_7_cli_product_surface.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_3_11_public_contract_docs_freeze.py +3 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_3_1_evidence_bundle_contract.py +1 -1
- deterministic_scenario_engine-2.1.2/tests/test_readme_pypi_portability.py +85 -0
- deterministic_scenario_engine-2.1.2/tests/test_test_portability.py +26 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/LICENSE +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/MANIFEST.in +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/api.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/compatibility.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/determinism.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/dsl-reference.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/hypothesis.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/phase2-public-contract.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/phase3-architecture.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/phase3-public-contract.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/plugins.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/quickstart.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/reproducibility.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/schemathesis.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/security-and-non-goals.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/sqlalchemy.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/docs/testing-oracle.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/api_scenario.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/cart.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/control_flow.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/ecommerce.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/openapi.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/oracle_fault.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/phase0_1b_cart.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/phase0_3_resources.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/phase0_4_control_flow.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/phase0_5_oracle_fault.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/phase0_6_sqlalchemy_rows.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/phase0_7_ecommerce_plugin.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/phase0_8_api_scenario.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/phase0_8_openapi.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/phase3_ecommerce_evidence.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/resources.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/examples/sqlalchemy_rows.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/setup.cfg +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/deterministic_scenario_engine.egg-info/dependency_links.txt +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/deterministic_scenario_engine.egg-info/entry_points.txt +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/deterministic_scenario_engine.egg-info/top_level.txt +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/adapters/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/adapters/json_file.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/adapters/sqlalchemy.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/address.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/artifacts.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/batch/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/batch/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/batch/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/batch/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/batch/runtime.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/cli/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/cli/__main__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/cli/main.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/clock.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/composition/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/composition/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/composition/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/composition/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/composition/parser.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/composition/resolver.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/composition/runtime.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/context.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/control_flow.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/diff/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/diff/compare.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/diff/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/diff/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/diff/render.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/diff/serialization.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/domain_packs/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/domain_packs/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/domain_packs/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/domain_packs/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/domain_packs/registry.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/dsl/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/dsl/compiler.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/dsl/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/dsl/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/dsl/parser.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/dsl/runtime.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/evidence/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/evidence/adapter.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/evidence/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/evidence/compatibility.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/evidence/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/evidence/export.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/evidence/fixture.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/evidence/migration.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/evidence/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/evidence/read.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/expressions.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/faults.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/history.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/ids.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/inspection/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/inspection/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/inspection/explain.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/inspection/inspect.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/inspection/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/inspection/redaction.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/inspection/serialization.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/integrations/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/integrations/hypothesis.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/integrations/schemathesis.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/invariants.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/manifest.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/matrix/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/matrix/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/matrix/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/matrix/expand.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/matrix/filtering.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/matrix/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/matrix/runtime.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/oracle.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/oracle_assertions/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/oracle_assertions/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/oracle_assertions/evaluate.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/oracle_assertions/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/oracle_assertions/serialization.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/plugins.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/provenance.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/pytest_plugin.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/reference_packs/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/reference_packs/ecommerce.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/reference_packs/ecommerce_evidence.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/resources.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/result.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/rng.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/runner.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/state.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/suite/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/suite/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/suite/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/suite/read.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/suite/serialization.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/validation.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/src/scenario_engine/values.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_0_1a_semantic_kernel.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_0_1b_linear_dsl.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_0_1c_integrated_phase0_1.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_0_1c_r1_missing_sentinel_repair.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_0_2a_reproducible_results.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_0_3_resources_constraints.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_0_5_oracle_faults.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_1_0b_public_api_error_contract.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_1_0d_documentation_examples.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_2_11_performance_scale_hardening.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_2_1_models_serialization.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_2_6_structured_semantic_diff.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_2_8_domain_pack_foundation.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_2_9_oracle_assertions.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_3_10_performance_security_hardening.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_3_12_packaging_fresh_install_rc.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_3_2_safe_bundle_reader_validator.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_3_3_ordered_export.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_3_4_evidence_adapter_contract.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_3_5_compatibility_migration_planner.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_3_6_lossless_migrations_fixture_export.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_3_7_cli_interchange_surface.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.2}/tests/test_phase_3_8_ecommerce_evidence_workflow.py +0 -0
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deterministic-scenario-engine
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.2
|
|
4
4
|
Summary: Reproducible, state-consistent business scenarios with deterministic ground truth
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
|
+
Project-URL: Homepage, https://github.com/imshahinul/deterministic-scenario-engine
|
|
7
|
+
Project-URL: Documentation, https://github.com/imshahinul/deterministic-scenario-engine/tree/main/docs
|
|
8
|
+
Project-URL: Source, https://github.com/imshahinul/deterministic-scenario-engine
|
|
9
|
+
Project-URL: Issues, https://github.com/imshahinul/deterministic-scenario-engine/issues
|
|
10
|
+
Project-URL: Release Notes, https://github.com/imshahinul/deterministic-scenario-engine/releases
|
|
6
11
|
Keywords: deterministic,scenario,testing,fixtures,replay
|
|
7
12
|
Classifier: Development Status :: 5 - Production/Stable
|
|
8
13
|
Classifier: Intended Audience :: Developers
|
|
@@ -20,6 +25,7 @@ License-File: LICENSE
|
|
|
20
25
|
Requires-Dist: PyYAML==6.0.3
|
|
21
26
|
Provides-Extra: pytest
|
|
22
27
|
Requires-Dist: pytest<10,>=9.1; extra == "pytest"
|
|
28
|
+
Requires-Dist: build<2,>=1; extra == "pytest"
|
|
23
29
|
Provides-Extra: sqlalchemy
|
|
24
30
|
Requires-Dist: SQLAlchemy<3,>=2.0; extra == "sqlalchemy"
|
|
25
31
|
Provides-Extra: hypothesis
|
|
@@ -35,11 +41,10 @@ Dynamic: license-file
|
|
|
35
41
|
|
|
36
42
|
Deterministic Scenario Engine (DSE) creates reproducible, state-consistent
|
|
37
43
|
business histories and deterministic scenario suites with ground truth for
|
|
38
|
-
testing. The
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
`ENGINE_VERSION == "1.0.0"`, and its DSL version remains integer 1.
|
|
44
|
+
testing. The source-tree distribution version is 2.1.2. Distribution release
|
|
45
|
+
identity and deterministic compatibility identity are separate:
|
|
46
|
+
`ENGINE_VERSION` remains 1.0.0 and DSL version remains 1. For authoritative
|
|
47
|
+
public-release availability and history, see PyPI and GitHub Releases.
|
|
43
48
|
|
|
44
49
|
## Why it exists
|
|
45
50
|
|
|
@@ -74,11 +79,11 @@ make expected behavior explicit.
|
|
|
74
79
|
explicit adapters, closed lossless migrations, and fixture-directory export
|
|
75
80
|
|
|
76
81
|
Core execution does not require a database, network service, plugin, or property
|
|
77
|
-
testing framework. See [security assumptions and non-goals](docs/security-and-non-goals.md).
|
|
82
|
+
testing framework. See [security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md).
|
|
78
83
|
Neither Phase 2 nor Phase 3 adds hidden discovery, network, randomness,
|
|
79
84
|
wall-clock, or ambient environment semantics. The historical Phase 2 contract
|
|
80
|
-
is frozen in the [Phase 2 public contract](docs/phase2-public-contract.md); the
|
|
81
|
-
additive evidence surface is frozen in the [Phase 3 public contract](docs/phase3-public-contract.md).
|
|
85
|
+
is frozen in the [Phase 2 public contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md); the
|
|
86
|
+
additive evidence surface is frozen in the [Phase 3 public contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md).
|
|
82
87
|
|
|
83
88
|
## Installation
|
|
84
89
|
|
|
@@ -98,13 +103,13 @@ Install only the named optional integrations you need:
|
|
|
98
103
|
/tmp/scenario-engine-docs-venv/bin/python -m pip install '.[schemathesis]'
|
|
99
104
|
```
|
|
100
105
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
106
|
+
Install the package with `pip install deterministic-scenario-engine`, or select
|
|
107
|
+
an optional integration with a command such as
|
|
108
|
+
`pip install 'deterministic-scenario-engine[pytest]'`.
|
|
104
109
|
|
|
105
110
|
## Minimal quickstart
|
|
106
111
|
|
|
107
|
-
The public [cart scenario](examples/cart.yaml) is an executable DSL 1 document.
|
|
112
|
+
The public [cart scenario](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/examples/cart.yaml) is an executable DSL 1 document.
|
|
108
113
|
Run it from the repository root:
|
|
109
114
|
|
|
110
115
|
```python
|
|
@@ -139,32 +144,31 @@ normalized result contains the same data under its `state` field.
|
|
|
139
144
|
Generation derives from semantic `ExecutionAddress` values, not consumption of
|
|
140
145
|
a mutable global random stream. Exact replay requires the same canonical
|
|
141
146
|
scenario, explicit inputs, algorithms/plugins, and recorded execution context.
|
|
142
|
-
Unsupported cross-version replay fails explicitly. See the [determinism model](docs/determinism.md),
|
|
143
|
-
[reproducibility guide](docs/reproducibility.md), and normative
|
|
144
|
-
[compatibility contract](docs/compatibility.md).
|
|
147
|
+
Unsupported cross-version replay fails explicitly. See the [determinism model](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/determinism.md),
|
|
148
|
+
[reproducibility guide](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/reproducibility.md), and normative
|
|
149
|
+
[compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md).
|
|
145
150
|
|
|
146
151
|
## Documentation
|
|
147
152
|
|
|
148
|
-
- [Quickstart](docs/quickstart.md)
|
|
149
|
-
- [DSL 1 reference](docs/dsl-reference.md)
|
|
150
|
-
- [Determinism model](docs/determinism.md)
|
|
151
|
-
- [Reproducibility and replay](docs/reproducibility.md)
|
|
152
|
-
- [Testing, faults, and oracle](docs/testing-oracle.md)
|
|
153
|
-
- [Plugins](docs/plugins.md)
|
|
154
|
-
- [SQLAlchemy adapter](docs/sqlalchemy.md)
|
|
155
|
-
- [Hypothesis integration](docs/hypothesis.md)
|
|
156
|
-
- [Schemathesis integration](docs/schemathesis.md)
|
|
157
|
-
- [Public Python API](docs/api.md)
|
|
158
|
-
- [Security assumptions and non-goals](docs/security-and-non-goals.md)
|
|
159
|
-
- [Compatibility contract](docs/compatibility.md)
|
|
160
|
-
- [Phase 2 public contract, CLI, and hard bounds](docs/phase2-public-contract.md)
|
|
161
|
-
- [Phase 3 public contract and evidence interchange](docs/phase3-public-contract.md)
|
|
153
|
+
- [Quickstart](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/quickstart.md)
|
|
154
|
+
- [DSL 1 reference](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/dsl-reference.md)
|
|
155
|
+
- [Determinism model](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/determinism.md)
|
|
156
|
+
- [Reproducibility and replay](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/reproducibility.md)
|
|
157
|
+
- [Testing, faults, and oracle](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/testing-oracle.md)
|
|
158
|
+
- [Plugins](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/plugins.md)
|
|
159
|
+
- [SQLAlchemy adapter](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/sqlalchemy.md)
|
|
160
|
+
- [Hypothesis integration](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/hypothesis.md)
|
|
161
|
+
- [Schemathesis integration](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/schemathesis.md)
|
|
162
|
+
- [Public Python API](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/api.md)
|
|
163
|
+
- [Security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md)
|
|
164
|
+
- [Compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md)
|
|
165
|
+
- [Phase 2 public contract, CLI, and hard bounds](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md)
|
|
166
|
+
- [Phase 3 public contract and evidence interchange](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md)
|
|
162
167
|
|
|
163
168
|
## Status
|
|
164
169
|
|
|
165
170
|
Distribution release identity and deterministic engine compatibility are
|
|
166
|
-
separate contracts.
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
under Apache-2.0.
|
|
171
|
+
separate contracts. This source tree reports distribution version 2.1.2;
|
|
172
|
+
generated core manifests retain `ENGINE_VERSION` 1.0.0 and DSL 1. PyPI and
|
|
173
|
+
GitHub Releases are the authoritative sources for public-release availability
|
|
174
|
+
and history. The project is licensed under Apache-2.0.
|
|
@@ -4,11 +4,10 @@
|
|
|
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. The
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
`ENGINE_VERSION == "1.0.0"`, and its DSL version remains integer 1.
|
|
7
|
+
testing. The source-tree distribution version is 2.1.2. Distribution release
|
|
8
|
+
identity and deterministic compatibility identity are separate:
|
|
9
|
+
`ENGINE_VERSION` remains 1.0.0 and DSL version remains 1. For authoritative
|
|
10
|
+
public-release availability and history, see PyPI and GitHub Releases.
|
|
12
11
|
|
|
13
12
|
## Why it exists
|
|
14
13
|
|
|
@@ -43,11 +42,11 @@ make expected behavior explicit.
|
|
|
43
42
|
explicit adapters, closed lossless migrations, and fixture-directory export
|
|
44
43
|
|
|
45
44
|
Core execution does not require a database, network service, plugin, or property
|
|
46
|
-
testing framework. See [security assumptions and non-goals](docs/security-and-non-goals.md).
|
|
45
|
+
testing framework. See [security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md).
|
|
47
46
|
Neither Phase 2 nor Phase 3 adds hidden discovery, network, randomness,
|
|
48
47
|
wall-clock, or ambient environment semantics. The historical Phase 2 contract
|
|
49
|
-
is frozen in the [Phase 2 public contract](docs/phase2-public-contract.md); the
|
|
50
|
-
additive evidence surface is frozen in the [Phase 3 public contract](docs/phase3-public-contract.md).
|
|
48
|
+
is frozen in the [Phase 2 public contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md); the
|
|
49
|
+
additive evidence surface is frozen in the [Phase 3 public contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md).
|
|
51
50
|
|
|
52
51
|
## Installation
|
|
53
52
|
|
|
@@ -67,13 +66,13 @@ Install only the named optional integrations you need:
|
|
|
67
66
|
/tmp/scenario-engine-docs-venv/bin/python -m pip install '.[schemathesis]'
|
|
68
67
|
```
|
|
69
68
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
69
|
+
Install the package with `pip install deterministic-scenario-engine`, or select
|
|
70
|
+
an optional integration with a command such as
|
|
71
|
+
`pip install 'deterministic-scenario-engine[pytest]'`.
|
|
73
72
|
|
|
74
73
|
## Minimal quickstart
|
|
75
74
|
|
|
76
|
-
The public [cart scenario](examples/cart.yaml) is an executable DSL 1 document.
|
|
75
|
+
The public [cart scenario](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/examples/cart.yaml) is an executable DSL 1 document.
|
|
77
76
|
Run it from the repository root:
|
|
78
77
|
|
|
79
78
|
```python
|
|
@@ -108,32 +107,31 @@ normalized result contains the same data under its `state` field.
|
|
|
108
107
|
Generation derives from semantic `ExecutionAddress` values, not consumption of
|
|
109
108
|
a mutable global random stream. Exact replay requires the same canonical
|
|
110
109
|
scenario, explicit inputs, algorithms/plugins, and recorded execution context.
|
|
111
|
-
Unsupported cross-version replay fails explicitly. See the [determinism model](docs/determinism.md),
|
|
112
|
-
[reproducibility guide](docs/reproducibility.md), and normative
|
|
113
|
-
[compatibility contract](docs/compatibility.md).
|
|
110
|
+
Unsupported cross-version replay fails explicitly. See the [determinism model](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/determinism.md),
|
|
111
|
+
[reproducibility guide](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/reproducibility.md), and normative
|
|
112
|
+
[compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md).
|
|
114
113
|
|
|
115
114
|
## Documentation
|
|
116
115
|
|
|
117
|
-
- [Quickstart](docs/quickstart.md)
|
|
118
|
-
- [DSL 1 reference](docs/dsl-reference.md)
|
|
119
|
-
- [Determinism model](docs/determinism.md)
|
|
120
|
-
- [Reproducibility and replay](docs/reproducibility.md)
|
|
121
|
-
- [Testing, faults, and oracle](docs/testing-oracle.md)
|
|
122
|
-
- [Plugins](docs/plugins.md)
|
|
123
|
-
- [SQLAlchemy adapter](docs/sqlalchemy.md)
|
|
124
|
-
- [Hypothesis integration](docs/hypothesis.md)
|
|
125
|
-
- [Schemathesis integration](docs/schemathesis.md)
|
|
126
|
-
- [Public Python API](docs/api.md)
|
|
127
|
-
- [Security assumptions and non-goals](docs/security-and-non-goals.md)
|
|
128
|
-
- [Compatibility contract](docs/compatibility.md)
|
|
129
|
-
- [Phase 2 public contract, CLI, and hard bounds](docs/phase2-public-contract.md)
|
|
130
|
-
- [Phase 3 public contract and evidence interchange](docs/phase3-public-contract.md)
|
|
116
|
+
- [Quickstart](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/quickstart.md)
|
|
117
|
+
- [DSL 1 reference](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/dsl-reference.md)
|
|
118
|
+
- [Determinism model](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/determinism.md)
|
|
119
|
+
- [Reproducibility and replay](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/reproducibility.md)
|
|
120
|
+
- [Testing, faults, and oracle](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/testing-oracle.md)
|
|
121
|
+
- [Plugins](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/plugins.md)
|
|
122
|
+
- [SQLAlchemy adapter](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/sqlalchemy.md)
|
|
123
|
+
- [Hypothesis integration](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/hypothesis.md)
|
|
124
|
+
- [Schemathesis integration](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/schemathesis.md)
|
|
125
|
+
- [Public Python API](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/api.md)
|
|
126
|
+
- [Security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md)
|
|
127
|
+
- [Compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md)
|
|
128
|
+
- [Phase 2 public contract, CLI, and hard bounds](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md)
|
|
129
|
+
- [Phase 3 public contract and evidence interchange](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md)
|
|
131
130
|
|
|
132
131
|
## Status
|
|
133
132
|
|
|
134
133
|
Distribution release identity and deterministic engine compatibility are
|
|
135
|
-
separate contracts.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
under Apache-2.0.
|
|
134
|
+
separate contracts. This source tree reports distribution version 2.1.2;
|
|
135
|
+
generated core manifests retain `ENGINE_VERSION` 1.0.0 and DSL 1. PyPI and
|
|
136
|
+
GitHub Releases are the authoritative sources for public-release availability
|
|
137
|
+
and history. The project is licensed under Apache-2.0.
|
|
@@ -275,7 +275,7 @@ From the 2026-09-03 freeze, the likely range is roughly late October through lat
|
|
|
275
275
|
|
|
276
276
|
## V1 Contract Validation
|
|
277
277
|
|
|
278
|
-
Pre-mutation validation ran from repository
|
|
278
|
+
Pre-mutation validation ran from `<repository-root>` on branch `main`. HEAD/main/origin-main were `ee29f52f714e84f17e1048ce24192fcf1c69345a`, tree `2a61915d578dcb1c4ec94049350a24d2cabdf721`, divergence `0/0`, with zero staged, unstaged, or untracked paths. The sole remote was `origin`, resolving to public `imshahinul/deterministic-scenario-engine`; tag `1.0.0` peeled to the baseline and its tree.
|
|
279
279
|
|
|
280
280
|
Validation used CPython 3.14.6 in isolated environment `/tmp/dse-phase2-0a-venv`, pytest 9.1.1, PyYAML 6.0.3, SQLAlchemy 2.0.52, Hypothesis 6.167.1, and Schemathesis 4.25.2, with repository `src` on `PYTHONPATH`. Canonical validation is `python -m pytest -q`; collection is `python -m pytest --collect-only -q`. It collected 280 tests and the full run passed: `280 passed, 136 subtests passed` in 41.94 seconds. Focused golden enforcement passed 4 tests and 3 subtests.
|
|
281
281
|
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Product evidence gate
|
|
2
|
+
|
|
3
|
+
A successfully shipped phase does not automatically authorize design or
|
|
4
|
+
implementation of the next feature phase.
|
|
5
|
+
|
|
6
|
+
## Demand evidence requirement
|
|
7
|
+
|
|
8
|
+
Before Phase 4 product scope can be frozen, every proposed substantial
|
|
9
|
+
capability must trace to credible evidence of an actual problem. Acceptable
|
|
10
|
+
evidence includes:
|
|
11
|
+
|
|
12
|
+
- an external user report or request;
|
|
13
|
+
- a public issue or discussion describing real friction;
|
|
14
|
+
- observed integration failure or friction;
|
|
15
|
+
- a repeated support question;
|
|
16
|
+
- a real downstream implementation needing the capability;
|
|
17
|
+
- credible usage or adoption evidence combined with a specific observed
|
|
18
|
+
problem.
|
|
19
|
+
|
|
20
|
+
The following is insufficient by itself: ability to build something,
|
|
21
|
+
architectural fit or elegance, previous deferral, download counts, GitHub stars,
|
|
22
|
+
benchmark opportunities, or feature parity with another tool.
|
|
23
|
+
|
|
24
|
+
## Maintenance exceptions
|
|
25
|
+
|
|
26
|
+
Product-demand evidence is not required before addressing a confirmed bug,
|
|
27
|
+
security vulnerability, compatibility regression, release-integrity defect,
|
|
28
|
+
dependency or platform breakage, data-loss or correctness issue, or maintenance
|
|
29
|
+
needed to preserve an existing public contract. Such work instead requires
|
|
30
|
+
evidence of the defect or risk.
|
|
31
|
+
|
|
32
|
+
## Phase 4 evidence packet
|
|
33
|
+
|
|
34
|
+
No Phase 4 architecture freeze or implementation prompt is authorized until an
|
|
35
|
+
evidence packet exists. For every candidate substantial feature, it must record:
|
|
36
|
+
|
|
37
|
+
- problem statement;
|
|
38
|
+
- evidence source and date;
|
|
39
|
+
- affected user or workflow;
|
|
40
|
+
- observed current workaround or failure;
|
|
41
|
+
- why DSE itself should solve the problem;
|
|
42
|
+
- why external tooling is insufficient;
|
|
43
|
+
- minimum useful outcome;
|
|
44
|
+
- evidence strength.
|
|
45
|
+
|
|
46
|
+
Classify each candidate as `SUPPORTED_BY_EVIDENCE`, `WEAK_EVIDENCE`, or
|
|
47
|
+
`NO_EVIDENCE`. Only supported items may enter MUST or SHOULD scope. Weak items
|
|
48
|
+
remain observational; unsupported items go to the parking lot or are deferred.
|
|
49
|
+
This policy does not itself create a Phase 4 feature list.
|
|
50
|
+
|
|
51
|
+
## Adoption observation
|
|
52
|
+
|
|
53
|
+
Downloads, stars, forks, clones, and traffic may be recorded as context but do
|
|
54
|
+
not prove a feature need. Preferred evidence combines a specific observed
|
|
55
|
+
problem, credible user/workflow context, and repeatability or consequence.
|
|
56
|
+
Quantitative adoption data is supporting evidence, not the product requirement.
|
|
57
|
+
|
|
58
|
+
Until qualifying external problem evidence and the required packet exist:
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
PHASE4_AUTHORIZED=NO
|
|
62
|
+
PHASE4_ARCHITECTURE_STARTED=NO
|
|
63
|
+
PHASE4_IMPLEMENTATION_STARTED=NO
|
|
64
|
+
NEXT_ACTIVITY=ADOPTION_AND_PROBLEM_OBSERVATION
|
|
65
|
+
```
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Release process
|
|
2
|
+
|
|
3
|
+
The package README is the PyPI long description. It must describe durable
|
|
4
|
+
product and version semantics, not transient publication state. Statements such
|
|
5
|
+
as "unpublished", "no current-version tag", "no GitHub Release", or "no
|
|
6
|
+
package-index publication" belong only in checkpoint evidence, release audits,
|
|
7
|
+
or temporary release-candidate reports.
|
|
8
|
+
|
|
9
|
+
## Pre-RC
|
|
10
|
+
|
|
11
|
+
Before building artifacts:
|
|
12
|
+
|
|
13
|
+
- run the README release-state-neutrality test;
|
|
14
|
+
- require `PRE_RC_PYPI_LINK_PORTABILITY=PASS` by rejecting repository-relative
|
|
15
|
+
file links in the package README and checking internal anchors separately;
|
|
16
|
+
- confirm the configured package long-description material passes the same
|
|
17
|
+
neutrality test.
|
|
18
|
+
|
|
19
|
+
## RC
|
|
20
|
+
|
|
21
|
+
Release-candidate evidence may record that publication, a tag, or a release is
|
|
22
|
+
absent. Package long-description material may not encode those transient facts.
|
|
23
|
+
|
|
24
|
+
## Pre-upload
|
|
25
|
+
|
|
26
|
+
Immediately before `twine upload`, rerun the source README neutrality test and
|
|
27
|
+
inspect the accepted wheel and sdist metadata to confirm their packaged
|
|
28
|
+
README/long description is release-state neutral. Require
|
|
29
|
+
`PREUPLOAD_PYPI_LINK_PORTABILITY=PASS` for both artifact descriptions, run
|
|
30
|
+
`twine check` and record `TWINE_RENDER_CHECK=PASS`, and resolve every important
|
|
31
|
+
absolute documentation target to record `PYPI_LINK_TARGET_CHECK=PASS`.
|
|
32
|
+
|
|
33
|
+
## Publication
|
|
34
|
+
|
|
35
|
+
Publish the exact accepted artifacts. Do not rebuild between acceptance and
|
|
36
|
+
publication.
|
|
37
|
+
|
|
38
|
+
## Post-publication completion gate
|
|
39
|
+
|
|
40
|
+
Using fresh public observations rather than pre-upload text, verify:
|
|
41
|
+
|
|
42
|
+
- the PyPI version exists and its hashes exactly match the accepted artifacts;
|
|
43
|
+
- a production installation passes;
|
|
44
|
+
- the release tag targets the exact accepted commit;
|
|
45
|
+
- the GitHub Release exists and its asset hashes exactly match;
|
|
46
|
+
- the canonical README remains consistent with durable version semantics;
|
|
47
|
+
- package documentation still satisfies the release-state policy;
|
|
48
|
+
- fresh inspection of the rendered PyPI project page proves that documentation,
|
|
49
|
+
examples, security, compatibility, license, and repository links resolve to
|
|
50
|
+
their intended destinations, recording `POSTPUBLICATION_PYPI_LINK_SMOKE=PASS`.
|
|
51
|
+
|
|
52
|
+
`twine check` alone is not sufficient for link portability. The post-publication
|
|
53
|
+
gate must inspect the live PyPI description and its rendered link targets.
|
|
54
|
+
|
|
55
|
+
Only after every post-publication check passes may checkpoint evidence record
|
|
56
|
+
`PHASE_COMPLETE=YES`. A post-publication check must never rely solely on text
|
|
57
|
+
prepared before upload.
|
|
58
|
+
|
|
59
|
+
Published wheel and sdist metadata is immutable. If stale long-description text
|
|
60
|
+
has already shipped, record it as a known published-artifact limitation; do not
|
|
61
|
+
rewrite, rebuild, republish, or yank an otherwise accepted release merely to
|
|
62
|
+
alter that text. The durable correction applies to canonical `main` and future
|
|
63
|
+
artifacts.
|
|
@@ -25,11 +25,18 @@ classifiers = [
|
|
|
25
25
|
]
|
|
26
26
|
dependencies = ["PyYAML==6.0.3"]
|
|
27
27
|
|
|
28
|
+
[project.urls]
|
|
29
|
+
Homepage = "https://github.com/imshahinul/deterministic-scenario-engine"
|
|
30
|
+
Documentation = "https://github.com/imshahinul/deterministic-scenario-engine/tree/main/docs"
|
|
31
|
+
Source = "https://github.com/imshahinul/deterministic-scenario-engine"
|
|
32
|
+
Issues = "https://github.com/imshahinul/deterministic-scenario-engine/issues"
|
|
33
|
+
"Release Notes" = "https://github.com/imshahinul/deterministic-scenario-engine/releases"
|
|
34
|
+
|
|
28
35
|
[project.scripts]
|
|
29
36
|
scenario = "scenario_engine.cli:main"
|
|
30
37
|
|
|
31
38
|
[project.optional-dependencies]
|
|
32
|
-
pytest = ["pytest>=9.1,<10"]
|
|
39
|
+
pytest = ["pytest>=9.1,<10", "build>=1,<2"]
|
|
33
40
|
sqlalchemy = ["SQLAlchemy>=2.0,<3"]
|
|
34
41
|
hypothesis = ["hypothesis>=6,<7"]
|
|
35
42
|
schemathesis = ["hypothesis>=6,<7", "schemathesis>=4,<5"]
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deterministic-scenario-engine
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.2
|
|
4
4
|
Summary: Reproducible, state-consistent business scenarios with deterministic ground truth
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
|
+
Project-URL: Homepage, https://github.com/imshahinul/deterministic-scenario-engine
|
|
7
|
+
Project-URL: Documentation, https://github.com/imshahinul/deterministic-scenario-engine/tree/main/docs
|
|
8
|
+
Project-URL: Source, https://github.com/imshahinul/deterministic-scenario-engine
|
|
9
|
+
Project-URL: Issues, https://github.com/imshahinul/deterministic-scenario-engine/issues
|
|
10
|
+
Project-URL: Release Notes, https://github.com/imshahinul/deterministic-scenario-engine/releases
|
|
6
11
|
Keywords: deterministic,scenario,testing,fixtures,replay
|
|
7
12
|
Classifier: Development Status :: 5 - Production/Stable
|
|
8
13
|
Classifier: Intended Audience :: Developers
|
|
@@ -20,6 +25,7 @@ License-File: LICENSE
|
|
|
20
25
|
Requires-Dist: PyYAML==6.0.3
|
|
21
26
|
Provides-Extra: pytest
|
|
22
27
|
Requires-Dist: pytest<10,>=9.1; extra == "pytest"
|
|
28
|
+
Requires-Dist: build<2,>=1; extra == "pytest"
|
|
23
29
|
Provides-Extra: sqlalchemy
|
|
24
30
|
Requires-Dist: SQLAlchemy<3,>=2.0; extra == "sqlalchemy"
|
|
25
31
|
Provides-Extra: hypothesis
|
|
@@ -35,11 +41,10 @@ Dynamic: license-file
|
|
|
35
41
|
|
|
36
42
|
Deterministic Scenario Engine (DSE) creates reproducible, state-consistent
|
|
37
43
|
business histories and deterministic scenario suites with ground truth for
|
|
38
|
-
testing. The
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
`ENGINE_VERSION == "1.0.0"`, and its DSL version remains integer 1.
|
|
44
|
+
testing. The source-tree distribution version is 2.1.2. Distribution release
|
|
45
|
+
identity and deterministic compatibility identity are separate:
|
|
46
|
+
`ENGINE_VERSION` remains 1.0.0 and DSL version remains 1. For authoritative
|
|
47
|
+
public-release availability and history, see PyPI and GitHub Releases.
|
|
43
48
|
|
|
44
49
|
## Why it exists
|
|
45
50
|
|
|
@@ -74,11 +79,11 @@ make expected behavior explicit.
|
|
|
74
79
|
explicit adapters, closed lossless migrations, and fixture-directory export
|
|
75
80
|
|
|
76
81
|
Core execution does not require a database, network service, plugin, or property
|
|
77
|
-
testing framework. See [security assumptions and non-goals](docs/security-and-non-goals.md).
|
|
82
|
+
testing framework. See [security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md).
|
|
78
83
|
Neither Phase 2 nor Phase 3 adds hidden discovery, network, randomness,
|
|
79
84
|
wall-clock, or ambient environment semantics. The historical Phase 2 contract
|
|
80
|
-
is frozen in the [Phase 2 public contract](docs/phase2-public-contract.md); the
|
|
81
|
-
additive evidence surface is frozen in the [Phase 3 public contract](docs/phase3-public-contract.md).
|
|
85
|
+
is frozen in the [Phase 2 public contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md); the
|
|
86
|
+
additive evidence surface is frozen in the [Phase 3 public contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md).
|
|
82
87
|
|
|
83
88
|
## Installation
|
|
84
89
|
|
|
@@ -98,13 +103,13 @@ Install only the named optional integrations you need:
|
|
|
98
103
|
/tmp/scenario-engine-docs-venv/bin/python -m pip install '.[schemathesis]'
|
|
99
104
|
```
|
|
100
105
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
106
|
+
Install the package with `pip install deterministic-scenario-engine`, or select
|
|
107
|
+
an optional integration with a command such as
|
|
108
|
+
`pip install 'deterministic-scenario-engine[pytest]'`.
|
|
104
109
|
|
|
105
110
|
## Minimal quickstart
|
|
106
111
|
|
|
107
|
-
The public [cart scenario](examples/cart.yaml) is an executable DSL 1 document.
|
|
112
|
+
The public [cart scenario](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/examples/cart.yaml) is an executable DSL 1 document.
|
|
108
113
|
Run it from the repository root:
|
|
109
114
|
|
|
110
115
|
```python
|
|
@@ -139,32 +144,31 @@ normalized result contains the same data under its `state` field.
|
|
|
139
144
|
Generation derives from semantic `ExecutionAddress` values, not consumption of
|
|
140
145
|
a mutable global random stream. Exact replay requires the same canonical
|
|
141
146
|
scenario, explicit inputs, algorithms/plugins, and recorded execution context.
|
|
142
|
-
Unsupported cross-version replay fails explicitly. See the [determinism model](docs/determinism.md),
|
|
143
|
-
[reproducibility guide](docs/reproducibility.md), and normative
|
|
144
|
-
[compatibility contract](docs/compatibility.md).
|
|
147
|
+
Unsupported cross-version replay fails explicitly. See the [determinism model](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/determinism.md),
|
|
148
|
+
[reproducibility guide](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/reproducibility.md), and normative
|
|
149
|
+
[compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md).
|
|
145
150
|
|
|
146
151
|
## Documentation
|
|
147
152
|
|
|
148
|
-
- [Quickstart](docs/quickstart.md)
|
|
149
|
-
- [DSL 1 reference](docs/dsl-reference.md)
|
|
150
|
-
- [Determinism model](docs/determinism.md)
|
|
151
|
-
- [Reproducibility and replay](docs/reproducibility.md)
|
|
152
|
-
- [Testing, faults, and oracle](docs/testing-oracle.md)
|
|
153
|
-
- [Plugins](docs/plugins.md)
|
|
154
|
-
- [SQLAlchemy adapter](docs/sqlalchemy.md)
|
|
155
|
-
- [Hypothesis integration](docs/hypothesis.md)
|
|
156
|
-
- [Schemathesis integration](docs/schemathesis.md)
|
|
157
|
-
- [Public Python API](docs/api.md)
|
|
158
|
-
- [Security assumptions and non-goals](docs/security-and-non-goals.md)
|
|
159
|
-
- [Compatibility contract](docs/compatibility.md)
|
|
160
|
-
- [Phase 2 public contract, CLI, and hard bounds](docs/phase2-public-contract.md)
|
|
161
|
-
- [Phase 3 public contract and evidence interchange](docs/phase3-public-contract.md)
|
|
153
|
+
- [Quickstart](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/quickstart.md)
|
|
154
|
+
- [DSL 1 reference](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/dsl-reference.md)
|
|
155
|
+
- [Determinism model](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/determinism.md)
|
|
156
|
+
- [Reproducibility and replay](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/reproducibility.md)
|
|
157
|
+
- [Testing, faults, and oracle](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/testing-oracle.md)
|
|
158
|
+
- [Plugins](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/plugins.md)
|
|
159
|
+
- [SQLAlchemy adapter](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/sqlalchemy.md)
|
|
160
|
+
- [Hypothesis integration](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/hypothesis.md)
|
|
161
|
+
- [Schemathesis integration](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/schemathesis.md)
|
|
162
|
+
- [Public Python API](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/api.md)
|
|
163
|
+
- [Security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md)
|
|
164
|
+
- [Compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md)
|
|
165
|
+
- [Phase 2 public contract, CLI, and hard bounds](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md)
|
|
166
|
+
- [Phase 3 public contract and evidence interchange](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md)
|
|
162
167
|
|
|
163
168
|
## Status
|
|
164
169
|
|
|
165
170
|
Distribution release identity and deterministic engine compatibility are
|
|
166
|
-
separate contracts.
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
under Apache-2.0.
|
|
171
|
+
separate contracts. This source tree reports distribution version 2.1.2;
|
|
172
|
+
generated core manifests retain `ENGINE_VERSION` 1.0.0 and DSL 1. PyPI and
|
|
173
|
+
GitHub Releases are the authoritative sources for public-release availability
|
|
174
|
+
and history. The project is licensed under Apache-2.0.
|
|
@@ -12,7 +12,9 @@ docs/phase2-public-contract.md
|
|
|
12
12
|
docs/phase3-architecture.md
|
|
13
13
|
docs/phase3-public-contract.md
|
|
14
14
|
docs/plugins.md
|
|
15
|
+
docs/product-evidence-gate.md
|
|
15
16
|
docs/quickstart.md
|
|
17
|
+
docs/release-process.md
|
|
16
18
|
docs/reproducibility.md
|
|
17
19
|
docs/schemathesis.md
|
|
18
20
|
docs/security-and-non-goals.md
|
|
@@ -182,4 +184,6 @@ tests/test_phase_3_4_evidence_adapter_contract.py
|
|
|
182
184
|
tests/test_phase_3_5_compatibility_migration_planner.py
|
|
183
185
|
tests/test_phase_3_6_lossless_migrations_fixture_export.py
|
|
184
186
|
tests/test_phase_3_7_cli_interchange_surface.py
|
|
185
|
-
tests/test_phase_3_8_ecommerce_evidence_workflow.py
|
|
187
|
+
tests/test_phase_3_8_ecommerce_evidence_workflow.py
|
|
188
|
+
tests/test_readme_pypi_portability.py
|
|
189
|
+
tests/test_test_portability.py
|
|
@@ -17,9 +17,6 @@ from scenario_engine.result import ScenarioResult
|
|
|
17
17
|
|
|
18
18
|
ROOT = Path(__file__).parents[1]
|
|
19
19
|
SRC = ROOT / "src"
|
|
20
|
-
AUDIT_PYTHON = Path(
|
|
21
|
-
"/Users/smshahinulislam/Developer/scenario-engine-audit/runtime-venv/bin/python"
|
|
22
|
-
)
|
|
23
20
|
SCENARIO = """
|
|
24
21
|
dsl_version: 1
|
|
25
22
|
scenario: phase02b
|
|
@@ -47,11 +44,12 @@ def run_result(seed: str = "seed", run_index: int = 0) -> ScenarioResult:
|
|
|
47
44
|
)
|
|
48
45
|
|
|
49
46
|
|
|
50
|
-
def
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
47
|
+
def pytest_command(test_file: Path) -> list[str]:
|
|
48
|
+
command = [sys.executable, "-m", "pytest", "-q"]
|
|
49
|
+
if os.environ.get("PYTEST_DISABLE_PLUGIN_AUTOLOAD"):
|
|
50
|
+
command.extend(("-p", "scenario_engine"))
|
|
51
|
+
command.append(str(test_file))
|
|
52
|
+
return command
|
|
55
53
|
|
|
56
54
|
|
|
57
55
|
class Phase02BJsonPytestIntegrationTests(unittest.TestCase):
|
|
@@ -161,7 +159,7 @@ class Phase02BJsonPytestIntegrationTests(unittest.TestCase):
|
|
|
161
159
|
document = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8"))
|
|
162
160
|
self.assertEqual(document["project"]["dependencies"], ["PyYAML==6.0.3"])
|
|
163
161
|
self.assertEqual(document["project"]["optional-dependencies"]["pytest"],
|
|
164
|
-
["pytest>=9.1,<10"])
|
|
162
|
+
["pytest>=9.1,<10", "build>=1,<2"])
|
|
165
163
|
self.assertEqual(document["project"]["entry-points"]["pytest11"]["scenario_engine"],
|
|
166
164
|
"scenario_engine.pytest_plugin")
|
|
167
165
|
|
|
@@ -169,7 +167,6 @@ class Phase02BJsonPytestIntegrationTests(unittest.TestCase):
|
|
|
169
167
|
with tempfile.TemporaryDirectory() as directory:
|
|
170
168
|
test_file = Path(directory) / "test_fixture.py"
|
|
171
169
|
test_file.write_text(textwrap.dedent(f'''\
|
|
172
|
-
pytest_plugins = ["scenario_engine.pytest_plugin"]
|
|
173
170
|
from scenario_engine.result import ScenarioResult
|
|
174
171
|
SCENARIO = {SCENARIO!r}
|
|
175
172
|
def test_fixture(scenario_engine):
|
|
@@ -180,8 +177,7 @@ class Phase02BJsonPytestIntegrationTests(unittest.TestCase):
|
|
|
180
177
|
assert first.manifest.run_index == 4
|
|
181
178
|
'''), encoding="utf-8")
|
|
182
179
|
completed = subprocess.run(
|
|
183
|
-
|
|
184
|
-
cwd=directory, env=subprocess_environment(), capture_output=True, text=True,
|
|
180
|
+
pytest_command(test_file), cwd=directory, capture_output=True, text=True,
|
|
185
181
|
)
|
|
186
182
|
self.assertEqual(completed.returncode, 0, completed.stdout + completed.stderr)
|
|
187
183
|
|
|
@@ -191,7 +187,6 @@ class Phase02BJsonPytestIntegrationTests(unittest.TestCase):
|
|
|
191
187
|
source.write_text(SCENARIO, encoding="utf-8")
|
|
192
188
|
test_file = Path(directory) / "test_file_fixture.py"
|
|
193
189
|
test_file.write_text(textwrap.dedent(f'''\
|
|
194
|
-
pytest_plugins = ["scenario_engine.pytest_plugin"]
|
|
195
190
|
from pathlib import Path
|
|
196
191
|
from scenario_engine.result import ScenarioResult
|
|
197
192
|
def test_file_fixture(scenario_engine):
|
|
@@ -201,8 +196,7 @@ class Phase02BJsonPytestIntegrationTests(unittest.TestCase):
|
|
|
201
196
|
assert result.final_state["money"].as_tuple().exponent == -2
|
|
202
197
|
'''), encoding="utf-8")
|
|
203
198
|
completed = subprocess.run(
|
|
204
|
-
|
|
205
|
-
cwd=directory, env=subprocess_environment(), capture_output=True, text=True,
|
|
199
|
+
pytest_command(test_file), cwd=directory, capture_output=True, text=True,
|
|
206
200
|
)
|
|
207
201
|
self.assertEqual(completed.returncode, 0, completed.stdout + completed.stderr)
|
|
208
202
|
|