deterministic-scenario-engine 3.0.1__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.1/src/deterministic_scenario_engine.egg-info → deterministic_scenario_engine-3.1.0}/PKG-INFO +21 -11
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/README.md +20 -10
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/api.md +34 -1
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/dsl-reference.md +2 -2
- 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.1 → deterministic_scenario_engine-3.1.0}/docs/quickstart.md +20 -5
- deterministic_scenario_engine-3.1.0/docs/release-notes-3.1.0.md +51 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0/src/deterministic_scenario_engine.egg-info}/PKG-INFO +21 -11
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/SOURCES.txt +7 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/_version.py +1 -1
- 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.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_1_0e_packaging_release_candidate.py +19 -17
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_10_workflow_demonstrators.py +2 -2
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_12_public_contract_docs_freeze.py +1 -1
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_13_packaging_fresh_install_rc.py +1 -1
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_1_v1_read_contract.py +1 -1
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_2_composition.py +1 -1
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_3_matrix.py +1 -1
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_4_batch.py +1 -1
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_5_inspect_explain.py +1 -1
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_7_cli_product_surface.py +1 -1
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_11_public_contract_docs_freeze.py +1 -1
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_1_evidence_bundle_contract.py +1 -1
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_12a_r2_quickstart_installed_consumer.py +1 -1
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_12b_1_version_promotion.py +1 -1
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/LICENSE +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/MANIFEST.in +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/compatibility.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/determinism.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/dsl2-reference.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/hypothesis.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/phase2-architecture.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/phase2-public-contract.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/phase3-architecture.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/phase3-public-contract.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/phase4-architecture.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/phase5-architecture.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/plugins.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/product-evidence-gate.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/release-notes-2.2.0.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/release-notes-3.0.0.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/release-notes-3.0.1.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/release-process.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/reproducibility.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/schemathesis.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/security-and-non-goals.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/sqlalchemy.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/testing-oracle.md +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/api_scenario.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/cart.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/control_flow.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/ecommerce.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/openapi.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/oracle_fault.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_1b_cart.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_3_resources.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_4_control_flow.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_5_oracle_fault.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_6_sqlalchemy_rows.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_7_ecommerce_plugin.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_8_api_scenario.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_8_openapi.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase3_ecommerce_evidence.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/resources.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/sqlalchemy_rows.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/pyproject.toml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/setup.cfg +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/setup.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/dependency_links.txt +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/entry_points.txt +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/requires.txt +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/top_level.txt +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/adapters/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/adapters/json_file.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/adapters/sqlalchemy.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/address.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/artifacts.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/errors.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/models.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/runtime.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/cli/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/cli/__main__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/cli/main.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/clock.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/compatibility.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/compatibility_fixtures.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/errors.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/models.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/parser.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/resolver.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/runtime.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/context.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/control_flow.py +0 -0
- {deterministic_scenario_engine-3.0.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/compatibility-fixtures.json +0 -0
- {deterministic_scenario_engine-3.0.1 → 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.1 → 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.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/scenarios/compatibility_case.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/scenarios/mismatch_case.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/artifacts/manifest-v2.json +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/artifacts/result-v2.json +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/artifacts/schedule-v1.json +0 -0
- {deterministic_scenario_engine-3.0.1 → 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.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/compatibility-fixtures.json +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/references/legacy-result1.json +0 -0
- {deterministic_scenario_engine-3.0.1 → 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.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/duplicate-key.json +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/incomplete-coordinates.json +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/invalid-type.json +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/missing-field.json +0 -0
- {deterministic_scenario_engine-3.0.1 → 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.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/noncanonical-address.json +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/unknown-contract.json +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/unknown-engine.json +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/rejections/unknown-field.json +0 -0
- {deterministic_scenario_engine-3.0.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/scenarios/scenario-v2.yaml +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/definition_diff.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diagnostics.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/compare.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/errors.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/models.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/render.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/serialization.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/errors.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/models.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/registry.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/actor_runtime.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/compiler.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/errors.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/models.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/parser.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/runtime.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/engine2.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/errors.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/adapter.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/compatibility.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/errors.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/export.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/fixture.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/migration.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/models.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/read.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/expressions.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/faults.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/history.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/ids.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/impact.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/errors.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/explain.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/inspect.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/models.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/redaction.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/serialization.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/integrations/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/integrations/hypothesis.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/integrations/schemathesis.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/invariants.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/manifest.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/canonical.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/errors.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/expand.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/filtering.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/models.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/runtime.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/errors.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/evaluate.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/models.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/serialization.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/plugins.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/provenance.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/pytest_plugin.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/reference_packs/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/reference_packs/ecommerce.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/reference_packs/ecommerce_evidence.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/resources.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/result.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/rng.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/runner.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/scaffolding.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/schedule.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/scheduler.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/state.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/__init__.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/errors.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/models.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/publication.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/read.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/serialization.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/trace_view.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/validation.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/values.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_1a_semantic_kernel.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_1b_linear_dsl.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_1c_integrated_phase0_1.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_1c_r1_missing_sentinel_repair.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_2a_reproducible_results.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_2b_json_pytest_integration.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_3_resources_constraints.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_4_control_flow.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_5_oracle_faults.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_6_sqlalchemy_materializer.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_7_plugins_ecommerce.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_8_hypothesis_schemathesis.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_1_0b_public_api_error_contract.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_1_0c_dsl_compatibility_contract.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_1_0d_documentation_examples.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_11_performance_scale_hardening.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_1_models_serialization.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_6_structured_semantic_diff.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_8_domain_pack_foundation.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_9_oracle_assertions.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_10_performance_security_hardening.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_12_packaging_fresh_install_rc.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_2_safe_bundle_reader_validator.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_3_ordered_export.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_4_evidence_adapter_contract.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_5_compatibility_migration_planner.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_6_lossless_migrations_fixture_export.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_7_cli_interchange_surface.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_8_ecommerce_evidence_workflow.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_10_canonical_workflow_help.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_11_cross_version_fixtures.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_12_hardening.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_12r2_public_fixture_packaging.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_12r3_consumer_secret_redaction.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_1_cli_replay_workflow.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_2_replay_compatibility_diagnostics.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_3_filesystem_trust_boundary.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_4_actionable_human_diagnostics.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_5_machine_readable_error_envelope.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_6_author_time_scaffolding.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_7_scenario_definition_structural_diff.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_8_conservative_impact_analysis.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_9_static_trace_viewer.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_10_public_api_cli_compatibility_fixtures.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_11_performance_security_contract_freeze.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_1_dsl2_actor_lane_foundation.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_2_scheduler_kernel.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_3_actor_execution_shared_state.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_4_schedule_identity_replay.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_5_result2_engine2_compatibility.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_6_public_cli_python_execution.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_7_actor_aware_analysis.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_9_actor_aware_static_trace_viewer.py +0 -0
- {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_readme_pypi_portability.py +0 -0
- {deterministic_scenario_engine-3.0.1 → 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.0
|
|
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
|
|
@@ -63,6 +63,8 @@ make expected behavior explicit.
|
|
|
63
63
|
- DSL 1 parsing, compilation, and deterministic execution
|
|
64
64
|
- DSL 2 logical-actor execution with an explicit independent schedule seed
|
|
65
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
|
|
66
68
|
- actor-aware inspect/explain and deterministic offline trace viewing
|
|
67
69
|
- addressed randomness and logical IDs that do not depend on a shared stream
|
|
68
70
|
- current state plus append-only committed history and artifacts
|
|
@@ -115,10 +117,11 @@ and observe the module location it actually imports:
|
|
|
115
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())'
|
|
116
118
|
```
|
|
117
119
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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.
|
|
122
125
|
|
|
123
126
|
Install only the named optional integrations you need:
|
|
124
127
|
|
|
@@ -181,15 +184,22 @@ self-contained offline HTML file from supported result/evidence.
|
|
|
181
184
|
- [2.2.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-2.2.0.md)
|
|
182
185
|
- [3.0.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md)
|
|
183
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)
|
|
184
190
|
- [Phase 2 public contract, CLI, and hard bounds](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md)
|
|
185
191
|
- [Phase 3 public contract and evidence interchange](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md)
|
|
186
192
|
|
|
187
193
|
## Status
|
|
188
194
|
|
|
189
195
|
Distribution release identity and deterministic engine compatibility are
|
|
190
|
-
separate contracts. This source tree reports
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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.
|
|
@@ -26,6 +26,8 @@ make expected behavior explicit.
|
|
|
26
26
|
- DSL 1 parsing, compilation, and deterministic execution
|
|
27
27
|
- DSL 2 logical-actor execution with an explicit independent schedule seed
|
|
28
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
|
|
29
31
|
- actor-aware inspect/explain and deterministic offline trace viewing
|
|
30
32
|
- addressed randomness and logical IDs that do not depend on a shared stream
|
|
31
33
|
- current state plus append-only committed history and artifacts
|
|
@@ -78,10 +80,11 @@ and observe the module location it actually imports:
|
|
|
78
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())'
|
|
79
81
|
```
|
|
80
82
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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.
|
|
85
88
|
|
|
86
89
|
Install only the named optional integrations you need:
|
|
87
90
|
|
|
@@ -144,15 +147,22 @@ self-contained offline HTML file from supported result/evidence.
|
|
|
144
147
|
- [2.2.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-2.2.0.md)
|
|
145
148
|
- [3.0.0 release notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md)
|
|
146
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)
|
|
147
153
|
- [Phase 2 public contract, CLI, and hard bounds](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md)
|
|
148
154
|
- [Phase 3 public contract and evidence interchange](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md)
|
|
149
155
|
|
|
150
156
|
## Status
|
|
151
157
|
|
|
152
158
|
Distribution release identity and deterministic engine compatibility are
|
|
153
|
-
separate contracts. This source tree reports
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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,7 +9,7 @@ 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
|
|
|
@@ -86,6 +86,39 @@ observations, and returns the verified immutable Result/2. It never reconstructs
|
|
|
86
86
|
missing schedule evidence. Compatibility classification is explicit and does not
|
|
87
87
|
execute, migrate, or promote evidence. Existing Engine 1 functions are unchanged.
|
|
88
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
|
+
|
|
89
122
|
`schedule_seed` is a required independent unsigned 64-bit coordinate. It is not
|
|
90
123
|
derived from `root_seed`. Engine 2 writes Result/2, Manifest/2, and Schedule/1;
|
|
91
124
|
exact replay requires the matching result, schedule, scenario, and explicit
|
{deterministic_scenario_engine-3.0.1 → 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
|
|
@@ -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.
|
{deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/quickstart.md
RENAMED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# Canonical installed-package workflows
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The source distribution version is 3.1.0. PyPI and GitHub Releases are
|
|
4
|
+
authoritative for actual publication and release history. These commands apply
|
|
5
|
+
when distribution 3.1.0 is installed; the generic package install command below
|
|
6
|
+
resolves only the version actually available from the package index.
|
|
4
7
|
|
|
5
8
|
This is the canonical DSE user workflow document. Every ordinary command below
|
|
6
9
|
uses the installed package and portable files created here; no source checkout,
|
|
@@ -37,10 +40,11 @@ sed 's/{$literal: 1}/{$literal: 2}/' "$DSE_DEMO/scenario.yaml" > "$DSE_DEMO/scen
|
|
|
37
40
|
scenario --help
|
|
38
41
|
```
|
|
39
42
|
|
|
40
|
-
The identity check uses the same active Python interpreter as installation.
|
|
41
|
-
should report DSE distribution `3.0
|
|
42
|
-
Python actually imports. This distribution
|
|
43
|
-
(`1.0.0`) and Engine 2 (`2.0.0`) compatibility
|
|
43
|
+
The identity check uses the same active Python interpreter as installation. An
|
|
44
|
+
installation of distribution 3.1.0 should report DSE distribution `3.1.0`; the
|
|
45
|
+
resolved module path shows the code Python actually imports. This distribution
|
|
46
|
+
version is distinct from Engine 1 (`1.0.0`) and Engine 2 (`2.0.0`) compatibility
|
|
47
|
+
versions.
|
|
44
48
|
|
|
45
49
|
Installing a checkout with `python3 -m pip install .` is
|
|
46
50
|
**source-development-only**. Installed-package workflows are primary.
|
|
@@ -118,6 +122,17 @@ canonical Result/2 bytes, while JSON written to terminal stdout has one trailing
|
|
|
118
122
|
presentation newline; raw byte comparison between those two forms is therefore
|
|
119
123
|
not claimed.
|
|
120
124
|
|
|
125
|
+
For multiple Engine 2 cases, use the module-qualified
|
|
126
|
+
`scenario_engine.engine2_suite` API documented in [Engine 2 serial suites](engine2-suite.md).
|
|
127
|
+
It executes finite plans serially in declared order and can strictly verify the
|
|
128
|
+
canonical aggregate plus supplied native Result/2, Manifest/2, and Schedule/1
|
|
129
|
+
children offline. Verification is not replay; exact replay still requires each
|
|
130
|
+
case's exact scenario, effective inputs, schedule, and trusted plugins. The
|
|
131
|
+
separate module-qualified `scenario_engine.engine2_explore` API performs only
|
|
132
|
+
finite explicit schedule-seed sweeps. It is not exhaustive exploration,
|
|
133
|
+
parallelism, or distributed execution. Neither API produces or reinterprets the
|
|
134
|
+
historical Suite Run/2 contract.
|
|
135
|
+
|
|
121
136
|
Both outputs are constructed before publication. Each destination is published
|
|
122
137
|
atomically as an absent file; if this command publishes one output and then the
|
|
123
138
|
other publication fails, it removes the output created by this command. This is
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Deterministic Scenario Engine 3.1.0
|
|
2
|
+
|
|
3
|
+
The source distribution version is 3.1.0. PyPI and GitHub Releases are
|
|
4
|
+
authoritative for actual publication and release history. These notes describe
|
|
5
|
+
the distribution contents; they do not authorize tagging or publication.
|
|
6
|
+
|
|
7
|
+
## Additive features
|
|
8
|
+
|
|
9
|
+
- Ordered serial Engine 2 suite execution through the module-qualified
|
|
10
|
+
`scenario_engine.engine2_suite` API and accepted
|
|
11
|
+
`scenario.engine2-case/1`, `scenario.engine2-suite-plan/1`, and
|
|
12
|
+
`scenario.engine2-suite/1` contracts.
|
|
13
|
+
- Strict canonical suite reading and offline aggregate verification, including
|
|
14
|
+
exact native Result/2, Manifest/2, and Schedule/1 child-byte integrity and
|
|
15
|
+
cross-artifact coordinate linkage.
|
|
16
|
+
- Finite explicit schedule-seed sweeps through the module-qualified
|
|
17
|
+
`scenario_engine.engine2_explore` API, preserving supplied seed order and the
|
|
18
|
+
suite's authoritative native evidence.
|
|
19
|
+
|
|
20
|
+
## Compatibility guarantees
|
|
21
|
+
|
|
22
|
+
- The distribution coordinate advances from 3.0.1 to 3.1.0 only.
|
|
23
|
+
- Engine 1 remains 1.0.0 with DSL 1, Result/1, Manifest/1, and Suite Run/1.
|
|
24
|
+
- Engine 2 remains 2.0.0 with DSL 2, Result/2, Manifest/2, and Schedule/1.
|
|
25
|
+
- Existing canonical bytes, compatibility fixtures, API export manifests,
|
|
26
|
+
historical release identities, and accepted golden vectors remain unchanged.
|
|
27
|
+
- The new suite aggregate is distinct from and does not produce, promote, or
|
|
28
|
+
reinterpret historical Suite Run/2.
|
|
29
|
+
|
|
30
|
+
## Python support
|
|
31
|
+
|
|
32
|
+
Python 3.11, 3.12, 3.13, and 3.14 remain supported. Declared dependency and
|
|
33
|
+
optional-extra constraints are unchanged.
|
|
34
|
+
|
|
35
|
+
## Evidence integrity and security limitations
|
|
36
|
+
|
|
37
|
+
Offline suite verification proves canonical aggregate integrity, exact supplied
|
|
38
|
+
child bytes and native identities, and coordinate linkage. It does not prove that
|
|
39
|
+
execution occurred and is not exact replay. Exact replay separately requires the
|
|
40
|
+
exact scenario, effective inputs, recorded schedule, and trusted plugin registry.
|
|
41
|
+
Plugin callables are trusted, unsandboxed Python and are not a security boundary.
|
|
42
|
+
Canonical error records are bounded claims and do not independently prove the
|
|
43
|
+
originating exception. No network or remote evidence resolver is introduced.
|
|
44
|
+
|
|
45
|
+
## Explicit non-goals
|
|
46
|
+
|
|
47
|
+
This distribution does not provide exhaustive state-space exploration,
|
|
48
|
+
systematic scheduler branching, race-detection completeness, shrinking or
|
|
49
|
+
minimization, parallel or distributed execution, remote URI inputs, hidden plugin
|
|
50
|
+
discovery, implicit schedule-seed derivation, cross-major promotion, or automatic
|
|
51
|
+
migration. It does not change package-root exports or authorize publication.
|