deterministic-scenario-engine 2.1.0__tar.gz → 2.1.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-2.1.0/src/deterministic_scenario_engine.egg-info → deterministic_scenario_engine-2.1.1}/PKG-INFO +38 -35
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/README.md +32 -34
- deterministic_scenario_engine-2.1.1/docs/product-evidence-gate.md +65 -0
- deterministic_scenario_engine-2.1.1/docs/release-process.md +63 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/pyproject.toml +7 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1/src/deterministic_scenario_engine.egg-info}/PKG-INFO +38 -35
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/deterministic_scenario_engine.egg-info/SOURCES.txt +4 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/_version.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_1_0e_packaging_release_candidate.py +23 -18
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_2_10_workflow_demonstrators.py +2 -2
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_2_12_public_contract_docs_freeze.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_2_13_packaging_fresh_install_rc.py +4 -6
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_2_1_v1_read_contract.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_2_2_composition.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_2_3_matrix.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_2_4_batch.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_2_5_inspect_explain.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_2_7_cli_product_surface.py +1 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_3_11_public_contract_docs_freeze.py +3 -1
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_3_1_evidence_bundle_contract.py +1 -1
- deterministic_scenario_engine-2.1.1/tests/test_readme_pypi_portability.py +61 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/LICENSE +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/MANIFEST.in +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/api.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/compatibility.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/determinism.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/dsl-reference.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/hypothesis.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/phase2-architecture.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/phase2-public-contract.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/phase3-architecture.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/phase3-public-contract.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/plugins.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/quickstart.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/reproducibility.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/schemathesis.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/security-and-non-goals.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/sqlalchemy.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/docs/testing-oracle.md +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/api_scenario.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/cart.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/control_flow.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/ecommerce.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/openapi.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/oracle_fault.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/phase0_1b_cart.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/phase0_3_resources.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/phase0_4_control_flow.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/phase0_5_oracle_fault.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/phase0_6_sqlalchemy_rows.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/phase0_7_ecommerce_plugin.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/phase0_8_api_scenario.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/phase0_8_openapi.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/phase3_ecommerce_evidence.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/resources.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/examples/sqlalchemy_rows.yaml +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/setup.cfg +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/deterministic_scenario_engine.egg-info/dependency_links.txt +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/deterministic_scenario_engine.egg-info/entry_points.txt +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/deterministic_scenario_engine.egg-info/requires.txt +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/deterministic_scenario_engine.egg-info/top_level.txt +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/adapters/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/adapters/json_file.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/adapters/sqlalchemy.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/address.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/artifacts.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/batch/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/batch/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/batch/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/batch/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/batch/runtime.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/cli/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/cli/__main__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/cli/main.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/clock.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/composition/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/composition/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/composition/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/composition/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/composition/parser.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/composition/resolver.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/composition/runtime.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/context.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/control_flow.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/diff/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/diff/compare.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/diff/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/diff/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/diff/render.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/diff/serialization.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/domain_packs/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/domain_packs/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/domain_packs/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/domain_packs/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/domain_packs/registry.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/dsl/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/dsl/compiler.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/dsl/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/dsl/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/dsl/parser.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/dsl/runtime.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/evidence/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/evidence/adapter.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/evidence/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/evidence/compatibility.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/evidence/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/evidence/export.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/evidence/fixture.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/evidence/migration.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/evidence/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/evidence/read.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/expressions.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/faults.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/history.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/ids.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/inspection/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/inspection/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/inspection/explain.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/inspection/inspect.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/inspection/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/inspection/redaction.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/inspection/serialization.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/integrations/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/integrations/hypothesis.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/integrations/schemathesis.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/invariants.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/manifest.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/matrix/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/matrix/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/matrix/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/matrix/expand.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/matrix/filtering.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/matrix/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/matrix/runtime.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/oracle.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/oracle_assertions/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/oracle_assertions/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/oracle_assertions/evaluate.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/oracle_assertions/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/oracle_assertions/serialization.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/plugins.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/provenance.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/pytest_plugin.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/reference_packs/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/reference_packs/ecommerce.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/reference_packs/ecommerce_evidence.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/resources.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/result.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/rng.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/runner.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/state.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/suite/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/suite/errors.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/suite/models.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/suite/read.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/suite/serialization.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/validation.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/src/scenario_engine/values.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_0_1a_semantic_kernel.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_0_1b_linear_dsl.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_0_1c_integrated_phase0_1.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_0_1c_r1_missing_sentinel_repair.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_0_2a_reproducible_results.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_0_2b_json_pytest_integration.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_0_3_resources_constraints.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_0_4_control_flow.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_0_5_oracle_faults.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_0_6_sqlalchemy_materializer.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_0_7_plugins_ecommerce.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_0_8_hypothesis_schemathesis.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_1_0b_public_api_error_contract.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_1_0c_dsl_compatibility_contract.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_1_0d_documentation_examples.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_2_11_performance_scale_hardening.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_2_1_models_serialization.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_2_6_structured_semantic_diff.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_2_8_domain_pack_foundation.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_2_9_oracle_assertions.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_3_10_performance_security_hardening.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_3_12_packaging_fresh_install_rc.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_3_2_safe_bundle_reader_validator.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_3_3_ordered_export.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_3_4_evidence_adapter_contract.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_3_5_compatibility_migration_planner.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_3_6_lossless_migrations_fixture_export.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/tests/test_phase_3_7_cli_interchange_surface.py +0 -0
- {deterministic_scenario_engine-2.1.0 → deterministic_scenario_engine-2.1.1}/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.1
|
|
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
|
|
@@ -35,11 +40,10 @@ Dynamic: license-file
|
|
|
35
40
|
|
|
36
41
|
Deterministic Scenario Engine (DSE) creates reproducible, state-consistent
|
|
37
42
|
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.
|
|
43
|
+
testing. The source-tree distribution version is 2.1.1. Distribution release
|
|
44
|
+
identity and deterministic compatibility identity are separate:
|
|
45
|
+
`ENGINE_VERSION` remains 1.0.0 and DSL version remains 1. For authoritative
|
|
46
|
+
public-release availability and history, see PyPI and GitHub Releases.
|
|
43
47
|
|
|
44
48
|
## Why it exists
|
|
45
49
|
|
|
@@ -74,11 +78,11 @@ make expected behavior explicit.
|
|
|
74
78
|
explicit adapters, closed lossless migrations, and fixture-directory export
|
|
75
79
|
|
|
76
80
|
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).
|
|
81
|
+
testing framework. See [security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md).
|
|
78
82
|
Neither Phase 2 nor Phase 3 adds hidden discovery, network, randomness,
|
|
79
83
|
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).
|
|
84
|
+
is frozen in the [Phase 2 public contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md); the
|
|
85
|
+
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
86
|
|
|
83
87
|
## Installation
|
|
84
88
|
|
|
@@ -98,13 +102,13 @@ Install only the named optional integrations you need:
|
|
|
98
102
|
/tmp/scenario-engine-docs-venv/bin/python -m pip install '.[schemathesis]'
|
|
99
103
|
```
|
|
100
104
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
105
|
+
Install the package with `pip install deterministic-scenario-engine`, or select
|
|
106
|
+
an optional integration with a command such as
|
|
107
|
+
`pip install 'deterministic-scenario-engine[pytest]'`.
|
|
104
108
|
|
|
105
109
|
## Minimal quickstart
|
|
106
110
|
|
|
107
|
-
The public [cart scenario](examples/cart.yaml) is an executable DSL 1 document.
|
|
111
|
+
The public [cart scenario](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/examples/cart.yaml) is an executable DSL 1 document.
|
|
108
112
|
Run it from the repository root:
|
|
109
113
|
|
|
110
114
|
```python
|
|
@@ -139,32 +143,31 @@ normalized result contains the same data under its `state` field.
|
|
|
139
143
|
Generation derives from semantic `ExecutionAddress` values, not consumption of
|
|
140
144
|
a mutable global random stream. Exact replay requires the same canonical
|
|
141
145
|
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).
|
|
146
|
+
Unsupported cross-version replay fails explicitly. See the [determinism model](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/determinism.md),
|
|
147
|
+
[reproducibility guide](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/reproducibility.md), and normative
|
|
148
|
+
[compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md).
|
|
145
149
|
|
|
146
150
|
## Documentation
|
|
147
151
|
|
|
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)
|
|
152
|
+
- [Quickstart](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/quickstart.md)
|
|
153
|
+
- [DSL 1 reference](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/dsl-reference.md)
|
|
154
|
+
- [Determinism model](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/determinism.md)
|
|
155
|
+
- [Reproducibility and replay](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/reproducibility.md)
|
|
156
|
+
- [Testing, faults, and oracle](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/testing-oracle.md)
|
|
157
|
+
- [Plugins](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/plugins.md)
|
|
158
|
+
- [SQLAlchemy adapter](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/sqlalchemy.md)
|
|
159
|
+
- [Hypothesis integration](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/hypothesis.md)
|
|
160
|
+
- [Schemathesis integration](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/schemathesis.md)
|
|
161
|
+
- [Public Python API](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/api.md)
|
|
162
|
+
- [Security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md)
|
|
163
|
+
- [Compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md)
|
|
164
|
+
- [Phase 2 public contract, CLI, and hard bounds](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md)
|
|
165
|
+
- [Phase 3 public contract and evidence interchange](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md)
|
|
162
166
|
|
|
163
167
|
## Status
|
|
164
168
|
|
|
165
169
|
Distribution release identity and deterministic engine compatibility are
|
|
166
|
-
separate contracts.
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
under Apache-2.0.
|
|
170
|
+
separate contracts. This source tree reports distribution version 2.1.1;
|
|
171
|
+
generated core manifests retain `ENGINE_VERSION` 1.0.0 and DSL 1. PyPI and
|
|
172
|
+
GitHub Releases are the authoritative sources for public-release availability
|
|
173
|
+
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.1. 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.1;
|
|
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.
|
|
@@ -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,6 +25,13 @@ 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
|
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deterministic-scenario-engine
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.1
|
|
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
|
|
@@ -35,11 +40,10 @@ Dynamic: license-file
|
|
|
35
40
|
|
|
36
41
|
Deterministic Scenario Engine (DSE) creates reproducible, state-consistent
|
|
37
42
|
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.
|
|
43
|
+
testing. The source-tree distribution version is 2.1.1. Distribution release
|
|
44
|
+
identity and deterministic compatibility identity are separate:
|
|
45
|
+
`ENGINE_VERSION` remains 1.0.0 and DSL version remains 1. For authoritative
|
|
46
|
+
public-release availability and history, see PyPI and GitHub Releases.
|
|
43
47
|
|
|
44
48
|
## Why it exists
|
|
45
49
|
|
|
@@ -74,11 +78,11 @@ make expected behavior explicit.
|
|
|
74
78
|
explicit adapters, closed lossless migrations, and fixture-directory export
|
|
75
79
|
|
|
76
80
|
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).
|
|
81
|
+
testing framework. See [security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md).
|
|
78
82
|
Neither Phase 2 nor Phase 3 adds hidden discovery, network, randomness,
|
|
79
83
|
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).
|
|
84
|
+
is frozen in the [Phase 2 public contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md); the
|
|
85
|
+
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
86
|
|
|
83
87
|
## Installation
|
|
84
88
|
|
|
@@ -98,13 +102,13 @@ Install only the named optional integrations you need:
|
|
|
98
102
|
/tmp/scenario-engine-docs-venv/bin/python -m pip install '.[schemathesis]'
|
|
99
103
|
```
|
|
100
104
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
105
|
+
Install the package with `pip install deterministic-scenario-engine`, or select
|
|
106
|
+
an optional integration with a command such as
|
|
107
|
+
`pip install 'deterministic-scenario-engine[pytest]'`.
|
|
104
108
|
|
|
105
109
|
## Minimal quickstart
|
|
106
110
|
|
|
107
|
-
The public [cart scenario](examples/cart.yaml) is an executable DSL 1 document.
|
|
111
|
+
The public [cart scenario](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/examples/cart.yaml) is an executable DSL 1 document.
|
|
108
112
|
Run it from the repository root:
|
|
109
113
|
|
|
110
114
|
```python
|
|
@@ -139,32 +143,31 @@ normalized result contains the same data under its `state` field.
|
|
|
139
143
|
Generation derives from semantic `ExecutionAddress` values, not consumption of
|
|
140
144
|
a mutable global random stream. Exact replay requires the same canonical
|
|
141
145
|
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).
|
|
146
|
+
Unsupported cross-version replay fails explicitly. See the [determinism model](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/determinism.md),
|
|
147
|
+
[reproducibility guide](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/reproducibility.md), and normative
|
|
148
|
+
[compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md).
|
|
145
149
|
|
|
146
150
|
## Documentation
|
|
147
151
|
|
|
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)
|
|
152
|
+
- [Quickstart](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/quickstart.md)
|
|
153
|
+
- [DSL 1 reference](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/dsl-reference.md)
|
|
154
|
+
- [Determinism model](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/determinism.md)
|
|
155
|
+
- [Reproducibility and replay](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/reproducibility.md)
|
|
156
|
+
- [Testing, faults, and oracle](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/testing-oracle.md)
|
|
157
|
+
- [Plugins](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/plugins.md)
|
|
158
|
+
- [SQLAlchemy adapter](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/sqlalchemy.md)
|
|
159
|
+
- [Hypothesis integration](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/hypothesis.md)
|
|
160
|
+
- [Schemathesis integration](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/schemathesis.md)
|
|
161
|
+
- [Public Python API](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/api.md)
|
|
162
|
+
- [Security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md)
|
|
163
|
+
- [Compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md)
|
|
164
|
+
- [Phase 2 public contract, CLI, and hard bounds](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md)
|
|
165
|
+
- [Phase 3 public contract and evidence interchange](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md)
|
|
162
166
|
|
|
163
167
|
## Status
|
|
164
168
|
|
|
165
169
|
Distribution release identity and deterministic engine compatibility are
|
|
166
|
-
separate contracts.
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
under Apache-2.0.
|
|
170
|
+
separate contracts. This source tree reports distribution version 2.1.1;
|
|
171
|
+
generated core manifests retain `ENGINE_VERSION` 1.0.0 and DSL 1. PyPI and
|
|
172
|
+
GitHub Releases are the authoritative sources for public-release availability
|
|
173
|
+
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,5 @@ 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
|
|
@@ -5,6 +5,7 @@ from hashlib import sha256
|
|
|
5
5
|
from importlib.metadata import EntryPoint
|
|
6
6
|
import json
|
|
7
7
|
from pathlib import Path
|
|
8
|
+
import re
|
|
8
9
|
import sys
|
|
9
10
|
import tomllib
|
|
10
11
|
import unittest
|
|
@@ -53,13 +54,20 @@ class Phase10EPackagingReleaseCandidateTests(unittest.TestCase):
|
|
|
53
54
|
"scenario_engine._version.VERSION",
|
|
54
55
|
)
|
|
55
56
|
# Phase 2 changes package identity, not the frozen deterministic contract.
|
|
56
|
-
self.assertEqual(VERSION, "2.1.
|
|
57
|
+
self.assertEqual(VERSION, "2.1.1")
|
|
57
58
|
self.assertEqual(ENGINE_VERSION, "1.0.0")
|
|
58
59
|
|
|
59
60
|
def test_license_readme_and_build_backend_metadata(self):
|
|
60
61
|
self.assertEqual(self.project["license"], "Apache-2.0")
|
|
61
62
|
self.assertEqual(self.project["license-files"], ["LICENSE"])
|
|
62
63
|
self.assertEqual(self.project["readme"], "README.md")
|
|
64
|
+
self.assertEqual(self.project["urls"], {
|
|
65
|
+
"Homepage": "https://github.com/imshahinul/deterministic-scenario-engine",
|
|
66
|
+
"Documentation": "https://github.com/imshahinul/deterministic-scenario-engine/tree/main/docs",
|
|
67
|
+
"Source": "https://github.com/imshahinul/deterministic-scenario-engine",
|
|
68
|
+
"Issues": "https://github.com/imshahinul/deterministic-scenario-engine/issues",
|
|
69
|
+
"Release Notes": "https://github.com/imshahinul/deterministic-scenario-engine/releases",
|
|
70
|
+
})
|
|
63
71
|
self.assertIn("Apache License\n", (ROOT / "LICENSE").read_text(encoding="utf-8"))
|
|
64
72
|
self.assertEqual(self.config["build-system"]["build-backend"], "setuptools.build_meta")
|
|
65
73
|
self.assertEqual(self.config["build-system"]["requires"], ["setuptools>=77"])
|
|
@@ -120,29 +128,26 @@ class Phase10EPackagingReleaseCandidateTests(unittest.TestCase):
|
|
|
120
128
|
historical_payload["manifest"].pop("engine_version")
|
|
121
129
|
self.assertEqual(current_payload, historical_payload)
|
|
122
130
|
|
|
123
|
-
def
|
|
131
|
+
def test_package_readme_is_release_state_neutral(self):
|
|
124
132
|
readme = (ROOT / "README.md").read_text(encoding="utf-8")
|
|
125
133
|
quickstart = (ROOT / "docs" / "quickstart.md").read_text(encoding="utf-8")
|
|
126
134
|
combined = f"{readme}\n{quickstart}".lower()
|
|
127
135
|
self.assertIn("pip install deterministic-scenario-engine", combined)
|
|
128
|
-
# HISTORICAL_CHECKPOINT_FACT: this test predates publication of 2.0.0.
|
|
129
|
-
# CURRENT_DOCUMENTATION_CONTRACT: stable release facts may be stated, but
|
|
130
|
-
# stale future-publication claims and transient local-RC guidance may not.
|
|
131
|
-
for stale_claim in (
|
|
132
|
-
"future publication",
|
|
133
|
-
"not currently available from pypi",
|
|
134
|
-
"has not been published",
|
|
135
|
-
"unpublished 2.0.0",
|
|
136
|
-
"no pypi or github release has occurred yet",
|
|
137
|
-
):
|
|
138
|
-
with self.subTest(stale_claim=stale_claim):
|
|
139
|
-
self.assertNotIn(stale_claim, combined)
|
|
140
|
-
self.assertNotIn("github.com/", combined)
|
|
141
136
|
self.assertNotIn("/users/", combined)
|
|
142
137
|
self.assertNotIn("phase3_2_validation_venv", combined)
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
138
|
+
|
|
139
|
+
current_version = re.escape(VERSION.lower())
|
|
140
|
+
forbidden_patterns = (
|
|
141
|
+
rf"(?:unpublished|not\s+published)[^\n]{{0,80}}{current_version}",
|
|
142
|
+
rf"{current_version}[^\n]{{0,80}}(?:unpublished|not\s+published)",
|
|
143
|
+
rf"no\s+{current_version}\s+tag(?:\s+exists)?",
|
|
144
|
+
r"no\s+github\s+release(?:\s+exists)?",
|
|
145
|
+
r"no\s+(?:package-index|pypi)\s+publication(?:\s+exists)?",
|
|
146
|
+
r"publication\s+has\s+not\s+occurred",
|
|
147
|
+
)
|
|
148
|
+
for pattern in forbidden_patterns:
|
|
149
|
+
with self.subTest(pattern=pattern):
|
|
150
|
+
self.assertIsNone(re.search(pattern, readme.lower()))
|
|
146
151
|
|
|
147
152
|
def test_top_level_api_is_unchanged_by_version_authority_module(self):
|
|
148
153
|
self.assertNotIn("VERSION", scenario_engine.__all__)
|
|
@@ -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 == "2.1.
|
|
151
|
+
assert VERSION == "2.1.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 == "2.1.
|
|
178
|
+
assert distribution_version == VERSION == "2.1.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"],
|
|
@@ -62,7 +62,7 @@ def test_versions_errors_commands_and_entry_points_are_frozen() -> None:
|
|
|
62
62
|
from scenario_engine.oracle_assertions import ORACLE_ASSERTION_SCHEMA_VERSION
|
|
63
63
|
from scenario_engine.suite import READ_SCHEMA_VERSION, SUITE_SCHEMA_VERSION
|
|
64
64
|
|
|
65
|
-
assert VERSION == "2.1.
|
|
65
|
+
assert VERSION == "2.1.1"
|
|
66
66
|
assert (COMPOSITION_CONTRACT_VERSION, MATRIX_PLAN_CONTRACT_VERSION) == (
|
|
67
67
|
"composition.modules/1", "matrix.plan/1")
|
|
68
68
|
assert (READ_SCHEMA_VERSION, SUITE_SCHEMA_VERSION) == (
|