deterministic-scenario-engine 3.0.0__tar.gz → 3.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {deterministic_scenario_engine-3.0.0/src/deterministic_scenario_engine.egg-info → deterministic_scenario_engine-3.1.0}/PKG-INFO +38 -13
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/README.md +37 -12
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/api.md +37 -3
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/dsl-reference.md +2 -2
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/dsl2-reference.md +2 -1
- deterministic_scenario_engine-3.1.0/docs/engine2-exploration.md +128 -0
- deterministic_scenario_engine-3.1.0/docs/engine2-suite.md +233 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/quickstart.md +22 -2
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/release-notes-3.0.0.md +12 -8
- deterministic_scenario_engine-3.1.0/docs/release-notes-3.0.1.md +38 -0
- deterministic_scenario_engine-3.1.0/docs/release-notes-3.1.0.md +51 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0/src/deterministic_scenario_engine.egg-info}/PKG-INFO +38 -13
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/SOURCES.txt +8 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/_version.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/cli/main.py +31 -2
- deterministic_scenario_engine-3.1.0/src/scenario_engine/engine2_explore.py +201 -0
- deterministic_scenario_engine-3.1.0/src/scenario_engine/engine2_suite.py +946 -0
- deterministic_scenario_engine-3.1.0/tests/test_e2_1_engine2_suite.py +531 -0
- deterministic_scenario_engine-3.1.0/tests/test_e2_2_engine2_exploration.py +345 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_1_0e_packaging_release_candidate.py +19 -17
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_10_workflow_demonstrators.py +2 -2
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_12_public_contract_docs_freeze.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_13_packaging_fresh_install_rc.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_1_v1_read_contract.py +18 -2
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_2_composition.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_3_matrix.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_4_batch.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_5_inspect_explain.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_7_cli_product_surface.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_11_public_contract_docs_freeze.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_1_evidence_bundle_contract.py +1 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_10_canonical_workflow_help.py +11 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_12a_r2_quickstart_installed_consumer.py +49 -2
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_12b_1_version_promotion.py +13 -3
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_6_public_cli_python_execution.py +66 -1
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/LICENSE +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/MANIFEST.in +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/compatibility.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/determinism.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/hypothesis.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/phase2-architecture.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/phase2-public-contract.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/phase3-architecture.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/phase3-public-contract.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/phase4-architecture.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/phase5-architecture.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/plugins.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/product-evidence-gate.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/release-notes-2.2.0.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/release-process.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/reproducibility.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/schemathesis.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/security-and-non-goals.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/sqlalchemy.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/testing-oracle.md +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/api_scenario.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/cart.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/control_flow.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/ecommerce.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/openapi.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/oracle_fault.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/phase0_1b_cart.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/phase0_3_resources.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/phase0_4_control_flow.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/phase0_5_oracle_fault.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/phase0_6_sqlalchemy_rows.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/phase0_7_ecommerce_plugin.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/phase0_8_api_scenario.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/phase0_8_openapi.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/phase3_ecommerce_evidence.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/resources.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/examples/sqlalchemy_rows.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/pyproject.toml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/setup.cfg +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/setup.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/dependency_links.txt +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/entry_points.txt +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/requires.txt +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/top_level.txt +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/adapters/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/adapters/json_file.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/adapters/sqlalchemy.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/address.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/artifacts.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/runtime.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/cli/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/cli/__main__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/clock.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/compatibility.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/compatibility_fixtures.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/parser.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/resolver.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/runtime.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/context.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/control_flow.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/artifacts/current-2.1.2-suite-run-v1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/artifacts/historical-1.0.0-result-v1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/artifacts/historical-2.0.0-suite-run-v1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-incomplete-suite-run-v1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-scenario-mismatch-suite-run-v1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-unknown-engine-suite-run-v1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-unknown-manifest-suite-run-v9.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-unsupported-contract.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/compatibility-fixtures.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/inputs/current-2.1.2-suite-run-v1.inputs.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/inputs/historical-2.0.0-suite-run-v1.inputs.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/scenarios/compatibility_case.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/scenarios/mismatch_case.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/artifacts/manifest-v2.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/artifacts/result-v2.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/artifacts/schedule-v1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/artifacts/suite-run-v2.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/compatibility-fixtures.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/references/legacy-result1.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/corrupt-result-hash.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/duplicate-key.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/incomplete-coordinates.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/invalid-type.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/missing-field.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/mixed-contract-tuple.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/noncanonical-address.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/unknown-contract.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/unknown-engine.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/unknown-field.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-input-hashes.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-root-seed.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-scenario-hash.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-schedule-hash.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-schedule-seed.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-scheduler-contract.json +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/scenarios/scenario-v2.yaml +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/definition_diff.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diagnostics.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/compare.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/render.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/serialization.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/registry.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/actor_runtime.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/compiler.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/parser.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/runtime.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/engine2.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/adapter.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/compatibility.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/export.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/fixture.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/migration.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/read.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/expressions.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/faults.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/history.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/ids.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/impact.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/explain.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/inspect.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/redaction.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/serialization.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/integrations/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/integrations/hypothesis.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/integrations/schemathesis.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/invariants.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/manifest.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/expand.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/filtering.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/runtime.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/evaluate.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/serialization.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/plugins.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/provenance.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/pytest_plugin.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/reference_packs/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/reference_packs/ecommerce.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/reference_packs/ecommerce_evidence.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/resources.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/result.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/rng.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/runner.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/scaffolding.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/schedule.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/scheduler.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/state.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/errors.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/models.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/publication.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/read.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/serialization.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/trace_view.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/validation.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/values.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_1a_semantic_kernel.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_1b_linear_dsl.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_1c_integrated_phase0_1.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_1c_r1_missing_sentinel_repair.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_2a_reproducible_results.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_2b_json_pytest_integration.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_3_resources_constraints.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_4_control_flow.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_5_oracle_faults.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_6_sqlalchemy_materializer.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_7_plugins_ecommerce.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_8_hypothesis_schemathesis.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_1_0b_public_api_error_contract.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_1_0c_dsl_compatibility_contract.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_1_0d_documentation_examples.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_11_performance_scale_hardening.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_1_models_serialization.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_6_structured_semantic_diff.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_8_domain_pack_foundation.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_9_oracle_assertions.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_10_performance_security_hardening.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_12_packaging_fresh_install_rc.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_2_safe_bundle_reader_validator.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_3_ordered_export.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_4_evidence_adapter_contract.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_5_compatibility_migration_planner.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_6_lossless_migrations_fixture_export.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_7_cli_interchange_surface.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_8_ecommerce_evidence_workflow.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_11_cross_version_fixtures.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_12_hardening.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_12r2_public_fixture_packaging.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_12r3_consumer_secret_redaction.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_1_cli_replay_workflow.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_2_replay_compatibility_diagnostics.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_3_filesystem_trust_boundary.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_4_actionable_human_diagnostics.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_5_machine_readable_error_envelope.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_6_author_time_scaffolding.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_7_scenario_definition_structural_diff.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_8_conservative_impact_analysis.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_9_static_trace_viewer.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_10_public_api_cli_compatibility_fixtures.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_11_performance_security_contract_freeze.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_1_dsl2_actor_lane_foundation.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_2_scheduler_kernel.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_3_actor_execution_shared_state.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_4_schedule_identity_replay.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_5_result2_engine2_compatibility.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_7_actor_aware_analysis.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_9_actor_aware_static_trace_viewer.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_readme_pypi_portability.py +0 -0
- {deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/tests/test_test_portability.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deterministic-scenario-engine
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.1.0
|
|
4
4
|
Summary: Reproducible, state-consistent business scenarios with deterministic ground truth
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://github.com/imshahinul/deterministic-scenario-engine
|
|
@@ -41,11 +41,13 @@ Dynamic: license-file
|
|
|
41
41
|
|
|
42
42
|
Deterministic Scenario Engine (DSE) creates reproducible, state-consistent
|
|
43
43
|
business histories and deterministic scenario suites with ground truth for
|
|
44
|
-
testing.
|
|
44
|
+
testing. Distribution 3.0.0 was published on October 9, 2026, on
|
|
45
|
+
[PyPI](https://pypi.org/project/deterministic-scenario-engine/3.0.0/) and as a
|
|
46
|
+
[GitHub Release](https://github.com/imshahinul/deterministic-scenario-engine/releases/tag/3.0.0).
|
|
45
47
|
Distribution and execution compatibility identities are separate: public
|
|
46
48
|
`ENGINE_VERSION` is 2.0.0, while the preserved DSL 1 path records Engine 1.0.0.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
PyPI and GitHub Releases remain authoritative for public-release availability
|
|
50
|
+
and history.
|
|
49
51
|
|
|
50
52
|
## Why it exists
|
|
51
53
|
|
|
@@ -61,6 +63,8 @@ make expected behavior explicit.
|
|
|
61
63
|
- DSL 1 parsing, compilation, and deterministic execution
|
|
62
64
|
- DSL 2 logical-actor execution with an explicit independent schedule seed
|
|
63
65
|
- canonical Result/2, Manifest/2, and Schedule/1 evidence with exact replay
|
|
66
|
+
- finite, ordered serial Engine 2 suites with strict offline aggregate verification
|
|
67
|
+
- finite explicit schedule-seed sweeps over the Engine 2 suite runner
|
|
64
68
|
- actor-aware inspect/explain and deterministic offline trace viewing
|
|
65
69
|
- addressed randomness and logical IDs that do not depend on a shared stream
|
|
66
70
|
- current state plus append-only committed history and artifacts
|
|
@@ -84,9 +88,9 @@ make expected behavior explicit.
|
|
|
84
88
|
- canonical evidence bundles, ordered JSON/JSONL export, compatibility reports,
|
|
85
89
|
explicit adapters, closed lossless migrations, and fixture-directory export
|
|
86
90
|
|
|
87
|
-
The 3.0.0
|
|
91
|
+
The 3.0.0 release adds Engine 2.0.0 and DSL 2 while preserving Engine 1/DSL 1
|
|
88
92
|
behavior and immutable evidence. See the
|
|
89
|
-
[3.0.0
|
|
93
|
+
[3.0.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md).
|
|
90
94
|
|
|
91
95
|
Core execution does not require a database, network service, plugin, or property
|
|
92
96
|
testing framework. See [security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md).
|
|
@@ -106,6 +110,19 @@ python3 -m pip install deterministic-scenario-engine
|
|
|
106
110
|
scenario --help
|
|
107
111
|
```
|
|
108
112
|
|
|
113
|
+
Verify that the same active Python interpreter sees the expected distribution
|
|
114
|
+
and observe the module location it actually imports:
|
|
115
|
+
|
|
116
|
+
```console
|
|
117
|
+
python3 -c 'from importlib.metadata import version; from pathlib import Path; import scenario_engine; print("DSE distribution:", version("deterministic-scenario-engine")); print("Imported module:", Path(scenario_engine.__file__).resolve())'
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The source distribution version is `3.1.0`. PyPI and GitHub Releases are
|
|
121
|
+
authoritative for actual publication and release history. A source-development
|
|
122
|
+
editable install resolves the module under its `src/scenario_engine` directory.
|
|
123
|
+
The DSE distribution version is distinct from Engine 1 (`1.0.0`) and Engine 2
|
|
124
|
+
(`2.0.0`) compatibility versions.
|
|
125
|
+
|
|
109
126
|
Install only the named optional integrations you need:
|
|
110
127
|
|
|
111
128
|
```console
|
|
@@ -165,16 +182,24 @@ self-contained offline HTML file from supported result/evidence.
|
|
|
165
182
|
- [Security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md)
|
|
166
183
|
- [Compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md)
|
|
167
184
|
- [2.2.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-2.2.0.md)
|
|
168
|
-
- [3.0.0
|
|
185
|
+
- [3.0.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md)
|
|
186
|
+
- [3.0.1 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.1.md)
|
|
187
|
+
- [3.1.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.1.0.md)
|
|
188
|
+
- [Engine 2 serial suites](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/engine2-suite.md)
|
|
189
|
+
- [Engine 2 schedule-seed exploration](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/engine2-exploration.md)
|
|
169
190
|
- [Phase 2 public contract, CLI, and hard bounds](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md)
|
|
170
191
|
- [Phase 3 public contract and evidence interchange](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md)
|
|
171
192
|
|
|
172
193
|
## Status
|
|
173
194
|
|
|
174
195
|
Distribution release identity and deterministic engine compatibility are
|
|
175
|
-
separate contracts. This
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
196
|
+
separate contracts. This source tree reports distribution version 3.1.0 and
|
|
197
|
+
public Engine 2.0.0. PyPI and GitHub Releases are authoritative for actual
|
|
198
|
+
publication and release history. Engine 1 manifests remain exactly 1.0.0 with
|
|
199
|
+
integer DSL 1; Engine 2 manifests use 2.0.0 with integer DSL 2. Supported Python
|
|
200
|
+
versions are 3.11–3.14. Module-qualified Engine 2 APIs provide ordered serial
|
|
201
|
+
suite execution, strict aggregate verification, exact native replay, and finite
|
|
202
|
+
explicit schedule-seed sweeps. These additive contracts do not produce or
|
|
203
|
+
reinterpret historical Suite Run/2. Exhaustive exploration, distributed or
|
|
204
|
+
parallel execution, cross-major promotion, remote URI input, and implicit
|
|
205
|
+
schedule-seed derivation remain unsupported. The project is Apache-2.0 licensed.
|
|
@@ -4,11 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
Deterministic Scenario Engine (DSE) creates reproducible, state-consistent
|
|
6
6
|
business histories and deterministic scenario suites with ground truth for
|
|
7
|
-
testing.
|
|
7
|
+
testing. Distribution 3.0.0 was published on October 9, 2026, on
|
|
8
|
+
[PyPI](https://pypi.org/project/deterministic-scenario-engine/3.0.0/) and as a
|
|
9
|
+
[GitHub Release](https://github.com/imshahinul/deterministic-scenario-engine/releases/tag/3.0.0).
|
|
8
10
|
Distribution and execution compatibility identities are separate: public
|
|
9
11
|
`ENGINE_VERSION` is 2.0.0, while the preserved DSL 1 path records Engine 1.0.0.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
PyPI and GitHub Releases remain authoritative for public-release availability
|
|
13
|
+
and history.
|
|
12
14
|
|
|
13
15
|
## Why it exists
|
|
14
16
|
|
|
@@ -24,6 +26,8 @@ make expected behavior explicit.
|
|
|
24
26
|
- DSL 1 parsing, compilation, and deterministic execution
|
|
25
27
|
- DSL 2 logical-actor execution with an explicit independent schedule seed
|
|
26
28
|
- canonical Result/2, Manifest/2, and Schedule/1 evidence with exact replay
|
|
29
|
+
- finite, ordered serial Engine 2 suites with strict offline aggregate verification
|
|
30
|
+
- finite explicit schedule-seed sweeps over the Engine 2 suite runner
|
|
27
31
|
- actor-aware inspect/explain and deterministic offline trace viewing
|
|
28
32
|
- addressed randomness and logical IDs that do not depend on a shared stream
|
|
29
33
|
- current state plus append-only committed history and artifacts
|
|
@@ -47,9 +51,9 @@ make expected behavior explicit.
|
|
|
47
51
|
- canonical evidence bundles, ordered JSON/JSONL export, compatibility reports,
|
|
48
52
|
explicit adapters, closed lossless migrations, and fixture-directory export
|
|
49
53
|
|
|
50
|
-
The 3.0.0
|
|
54
|
+
The 3.0.0 release adds Engine 2.0.0 and DSL 2 while preserving Engine 1/DSL 1
|
|
51
55
|
behavior and immutable evidence. See the
|
|
52
|
-
[3.0.0
|
|
56
|
+
[3.0.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md).
|
|
53
57
|
|
|
54
58
|
Core execution does not require a database, network service, plugin, or property
|
|
55
59
|
testing framework. See [security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md).
|
|
@@ -69,6 +73,19 @@ python3 -m pip install deterministic-scenario-engine
|
|
|
69
73
|
scenario --help
|
|
70
74
|
```
|
|
71
75
|
|
|
76
|
+
Verify that the same active Python interpreter sees the expected distribution
|
|
77
|
+
and observe the module location it actually imports:
|
|
78
|
+
|
|
79
|
+
```console
|
|
80
|
+
python3 -c 'from importlib.metadata import version; from pathlib import Path; import scenario_engine; print("DSE distribution:", version("deterministic-scenario-engine")); print("Imported module:", Path(scenario_engine.__file__).resolve())'
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
The source distribution version is `3.1.0`. PyPI and GitHub Releases are
|
|
84
|
+
authoritative for actual publication and release history. A source-development
|
|
85
|
+
editable install resolves the module under its `src/scenario_engine` directory.
|
|
86
|
+
The DSE distribution version is distinct from Engine 1 (`1.0.0`) and Engine 2
|
|
87
|
+
(`2.0.0`) compatibility versions.
|
|
88
|
+
|
|
72
89
|
Install only the named optional integrations you need:
|
|
73
90
|
|
|
74
91
|
```console
|
|
@@ -128,16 +145,24 @@ self-contained offline HTML file from supported result/evidence.
|
|
|
128
145
|
- [Security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md)
|
|
129
146
|
- [Compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md)
|
|
130
147
|
- [2.2.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-2.2.0.md)
|
|
131
|
-
- [3.0.0
|
|
148
|
+
- [3.0.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md)
|
|
149
|
+
- [3.0.1 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.1.md)
|
|
150
|
+
- [3.1.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.1.0.md)
|
|
151
|
+
- [Engine 2 serial suites](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/engine2-suite.md)
|
|
152
|
+
- [Engine 2 schedule-seed exploration](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/engine2-exploration.md)
|
|
132
153
|
- [Phase 2 public contract, CLI, and hard bounds](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md)
|
|
133
154
|
- [Phase 3 public contract and evidence interchange](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md)
|
|
134
155
|
|
|
135
156
|
## Status
|
|
136
157
|
|
|
137
158
|
Distribution release identity and deterministic engine compatibility are
|
|
138
|
-
separate contracts. This
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
159
|
+
separate contracts. This source tree reports distribution version 3.1.0 and
|
|
160
|
+
public Engine 2.0.0. PyPI and GitHub Releases are authoritative for actual
|
|
161
|
+
publication and release history. Engine 1 manifests remain exactly 1.0.0 with
|
|
162
|
+
integer DSL 1; Engine 2 manifests use 2.0.0 with integer DSL 2. Supported Python
|
|
163
|
+
versions are 3.11–3.14. Module-qualified Engine 2 APIs provide ordered serial
|
|
164
|
+
suite execution, strict aggregate verification, exact native replay, and finite
|
|
165
|
+
explicit schedule-seed sweeps. These additive contracts do not produce or
|
|
166
|
+
reinterpret historical Suite Run/2. Exhaustive exploration, distributed or
|
|
167
|
+
parallel execution, cross-major promotion, remote URI input, and implicit
|
|
168
|
+
schedule-seed derivation remain unsupported. The project is Apache-2.0 licensed.
|
|
@@ -9,12 +9,13 @@ exports.
|
|
|
9
9
|
## Constants and value objects
|
|
10
10
|
|
|
11
11
|
- `scenario_engine.ENGINE_VERSION` — public current Engine coordinate, `2.0.0`.
|
|
12
|
-
- `scenario_engine._version.VERSION` — distribution coordinate, `3.
|
|
12
|
+
- `scenario_engine._version.VERSION` — source distribution coordinate, `3.1.0`.
|
|
13
13
|
- `scenario_engine._version.ENGINE1_VERSION` — explicit historical Engine 1
|
|
14
14
|
execution coordinate, `1.0.0`; not added to the frozen package-root exports.
|
|
15
15
|
|
|
16
|
-
- `ENGINE_VERSION` — engine compatibility version recorded in manifests
|
|
17
|
-
|
|
16
|
+
- `ENGINE_VERSION` — engine compatibility version recorded in manifests:
|
|
17
|
+
Engine 1 Manifest/1 records 1.0.0, while Engine 2 Manifest/2 records 2.0.0;
|
|
18
|
+
both are independent of the distribution version.
|
|
18
19
|
- `MISSING` — singleton semantic missing value, distinct from null.
|
|
19
20
|
- `LogicalID(value: str)` — deterministic logical identifier value; users
|
|
20
21
|
normally receive it from `$id` generation.
|
|
@@ -85,6 +86,39 @@ observations, and returns the verified immutable Result/2. It never reconstructs
|
|
|
85
86
|
missing schedule evidence. Compatibility classification is explicit and does not
|
|
86
87
|
execute, migrate, or promote evidence. Existing Engine 1 functions are unchanged.
|
|
87
88
|
|
|
89
|
+
### Engine 2 suites and finite seed sweeps
|
|
90
|
+
|
|
91
|
+
The additive suite API is public only from `scenario_engine.engine2_suite`:
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
Engine2CaseRequest(...)
|
|
95
|
+
Engine2SuitePlan(cases)
|
|
96
|
+
execute_engine2_suite(plan) -> Engine2SuiteOutcome
|
|
97
|
+
read_engine2_suite(source) -> Engine2SuiteOutcome
|
|
98
|
+
verify_engine2_suite(suite, child_evidence=None) -> Engine2SuiteOutcome
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Suite execution is finite, serial, and exactly plan ordered. Every case uses
|
|
102
|
+
explicit Engine 2 coordinates. The strict reader verifies canonical aggregate
|
|
103
|
+
shape and identity; `verify_engine2_suite()` additionally verifies supplied
|
|
104
|
+
native Result/2, Manifest/2, and Schedule/1 bytes and their cross-artifact
|
|
105
|
+
coordinates. Offline aggregate verification does not execute or replay cases.
|
|
106
|
+
Exact replay remains a separate `replay_engine2()` operation requiring the exact
|
|
107
|
+
scenario, effective inputs, and trusted plugin registry.
|
|
108
|
+
|
|
109
|
+
The finite exploration convenience API is public only from
|
|
110
|
+
`scenario_engine.engine2_explore`:
|
|
111
|
+
|
|
112
|
+
```python
|
|
113
|
+
Engine2SeedSweepRequest(...)
|
|
114
|
+
explore_engine2_seeds(request) -> Engine2SeedSweepOutcome
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
It accepts an explicit ordered collection of 1..64 unique schedule seeds and
|
|
118
|
+
uses the suite runner serially. It does not derive seeds, exhaustively explore a
|
|
119
|
+
state space, run in parallel, or distribute execution. Neither module adds
|
|
120
|
+
package-root exports or creates historical Suite Run/2 artifacts.
|
|
121
|
+
|
|
88
122
|
`schedule_seed` is a required independent unsigned 64-bit coordinate. It is not
|
|
89
123
|
derived from `root_seed`. Engine 2 writes Result/2, Manifest/2, and Schedule/1;
|
|
90
124
|
exact replay requires the matching result, schedule, scenario, and explicit
|
{deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/dsl-reference.md
RENAMED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
This reference describes the frozen Scenario Engine DSL 1 grammar and semantics.
|
|
4
4
|
Unknown keys are rejected in every schema-defined mapping.
|
|
5
5
|
|
|
6
|
-
DSL 1 remains bound to Engine 1.0.0, Result/1, Manifest/1, and Suite Run/1 in
|
|
7
|
-
|
|
6
|
+
DSL 1 remains bound to Engine 1.0.0, Result/1, Manifest/1, and Suite Run/1 in the
|
|
7
|
+
3.1.0 distribution. Public Engine 2.0.0 does not promote or reinterpret DSL 1.
|
|
8
8
|
See [DSL 2](dsl2-reference.md) for logical actors.
|
|
9
9
|
|
|
10
10
|
## Root document
|
{deterministic_scenario_engine-3.0.0 → deterministic_scenario_engine-3.1.0}/docs/dsl2-reference.md
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# DSL 2 logical-actor reference
|
|
2
2
|
|
|
3
|
-
**Status:
|
|
3
|
+
**Status: RELEASED — DSE distribution 3.0.0, published October 9, 2026.** See
|
|
4
|
+
the [GitHub Release](https://github.com/imshahinul/deterministic-scenario-engine/releases/tag/3.0.0).
|
|
4
5
|
|
|
5
6
|
DSL 2 is selected only by integer `dsl_version: 2` and executes with Engine
|
|
6
7
|
2.0.0. It preserves DSL 1 expression, deterministic value, resource, plugin,
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Engine 2 deterministic schedule-seed exploration
|
|
2
|
+
|
|
3
|
+
## Scope and module-qualified API
|
|
4
|
+
|
|
5
|
+
`scenario_engine.engine2_explore` provides:
|
|
6
|
+
|
|
7
|
+
* `Engine2SeedSweepRequest`;
|
|
8
|
+
* `Engine2SeedSweepOutcome`; and
|
|
9
|
+
* `explore_engine2_seeds(request)`.
|
|
10
|
+
|
|
11
|
+
These names are deliberately not package-root exports. A sweep is a finite,
|
|
12
|
+
serial convenience operation over the existing hardened Engine 2 suite runner.
|
|
13
|
+
It is not systematic scheduler branching, exhaustive model checking, state-space
|
|
14
|
+
coverage, race-detection completeness, minimization, shrinking, distributed
|
|
15
|
+
execution, or actual parallel execution.
|
|
16
|
+
|
|
17
|
+
## Request and deterministic coordinates
|
|
18
|
+
|
|
19
|
+
`Engine2SeedSweepRequest` requires one validated `CompiledScenarioV2`, one
|
|
20
|
+
explicit root seed, an explicit run index, and an exact `list` or `tuple` of
|
|
21
|
+
schedule seeds. It optionally accepts one supplied-input mapping and one explicit
|
|
22
|
+
trusted `PluginRegistry`. The common expectation is `SUCCESS`, or `FAILED` plus
|
|
23
|
+
one common expected failure code.
|
|
24
|
+
|
|
25
|
+
The seed collection must contain 1..64 unique integers in `0..2^64-1`.
|
|
26
|
+
Booleans, strings, floats, duplicates, sets, mappings, generators, empty
|
|
27
|
+
collections, and larger collections fail before execution. No seed is derived or
|
|
28
|
+
randomly generated, and supplied order is preserved exactly.
|
|
29
|
+
|
|
30
|
+
Each seed becomes one `Engine2CaseRequest`; that accepted type remains the
|
|
31
|
+
validator for scenario, root seed, run index, resources, inputs, plugins,
|
|
32
|
+
compatibility coordinates, and expectations. Case identifiers use the fixed
|
|
33
|
+
zero-based format `seed-sweep-{position:02d}` (for example, `seed-sweep-00`).
|
|
34
|
+
Position and schedule seed are identity-bearing, so seed reordering changes the
|
|
35
|
+
plan identity. Across cases only schedule seed, position, case ID, and resulting
|
|
36
|
+
case identity vary. Scenario, scenario identity, root seed, run index, inputs,
|
|
37
|
+
effective resources, plugin registry identity, expectation, and native
|
|
38
|
+
compatibility coordinates remain fixed. Each native execution receives a fresh
|
|
39
|
+
thawed input value; mutable execution state is not shared between cases.
|
|
40
|
+
|
|
41
|
+
## Outcome and authoritative evidence
|
|
42
|
+
|
|
43
|
+
`explore_engine2_seeds` constructs one `Engine2SuitePlan` and calls the existing
|
|
44
|
+
`execute_engine2_suite` once. Execution is serial and plan ordered. The immutable
|
|
45
|
+
`Engine2SeedSweepOutcome` exposes its original `Engine2SuiteOutcome` as `suite`.
|
|
46
|
+
The seed list, IDs, identities, plan identity, attempted count, four status
|
|
47
|
+
counts, non-success case coordinates, and first-observed distinct native schedule
|
|
48
|
+
artifact identities are derived only from that suite outcome. They are not a
|
|
49
|
+
second canonical evidence contract or competing source of truth.
|
|
50
|
+
|
|
51
|
+
Direct construction of `Engine2SeedSweepOutcome` validates, without executing or
|
|
52
|
+
replaying the suite, that its authoritative suite has the seed-sweep shape. Case
|
|
53
|
+
IDs and positions must exactly match their ordered `seed-sweep-{position:02d}`
|
|
54
|
+
coordinates, schedule seeds must be unique native-range integers, and every
|
|
55
|
+
other request coordinate must be identical across cases. Consequently an
|
|
56
|
+
ordinary suite, or a suite heterogeneous in scenario, root seed, run index,
|
|
57
|
+
inputs, resources, plugins, expectations, or native compatibility coordinates,
|
|
58
|
+
cannot be silently presented as a seed sweep.
|
|
59
|
+
|
|
60
|
+
Every `SUCCESS`, `EXPECTED_FAILURE`, `UNEXPECTED_FAILURE`, and `ERROR` remains in
|
|
61
|
+
the suite. Expected failure changes only the suite-level status interpretation;
|
|
62
|
+
the native Result/2 and Schedule/1 remain `FAILED`. Completed cases retain exact
|
|
63
|
+
Result/2, Manifest/2, and Schedule/1 authority. An `ERROR` has no fabricated
|
|
64
|
+
native children and cannot independently provide replayable native evidence. A
|
|
65
|
+
runtime suite retention or selection limit remains a truthful `ERROR` according
|
|
66
|
+
to the existing fail-closed suite contract.
|
|
67
|
+
|
|
68
|
+
The `schedule_artifact_identities` field is useful for exact artifact comparison,
|
|
69
|
+
but distinct hashes do **not** prove distinct logical interleavings: schedule
|
|
70
|
+
artifact identity includes execution coordinates such as the schedule seed. No
|
|
71
|
+
new scheduling-decision trace equivalence is inferred.
|
|
72
|
+
|
|
73
|
+
## Offline verification and exact replay
|
|
74
|
+
|
|
75
|
+
Canonical suite bytes continue to use `read_engine2_suite`, followed by
|
|
76
|
+
`verify_engine2_suite(suite, child_evidence)` for aggregate integrity, exact
|
|
77
|
+
native child bytes, native identities, and coordinate linkage. Aggregate
|
|
78
|
+
verification is not replay and no second verifier is introduced.
|
|
79
|
+
|
|
80
|
+
Each completed in-memory case can be replayed separately:
|
|
81
|
+
|
|
82
|
+
```python
|
|
83
|
+
from scenario_engine.engine2 import replay_engine2
|
|
84
|
+
|
|
85
|
+
for case in outcome.suite.cases:
|
|
86
|
+
if case.result is not None and case.schedule is not None:
|
|
87
|
+
replay_engine2(
|
|
88
|
+
case.result,
|
|
89
|
+
case.schedule,
|
|
90
|
+
scenario,
|
|
91
|
+
inputs=original_inputs,
|
|
92
|
+
plugins=trusted_plugins,
|
|
93
|
+
)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Replay requires the exact scenario and may require the original effective
|
|
97
|
+
supplied inputs. Plugin cases require the exact trusted registry. Plugins are
|
|
98
|
+
unsandboxed Python, are not discovered, and are not a security boundary. Error
|
|
99
|
+
records without native children are not independently replayable evidence.
|
|
100
|
+
|
|
101
|
+
## Resource limits
|
|
102
|
+
|
|
103
|
+
The operation inherits all accepted suite limits: at most 64 cases; 262,144
|
|
104
|
+
canonical input bytes per case; 4,194,304 aggregate input bytes; 524,288 request
|
|
105
|
+
bytes per case; 1,048,576 aggregate request bytes; nesting depth 32; 65,536
|
|
106
|
+
native selections per case; 262,144 aggregate selections; 67,108,864 retained
|
|
107
|
+
child bytes; and 2,097,152 canonical suite bytes. Seed validation is finite and
|
|
108
|
+
occurs before execution. Plan validation does not invoke plugin callables.
|
|
109
|
+
|
|
110
|
+
## Minimal consumer example
|
|
111
|
+
|
|
112
|
+
```python
|
|
113
|
+
from scenario_engine.engine2 import validate_engine2
|
|
114
|
+
from scenario_engine.engine2_explore import Engine2SeedSweepRequest, explore_engine2_seeds
|
|
115
|
+
|
|
116
|
+
scenario = validate_engine2(open("scenario.yaml", encoding="utf-8").read())
|
|
117
|
+
outcome = explore_engine2_seeds(Engine2SeedSweepRequest(
|
|
118
|
+
scenario=scenario,
|
|
119
|
+
root_seed="release-17",
|
|
120
|
+
schedule_seeds=[0, 1, 9],
|
|
121
|
+
run_index=0,
|
|
122
|
+
))
|
|
123
|
+
print(outcome.plan_identity, outcome.suite.aggregate_hash, outcome.success_count)
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
The tested contract suite validates the same API workflow with inline supported
|
|
127
|
+
DSL 2 scenarios; this file-dependent consumer snippet is illustrative and does
|
|
128
|
+
not claim validation of an external `scenario.yaml`.
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# Engine 2 serial suite contract
|
|
2
|
+
|
|
3
|
+
This document defines the accepted `scenario.engine2-case/1`,
|
|
4
|
+
`scenario.engine2-suite-plan/1`, and `scenario.engine2-suite/1` contracts included
|
|
5
|
+
in distribution 3.1.0. They are additive and module-qualified. Existing
|
|
6
|
+
Result/2, Manifest/2, Schedule/1, Scheduler/1, historical Suite Run/2, Engine 1,
|
|
7
|
+
Engine 2 compatibility version 2.0.0, and package-root exports are unchanged.
|
|
8
|
+
|
|
9
|
+
## Scope and API
|
|
10
|
+
|
|
11
|
+
The API is available only from `scenario_engine.engine2_suite`:
|
|
12
|
+
|
|
13
|
+
* `Engine2CaseRequest`, `Engine2SuitePlan`, `Engine2CaseOutcome`, and
|
|
14
|
+
`Engine2SuiteOutcome`;
|
|
15
|
+
* `execute_engine2_suite(plan)`;
|
|
16
|
+
* `read_engine2_suite(source)`; and
|
|
17
|
+
* `verify_engine2_suite(suite, child_evidence=None)`.
|
|
18
|
+
|
|
19
|
+
Execution is finite, serial, and exactly plan ordered. It accepts only already
|
|
20
|
+
validated `CompiledScenarioV2` values and explicit independent `root_seed` and
|
|
21
|
+
`schedule_seed` coordinates. It does not explore schedules, execute remotely,
|
|
22
|
+
run in parallel, discover plugins, access a network, or support cross-major
|
|
23
|
+
execution. Plugins are explicit trusted, unsandboxed Python and are not a
|
|
24
|
+
security boundary.
|
|
25
|
+
|
|
26
|
+
## Limits
|
|
27
|
+
|
|
28
|
+
The initial hard limits are deliberately smaller than the native per-run and
|
|
29
|
+
older batch ceilings:
|
|
30
|
+
|
|
31
|
+
| Limit | Value |
|
|
32
|
+
| --- | ---: |
|
|
33
|
+
| cases per plan | 64 |
|
|
34
|
+
| canonical supplied inputs per case | 262,144 bytes |
|
|
35
|
+
| aggregate canonical supplied inputs | 4,194,304 bytes |
|
|
36
|
+
| canonical case request coordinates | 524,288 bytes |
|
|
37
|
+
| aggregate canonical case request coordinates | 1,048,576 bytes |
|
|
38
|
+
| input nesting depth | 32 |
|
|
39
|
+
| native selections per case | 65,536 |
|
|
40
|
+
| aggregate native selections | 262,144 |
|
|
41
|
+
| retained Result/2 + Manifest/2 + Schedule/1 bytes | 67,108,864 bytes |
|
|
42
|
+
| canonical suite aggregate | 2,097,152 bytes |
|
|
43
|
+
| canonical error record | 512 bytes |
|
|
44
|
+
| case identifier UTF-8 bytes | 128 bytes |
|
|
45
|
+
|
|
46
|
+
The 64-case, 64 MiB retained-evidence, and 2 MiB aggregate limits keep a suite
|
|
47
|
+
reviewable and prevent the architecture proposal's unqualified 1,000-case and
|
|
48
|
+
4 GiB values from becoming accidental commitments. Bounds are checked before
|
|
49
|
+
case execution when knowable and incrementally before evidence retention.
|
|
50
|
+
Integers exclude booleans. Exceeding a plan/input bound rejects the entire plan;
|
|
51
|
+
exceeding a runtime aggregate selection or retention bound records a redacted
|
|
52
|
+
case `ERROR` and continues only when safe. Nothing is silently truncated or
|
|
53
|
+
represented as success. Plans must be explicit ordered sequences; generators
|
|
54
|
+
and unordered containers are rejected before materialization. Input nesting is
|
|
55
|
+
checked before normalization and immutable copying. A native Result/2 or
|
|
56
|
+
Schedule/1 construction/serialization defect aborts the suite rather than
|
|
57
|
+
discarding authoritative evidence and continuing with a misleading case record.
|
|
58
|
+
The aggregate supplied-input limit is enforced against the sum of every case
|
|
59
|
+
request's declared `input_bytes` during plan construction, aggregate object
|
|
60
|
+
construction, strict canonical reading, and independent offline verification.
|
|
61
|
+
Each declaration remains subject to its per-case limit; an aggregate containing
|
|
62
|
+
individually valid declarations is rejected when their sum exceeds 4,194,304.
|
|
63
|
+
|
|
64
|
+
## `scenario.engine2-case/1`
|
|
65
|
+
|
|
66
|
+
The canonical case identity payload has exactly these required fields:
|
|
67
|
+
|
|
68
|
+
* `contract`: literal `scenario.engine2-case/1`;
|
|
69
|
+
* `position`: nonnegative integer equal to the containing list index;
|
|
70
|
+
* `case_id`: unique portable ASCII label matching
|
|
71
|
+
`[A-Za-z0-9][A-Za-z0-9._:@/-]{0,127}`;
|
|
72
|
+
* `scenario_hash`: existing canonical scenario SHA-256;
|
|
73
|
+
* `root_seed`: explicit string or integer, excluding boolean;
|
|
74
|
+
* `schedule_seed`: explicit integer in `0..2^64-1`, excluding boolean;
|
|
75
|
+
* `run_index`: explicit nonnegative integer, excluding boolean;
|
|
76
|
+
* `input_hash`: SHA-256 of canonical bytes for the complete supplied input
|
|
77
|
+
mapping, including unused supplied inputs;
|
|
78
|
+
* `input_bytes`: byte length of those canonical input bytes;
|
|
79
|
+
* `input_resource_hashes`: authoritative hashes from existing resource
|
|
80
|
+
resolution for the effective inputs;
|
|
81
|
+
* `plugin_versions`: sorted explicit registry name-to-version mapping;
|
|
82
|
+
* `reference_clock_start`: canonical timezone-aware semantic datetime,
|
|
83
|
+
normalized to UTC by the existing native Engine 2 clock rule;
|
|
84
|
+
* `generator_versions`: existing generator requirements, including declared
|
|
85
|
+
plugin requirements;
|
|
86
|
+
* `domain_pack_versions`: explicit empty mapping;
|
|
87
|
+
* `dsl_version`, `engine_version`, `result_contract`, `manifest_contract`,
|
|
88
|
+
`schedule_contract`, `scheduler_contract`, `execution_model`,
|
|
89
|
+
`rng_algorithm_version`, `id_algorithm_version`, and `locale`: the exact
|
|
90
|
+
supported tuple `2`, `2.0.0`, `scenario.result/2`, `scenario.manifest/2`,
|
|
91
|
+
`scenario.schedule/1`, `scenario.scheduler/1`, `logical-actors/1`, current
|
|
92
|
+
RNG/ID versions, and `C`; and
|
|
93
|
+
* `expectation`: an exact object with `classification` (`SUCCESS` or `FAILED`)
|
|
94
|
+
and `failure_code` (null for `SUCCESS`, otherwise a nonempty stable code).
|
|
95
|
+
|
|
96
|
+
`case_identity` is lowercase SHA-256 of canonical bytes for that complete
|
|
97
|
+
payload. The in-memory request accepts convenience defaults for `run_index=0`,
|
|
98
|
+
empty inputs, no plugin registry, and expected success; construction converts
|
|
99
|
+
them into every explicit canonical coordinate above. Scenario and plugin Python
|
|
100
|
+
objects are excluded from serialized evidence. Resource identities are resolved
|
|
101
|
+
before execution; no pre-execution identity is fabricated. Registry entries
|
|
102
|
+
must exactly satisfy every declared plugin name/version. Plugin callables are
|
|
103
|
+
never invoked by plan validation.
|
|
104
|
+
|
|
105
|
+
## Plan identity
|
|
106
|
+
|
|
107
|
+
An `Engine2SuitePlan` contains 1..64 unique case IDs and unique case identities.
|
|
108
|
+
It assigns positions in request order and validates every case before any case
|
|
109
|
+
executes. Its exact canonical plan identity payload is:
|
|
110
|
+
|
|
111
|
+
```text
|
|
112
|
+
{"case_identities":[...],"contract":"scenario.engine2-suite-plan/1",
|
|
113
|
+
"limits":{"aggregate_input_bytes":4194304,"aggregate_selections":262144,
|
|
114
|
+
"canonical_suite_bytes":2097152,"cases":64,"error_bytes":512,
|
|
115
|
+
"input_bytes_per_case":262144,"request_bytes_per_case":524288,
|
|
116
|
+
"request_bytes_total":1048576,"retained_child_bytes":67108864,
|
|
117
|
+
"selections_per_case":65536}}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
where the shown object is canonically encoded without whitespace and the
|
|
121
|
+
identity list is plan ordered. `plan_hash` is SHA-256 of those canonical bytes.
|
|
122
|
+
All limit fields are mandatory identity-bearing coordinates; there are no
|
|
123
|
+
serialized implicit defaults.
|
|
124
|
+
|
|
125
|
+
## `scenario.engine2-suite/1`
|
|
126
|
+
|
|
127
|
+
The canonical suite object has exactly these required fields:
|
|
128
|
+
|
|
129
|
+
* `contract`: literal `scenario.engine2-suite/1`;
|
|
130
|
+
* `plan`: exact object containing `contract`, ordered `case_identities`, exact
|
|
131
|
+
`limits`, and `plan_hash`;
|
|
132
|
+
* `cases`: ordered case outcome records;
|
|
133
|
+
* `counts`: exact object containing integer `success`, `expected_failure`,
|
|
134
|
+
`unexpected_failure`, `error`, and `total`;
|
|
135
|
+
* `status`: `SUCCESS` only when every case is `SUCCESS` or
|
|
136
|
+
`EXPECTED_FAILURE`, otherwise `FAILED`; and
|
|
137
|
+
* `aggregate_hash`: SHA-256 of canonical bytes for all preceding fields.
|
|
138
|
+
|
|
139
|
+
Each case outcome record has exactly `request`, `case_identity`, `status`,
|
|
140
|
+
`observed`, `native`, and `error`. `request` is the complete case identity
|
|
141
|
+
payload. `status` is one of `SUCCESS`, `EXPECTED_FAILURE`,
|
|
142
|
+
`UNEXPECTED_FAILURE`, or `ERROR`. `observed` is exactly
|
|
143
|
+
`{"classification": "SUCCESS"|"FAILED"|null, "failure_code": string|null}`.
|
|
144
|
+
|
|
145
|
+
For a completed native execution, `native` is an object with `result`,
|
|
146
|
+
`manifest`, and `schedule`. Every reference has exactly `contract`, `identity`,
|
|
147
|
+
`sha256`, and `size`: `identity` is the native result/manifest/schedule hash,
|
|
148
|
+
while `sha256` hashes the complete exact canonical artifact bytes. For an
|
|
149
|
+
execution error without retained authoritative native evidence, `native` is
|
|
150
|
+
null; child hashes are never invented.
|
|
151
|
+
|
|
152
|
+
`error` is null unless status is `ERROR`. An error is exactly `stage`, `family`,
|
|
153
|
+
`code`, and `message`. The complete accepted combinations are:
|
|
154
|
+
|
|
155
|
+
| Stage | Family | Code | Fixed message |
|
|
156
|
+
| --- | --- | --- | --- |
|
|
157
|
+
| `preflight` | `VALIDATION` | `CASE_VALIDATION_FAILED` | `case validation failed` |
|
|
158
|
+
| `execution` | `PLUGIN` | `PLUGIN_EXECUTION_FAILED` | `trusted plugin execution failed` |
|
|
159
|
+
| `execution` | `INTERNAL` | `INTERNAL_EXECUTION_FAILED` | `case execution failed` |
|
|
160
|
+
| `retention` | `LIMIT` | `CHILD_EVIDENCE_BOUND_EXCEEDED` | `retained child evidence bound exceeded` |
|
|
161
|
+
| `retention` | `LIMIT` | `SELECTION_BOUND_EXCEEDED` | `aggregate scheduler selection bound exceeded` |
|
|
162
|
+
|
|
163
|
+
No cross-combination is valid. Plan construction normally rejects validation
|
|
164
|
+
defects before execution; the preflight row reserves the only stable redacted
|
|
165
|
+
record shape for a safely isolated case-validation failure. Unknown fields,
|
|
166
|
+
codes, stages, families, altered messages, child references on an `ERROR`, and
|
|
167
|
+
non-null observations on an `ERROR` are invalid. Exception text, paths, supplied
|
|
168
|
+
values, plugin arguments, private inputs, and secrets are never serialized.
|
|
169
|
+
|
|
170
|
+
A normal successful Result/2 matches only a declared `SUCCESS`. A native failed
|
|
171
|
+
Result/2 always remains classified `FAILED`. It becomes suite status
|
|
172
|
+
`EXPECTED_FAILURE` only when the declaration is `FAILED`, its failure code
|
|
173
|
+
exactly equals both Result/2 and Schedule/1 failure codes, and the raised error
|
|
174
|
+
is a recognized deterministic `InvariantViolation` with the same authoritative
|
|
175
|
+
`internal_outcome`. Every other native failure is `UNEXPECTED_FAILURE`.
|
|
176
|
+
Validation, plugin, limit, and unrecognized exceptions can never satisfy an
|
|
177
|
+
expected-failure declaration. The supported expected-failure code set contains
|
|
178
|
+
only `InvariantViolation`; it is not expanded by a matching arbitrary string.
|
|
179
|
+
Every completed native observation other than expected success or that one
|
|
180
|
+
supported expected invariant failure is `UNEXPECTED_FAILURE`. The strict reader
|
|
181
|
+
enforces this status matrix. Because exception objects are not serialized, an
|
|
182
|
+
offline reader can validate the stable code and native linkage but cannot prove
|
|
183
|
+
that Python exception provenance was truly `InvariantViolation`; that stronger
|
|
184
|
+
claim belongs to trusted execution or exact replay.
|
|
185
|
+
|
|
186
|
+
## Strict reading and verification
|
|
187
|
+
|
|
188
|
+
`read_engine2_suite` accepts bounded UTF-8 canonical bytes only. It rejects
|
|
189
|
+
duplicate JSON keys, noncanonical bytes, excess nesting, unknown or missing
|
|
190
|
+
fields, unsupported contracts/versions, bool-as-int values, bad hashes,
|
|
191
|
+
duplicate IDs/identities, positions not equal to list indexes, malformed status
|
|
192
|
+
combinations, malformed or noncanonical datetime wrappers, naive or non-datetime
|
|
193
|
+
reference clocks, aggregate declared-input overflow, and inconsistent
|
|
194
|
+
counters/status. Unhashable or incorrectly typed status/error fields produce
|
|
195
|
+
stable suite-validation errors rather than escaping lookup exceptions. It
|
|
196
|
+
reconstructs no scenario or plugin objects.
|
|
197
|
+
|
|
198
|
+
`verify_engine2_suite` independently rechecks suite identities and accepts
|
|
199
|
+
bounded child bytes supplied in memory as
|
|
200
|
+
`{case_id: {"result": bytes, "manifest": bytes, "schedule": bytes}}`. It uses
|
|
201
|
+
the existing strict native readers, validates exact byte size/SHA-256/native
|
|
202
|
+
identity, verifies Manifest/2 equals the manifest embedded by Result/2, and
|
|
203
|
+
checks every scenario/resource/seed/run/version/classification/failure and
|
|
204
|
+
Result/2-to-Schedule/1 relationship. Missing, swapped, duplicated, incompatible,
|
|
205
|
+
or tampered evidence fails closed. No filesystem publication or resolver is
|
|
206
|
+
introduced.
|
|
207
|
+
|
|
208
|
+
The verification boundary has four distinct layers:
|
|
209
|
+
|
|
210
|
+
1. **Canonical aggregate integrity:** strict shape, bounds, canonical bytes,
|
|
211
|
+
status/count semantics, plan identity, case identities, and aggregate hash.
|
|
212
|
+
2. **Native child artifact integrity:** exact byte lengths and SHA-256 values,
|
|
213
|
+
strict native readers, and native Result/2, Manifest/2, and Schedule/1
|
|
214
|
+
identities.
|
|
215
|
+
3. **Cross-artifact coordinate linkage:** scenario, effective-resource hashes,
|
|
216
|
+
explicit seeds, run index, clock, versions, classification, failure, and
|
|
217
|
+
Result/2-to-Schedule/1 references agree.
|
|
218
|
+
4. **Actual scenario replay:** execution of the exact scenario with its effective
|
|
219
|
+
original inputs and trusted plugin registry through existing `replay_engine2`.
|
|
220
|
+
|
|
221
|
+
`verify_engine2_suite` establishes A-C only; it never claims or performs D. It
|
|
222
|
+
executes no scenario, plugin, network request, or external command. Supplied-input
|
|
223
|
+
hash and byte length are identity coordinates for the complete supplied mapping,
|
|
224
|
+
including unused values; effective-resource hashes separately link the resolved
|
|
225
|
+
resource snapshot. The original supplied/effective inputs may therefore be
|
|
226
|
+
required separately for exact replay. Plugin registry name/version identity does
|
|
227
|
+
not prove correctness or safety of untrusted Python callables. Likewise, a
|
|
228
|
+
canonical `ERROR` record proves only that the aggregate contains an allowed
|
|
229
|
+
redacted claim; offline verification cannot prove an actual execution exception
|
|
230
|
+
occurred. Exact replay is separate and requires the exact scenario, inputs, and
|
|
231
|
+
trusted registry for each complete case. Suite Run/2 is neither produced nor
|
|
232
|
+
reinterpreted because partial cases and duplicate native result identities cannot
|
|
233
|
+
always satisfy its frozen uniqueness/completeness semantics.
|