deterministic-scenario-engine 2.1.2__tar.gz → 3.0.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-2.1.2 → deterministic_scenario_engine-3.0.0}/MANIFEST.in +3 -0
- {deterministic_scenario_engine-2.1.2/src/deterministic_scenario_engine.egg-info → deterministic_scenario_engine-3.0.0}/PKG-INFO +55 -49
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/README.md +54 -48
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/api.md +42 -0
- deterministic_scenario_engine-3.0.0/docs/compatibility.md +198 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/dsl-reference.md +4 -0
- deterministic_scenario_engine-3.0.0/docs/dsl2-reference.md +40 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/phase3-public-contract.md +2 -2
- deterministic_scenario_engine-3.0.0/docs/phase4-architecture.md +815 -0
- deterministic_scenario_engine-3.0.0/docs/phase5-architecture.md +1149 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/product-evidence-gate.md +29 -9
- deterministic_scenario_engine-3.0.0/docs/quickstart.md +255 -0
- deterministic_scenario_engine-3.0.0/docs/release-notes-2.2.0.md +44 -0
- deterministic_scenario_engine-3.0.0/docs/release-notes-3.0.0.md +45 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/release-process.md +16 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/pyproject.toml +3 -0
- deterministic_scenario_engine-3.0.0/setup.py +44 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0/src/deterministic_scenario_engine.egg-info}/PKG-INFO +55 -49
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/deterministic_scenario_engine.egg-info/SOURCES.txt +80 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/__init__.py +2 -3
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/_version.py +3 -2
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/address.py +16 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/canonical.py +23 -3
- deterministic_scenario_engine-3.0.0/src/scenario_engine/cli/main.py +1507 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/compatibility.py +50 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/compatibility_fixtures.py +223 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase4_11/artifacts/current-2.1.2-suite-run-v1.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase4_11/artifacts/historical-1.0.0-result-v1.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase4_11/artifacts/historical-2.0.0-suite-run-v1.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-incomplete-suite-run-v1.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-scenario-mismatch-suite-run-v1.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-unknown-engine-suite-run-v1.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-unknown-manifest-suite-run-v9.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase4_11/artifacts/synthetic-unsupported-contract.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase4_11/compatibility-fixtures.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase4_11/inputs/current-2.1.2-suite-run-v1.inputs.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase4_11/inputs/historical-2.0.0-suite-run-v1.inputs.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase4_11/scenarios/compatibility_case.yaml +10 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase4_11/scenarios/mismatch_case.yaml +10 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/artifacts/manifest-v2.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/artifacts/result-v2.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/artifacts/schedule-v1.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/artifacts/suite-run-v2.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/compatibility-fixtures.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/references/legacy-result1.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/corrupt-result-hash.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/duplicate-key.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/incomplete-coordinates.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/invalid-type.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/missing-field.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/mixed-contract-tuple.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/noncanonical-address.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/unknown-contract.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/unknown-engine.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/unknown-field.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-input-hashes.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-root-seed.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-scenario-hash.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-schedule-hash.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-schedule-seed.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/rejections/wrong-scheduler-contract.json +1 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/data/compatibility/phase5_10/scenarios/scenario-v2.yaml +15 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/definition_diff.py +263 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/diagnostics.py +134 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/dsl/__init__.py +6 -5
- deterministic_scenario_engine-3.0.0/src/scenario_engine/dsl/actor_runtime.py +433 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/dsl/compiler.py +30 -3
- deterministic_scenario_engine-3.0.0/src/scenario_engine/dsl/errors.py +67 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/dsl/models.py +39 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/dsl/parser.py +181 -15
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/dsl/runtime.py +42 -7
- deterministic_scenario_engine-3.0.0/src/scenario_engine/engine2.py +618 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/evidence/compatibility.py +2 -2
- deterministic_scenario_engine-3.0.0/src/scenario_engine/impact.py +408 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/inspection/__init__.py +3 -1
- deterministic_scenario_engine-3.0.0/src/scenario_engine/inspection/explain.py +142 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/inspection/inspect.py +97 -3
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/inspection/models.py +4 -2
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/inspection/redaction.py +3 -2
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/manifest.py +53 -2
- deterministic_scenario_engine-3.0.0/src/scenario_engine/scaffolding.py +224 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/schedule.py +415 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/scheduler.py +175 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/suite/__init__.py +2 -1
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/suite/errors.py +8 -2
- deterministic_scenario_engine-3.0.0/src/scenario_engine/suite/publication.py +33 -0
- deterministic_scenario_engine-3.0.0/src/scenario_engine/trace_view.py +356 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_0_2a_reproducible_results.py +3 -2
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_1_0d_documentation_examples.py +2 -2
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_1_0e_packaging_release_candidate.py +2 -2
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_2_10_workflow_demonstrators.py +2 -2
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_2_12_public_contract_docs_freeze.py +3 -2
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_2_13_packaging_fresh_install_rc.py +7 -5
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_2_1_v1_read_contract.py +1 -1
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_2_2_composition.py +1 -1
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_2_3_matrix.py +1 -1
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_2_4_batch.py +1 -1
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_2_5_inspect_explain.py +1 -1
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_2_7_cli_product_surface.py +7 -3
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_3_11_public_contract_docs_freeze.py +7 -3
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_3_1_evidence_bundle_contract.py +2 -2
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_3_7_cli_interchange_surface.py +4 -1
- deterministic_scenario_engine-3.0.0/tests/test_phase_4_10_canonical_workflow_help.py +76 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_4_11_cross_version_fixtures.py +207 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_4_12_hardening.py +134 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_4_12r2_public_fixture_packaging.py +94 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_4_12r3_consumer_secret_redaction.py +181 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_4_1_cli_replay_workflow.py +150 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_4_2_replay_compatibility_diagnostics.py +142 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_4_3_filesystem_trust_boundary.py +107 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_4_4_actionable_human_diagnostics.py +98 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_4_5_machine_readable_error_envelope.py +99 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_4_6_author_time_scaffolding.py +110 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_4_7_scenario_definition_structural_diff.py +151 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_4_8_conservative_impact_analysis.py +110 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_4_9_static_trace_viewer.py +162 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_5_10_public_api_cli_compatibility_fixtures.py +139 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_5_11_performance_security_contract_freeze.py +148 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_5_12a_r2_quickstart_installed_consumer.py +170 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_5_12b_1_version_promotion.py +107 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_5_1_dsl2_actor_lane_foundation.py +133 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_5_2_scheduler_kernel.py +151 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_5_3_actor_execution_shared_state.py +170 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_5_4_schedule_identity_replay.py +217 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_5_5_result2_engine2_compatibility.py +217 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_5_6_public_cli_python_execution.py +122 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_5_7_actor_aware_analysis.py +215 -0
- deterministic_scenario_engine-3.0.0/tests/test_phase_5_9_actor_aware_static_trace_viewer.py +156 -0
- deterministic_scenario_engine-2.1.2/docs/compatibility.md +0 -91
- deterministic_scenario_engine-2.1.2/docs/quickstart.md +0 -133
- deterministic_scenario_engine-2.1.2/src/scenario_engine/cli/main.py +0 -593
- deterministic_scenario_engine-2.1.2/src/scenario_engine/dsl/errors.py +0 -23
- deterministic_scenario_engine-2.1.2/src/scenario_engine/inspection/explain.py +0 -75
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/LICENSE +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/determinism.md +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/hypothesis.md +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/phase2-architecture.md +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/phase2-public-contract.md +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/phase3-architecture.md +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/plugins.md +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/reproducibility.md +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/schemathesis.md +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/security-and-non-goals.md +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/sqlalchemy.md +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/testing-oracle.md +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/api_scenario.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/cart.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/control_flow.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/ecommerce.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/openapi.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/oracle_fault.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/phase0_1b_cart.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/phase0_3_resources.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/phase0_4_control_flow.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/phase0_5_oracle_fault.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/phase0_6_sqlalchemy_rows.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/phase0_7_ecommerce_plugin.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/phase0_8_api_scenario.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/phase0_8_openapi.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/phase3_ecommerce_evidence.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/resources.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/examples/sqlalchemy_rows.yaml +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/setup.cfg +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/deterministic_scenario_engine.egg-info/dependency_links.txt +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/deterministic_scenario_engine.egg-info/entry_points.txt +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/deterministic_scenario_engine.egg-info/requires.txt +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/deterministic_scenario_engine.egg-info/top_level.txt +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/adapters/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/adapters/json_file.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/adapters/sqlalchemy.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/artifacts.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/batch/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/batch/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/batch/errors.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/batch/models.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/batch/runtime.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/cli/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/cli/__main__.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/clock.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/composition/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/composition/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/composition/errors.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/composition/models.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/composition/parser.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/composition/resolver.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/composition/runtime.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/context.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/control_flow.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/diff/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/diff/compare.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/diff/errors.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/diff/models.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/diff/render.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/diff/serialization.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/domain_packs/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/domain_packs/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/domain_packs/errors.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/domain_packs/models.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/domain_packs/registry.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/errors.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/evidence/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/evidence/adapter.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/evidence/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/evidence/errors.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/evidence/export.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/evidence/fixture.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/evidence/migration.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/evidence/models.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/evidence/read.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/expressions.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/faults.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/history.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/ids.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/inspection/errors.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/inspection/serialization.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/integrations/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/integrations/hypothesis.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/integrations/schemathesis.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/invariants.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/matrix/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/matrix/canonical.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/matrix/errors.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/matrix/expand.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/matrix/filtering.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/matrix/models.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/matrix/runtime.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/oracle.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/oracle_assertions/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/oracle_assertions/errors.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/oracle_assertions/evaluate.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/oracle_assertions/models.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/oracle_assertions/serialization.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/plugins.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/provenance.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/pytest_plugin.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/reference_packs/__init__.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/reference_packs/ecommerce.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/reference_packs/ecommerce_evidence.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/resources.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/result.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/rng.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/runner.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/state.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/suite/models.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/suite/read.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/suite/serialization.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/validation.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/src/scenario_engine/values.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_0_1a_semantic_kernel.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_0_1b_linear_dsl.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_0_1c_integrated_phase0_1.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_0_1c_r1_missing_sentinel_repair.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_0_2b_json_pytest_integration.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_0_3_resources_constraints.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_0_4_control_flow.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_0_5_oracle_faults.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_0_6_sqlalchemy_materializer.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_0_7_plugins_ecommerce.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_0_8_hypothesis_schemathesis.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_1_0b_public_api_error_contract.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_1_0c_dsl_compatibility_contract.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_2_11_performance_scale_hardening.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_2_1_models_serialization.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_2_6_structured_semantic_diff.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_2_8_domain_pack_foundation.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_2_9_oracle_assertions.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_3_10_performance_security_hardening.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_3_12_packaging_fresh_install_rc.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_3_2_safe_bundle_reader_validator.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_3_3_ordered_export.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_3_4_evidence_adapter_contract.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_3_5_compatibility_migration_planner.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_3_6_lossless_migrations_fixture_export.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_phase_3_8_ecommerce_evidence_workflow.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_readme_pypi_portability.py +0 -0
- {deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/tests/test_test_portability.py +0 -0
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
include LICENSE
|
|
2
2
|
include README.md
|
|
3
|
+
include setup.py
|
|
3
4
|
include pyproject.toml
|
|
4
5
|
recursive-include src *.py
|
|
6
|
+
recursive-include src/scenario_engine/data/compatibility/phase4_11 *
|
|
7
|
+
recursive-include src/scenario_engine/data/compatibility/phase5_10 *
|
|
5
8
|
recursive-include docs *.md
|
|
6
9
|
recursive-include examples *.yaml
|
|
7
10
|
include examples/phase3_ecommerce_evidence.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deterministic-scenario-engine
|
|
3
|
-
Version:
|
|
3
|
+
Version: 3.0.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,10 +41,11 @@ 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.
|
|
45
|
-
|
|
46
|
-
`ENGINE_VERSION`
|
|
47
|
-
|
|
44
|
+
testing. This source tree is the prepublication distribution 3.0.0 candidate.
|
|
45
|
+
Distribution and execution compatibility identities are separate: public
|
|
46
|
+
`ENGINE_VERSION` is 2.0.0, while the preserved DSL 1 path records Engine 1.0.0.
|
|
47
|
+
This statement does not assert package-index publication; PyPI and GitHub
|
|
48
|
+
Releases remain authoritative for public-release availability and history.
|
|
48
49
|
|
|
49
50
|
## Why it exists
|
|
50
51
|
|
|
@@ -58,6 +59,9 @@ make expected behavior explicit.
|
|
|
58
59
|
## Core capabilities
|
|
59
60
|
|
|
60
61
|
- DSL 1 parsing, compilation, and deterministic execution
|
|
62
|
+
- DSL 2 logical-actor execution with an explicit independent schedule seed
|
|
63
|
+
- canonical Result/2, Manifest/2, and Schedule/1 evidence with exact replay
|
|
64
|
+
- actor-aware inspect/explain and deterministic offline trace viewing
|
|
61
65
|
- addressed randomness and logical IDs that do not depend on a shared stream
|
|
62
66
|
- current state plus append-only committed history and artifacts
|
|
63
67
|
- whole-step atomicity
|
|
@@ -72,12 +76,18 @@ make expected behavior explicit.
|
|
|
72
76
|
- ordered Cartesian matrices with stable case IDs and original indexes
|
|
73
77
|
- immutable ordered batch plans and worker-independent results
|
|
74
78
|
- structured, redacted inspect/explain evidence and typed RFC 6901 semantic diff
|
|
75
|
-
-
|
|
79
|
+
- validated scenario-definition structural diff with canonical semantic addresses
|
|
80
|
+
- self-contained, deterministic offline HTML trace views of local result evidence
|
|
81
|
+
- `scenario` CLI for local and CI workflows, including bounded
|
|
76
82
|
local evidence export, verification, and lossless migration
|
|
77
83
|
- explicit immutable Domain Pack registries and pure Oracle Assertions
|
|
78
84
|
- canonical evidence bundles, ordered JSON/JSONL export, compatibility reports,
|
|
79
85
|
explicit adapters, closed lossless migrations, and fixture-directory export
|
|
80
86
|
|
|
87
|
+
The 3.0.0 candidate adds Engine 2.0.0 and DSL 2 while preserving Engine 1/DSL 1
|
|
88
|
+
behavior and immutable evidence. See the
|
|
89
|
+
[3.0.0 candidate notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md).
|
|
90
|
+
|
|
81
91
|
Core execution does not require a database, network service, plugin, or property
|
|
82
92
|
testing framework. See [security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md).
|
|
83
93
|
Neither Phase 2 nor Phase 3 adds hidden discovery, network, randomness,
|
|
@@ -87,57 +97,35 @@ additive evidence surface is frozen in the [Phase 3 public contract](https://git
|
|
|
87
97
|
|
|
88
98
|
## Installation
|
|
89
99
|
|
|
90
|
-
|
|
100
|
+
Supported Python versions are 3.11, 3.12, 3.13, and 3.14.
|
|
101
|
+
|
|
102
|
+
Install the published package and use its `scenario` entry point:
|
|
91
103
|
|
|
92
104
|
```console
|
|
93
|
-
python3 -m
|
|
94
|
-
|
|
105
|
+
python3 -m pip install deterministic-scenario-engine
|
|
106
|
+
scenario --help
|
|
95
107
|
```
|
|
96
108
|
|
|
97
109
|
Install only the named optional integrations you need:
|
|
98
110
|
|
|
99
111
|
```console
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
112
|
+
python3 -m pip install 'deterministic-scenario-engine[pytest]'
|
|
113
|
+
python3 -m pip install 'deterministic-scenario-engine[sqlalchemy]'
|
|
114
|
+
python3 -m pip install 'deterministic-scenario-engine[hypothesis]'
|
|
115
|
+
python3 -m pip install 'deterministic-scenario-engine[schemathesis]'
|
|
104
116
|
```
|
|
105
117
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
`pip install 'deterministic-scenario-engine[pytest]'`.
|
|
118
|
+
Installing the current checkout with `python3 -m pip install .` is a
|
|
119
|
+
source-development-only alternative.
|
|
109
120
|
|
|
110
121
|
## Minimal quickstart
|
|
111
122
|
|
|
112
|
-
The
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
from scenario_engine import (
|
|
119
|
-
compile_document,
|
|
120
|
-
parse_yaml,
|
|
121
|
-
replay_scenario,
|
|
122
|
-
run_scenario,
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
yaml_text = Path("examples/cart.yaml").read_text(encoding="utf-8")
|
|
126
|
-
document = parse_yaml(yaml_text)
|
|
127
|
-
scenario = compile_document(document)
|
|
128
|
-
result = run_scenario(scenario, root_seed="quickstart", run_index=0)
|
|
129
|
-
|
|
130
|
-
print(result.final_state["checkout_complete"])
|
|
131
|
-
print(result.trace())
|
|
132
|
-
stable_bytes = result.to_json_bytes()
|
|
133
|
-
manifest = result.manifest
|
|
134
|
-
|
|
135
|
-
replayed = replay_scenario(yaml_text, manifest)
|
|
136
|
-
assert replayed.to_json_bytes() == stable_bytes
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
`ScenarioResult.final_state` is the supported state-reading property; the stable
|
|
140
|
-
normalized result contains the same data under its `state` field.
|
|
123
|
+
The [canonical installed-package workflows](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/quickstart.md)
|
|
124
|
+
start by creating a complete portable DSL file under `/tmp/dse-demo`; they do
|
|
125
|
+
not require a source checkout or files from this repository. The guide covers
|
|
126
|
+
validate, run → replay, inspect/explain, both diff commands, conservative impact
|
|
127
|
+
analysis, export → verify, the static trace viewer, scaffold → validate, and the
|
|
128
|
+
human/machine diagnostic contract.
|
|
141
129
|
|
|
142
130
|
## Determinism contract
|
|
143
131
|
|
|
@@ -148,10 +136,24 @@ Unsupported cross-version replay fails explicitly. See the [determinism model](h
|
|
|
148
136
|
[reproducibility guide](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/reproducibility.md), and normative
|
|
149
137
|
[compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md).
|
|
150
138
|
|
|
139
|
+
The installed public compatibility corpus can be discovered with
|
|
140
|
+
`scenario --help` and exported without a source checkout using
|
|
141
|
+
`scenario compatibility-fixtures export --out /absolute/path`.
|
|
142
|
+
|
|
143
|
+
## Canonical command workflows
|
|
144
|
+
|
|
145
|
+
Use the [quickstart](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/quickstart.md#canonical-installed-package-workflows)
|
|
146
|
+
as the single canonical workflow document. In particular, `scenario diff`
|
|
147
|
+
compares execution artifacts, while `scenario diff-definition` structurally
|
|
148
|
+
compares validated scenario definitions. `scenario impact` is a separate,
|
|
149
|
+
conservative static may-impact analysis. `scenario trace-view` creates one
|
|
150
|
+
self-contained offline HTML file from supported result/evidence.
|
|
151
|
+
|
|
151
152
|
## Documentation
|
|
152
153
|
|
|
153
154
|
- [Quickstart](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/quickstart.md)
|
|
154
155
|
- [DSL 1 reference](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/dsl-reference.md)
|
|
156
|
+
- [DSL 2 reference](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/dsl2-reference.md)
|
|
155
157
|
- [Determinism model](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/determinism.md)
|
|
156
158
|
- [Reproducibility and replay](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/reproducibility.md)
|
|
157
159
|
- [Testing, faults, and oracle](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/testing-oracle.md)
|
|
@@ -162,13 +164,17 @@ Unsupported cross-version replay fails explicitly. See the [determinism model](h
|
|
|
162
164
|
- [Public Python API](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/api.md)
|
|
163
165
|
- [Security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md)
|
|
164
166
|
- [Compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md)
|
|
167
|
+
- [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 candidate notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md)
|
|
165
169
|
- [Phase 2 public contract, CLI, and hard bounds](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md)
|
|
166
170
|
- [Phase 3 public contract and evidence interchange](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md)
|
|
167
171
|
|
|
168
172
|
## Status
|
|
169
173
|
|
|
170
174
|
Distribution release identity and deterministic engine compatibility are
|
|
171
|
-
separate contracts. This source tree reports distribution
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
+
separate contracts. This prepublication source tree reports distribution
|
|
176
|
+
version 3.0.0 and public Engine 2.0.0. Engine 1 manifests remain exactly 1.0.0
|
|
177
|
+
with integer DSL 1; Engine 2 manifests use 2.0.0 with integer DSL 2. Supported
|
|
178
|
+
Python versions are 3.11–3.14. Suite Run/2 is reader/schema support only; Engine
|
|
179
|
+
2 suite orchestration, cross-major promotion, remote URI input, and implicit
|
|
180
|
+
schedule-seed derivation are unsupported. The project is Apache-2.0 licensed.
|
|
@@ -4,10 +4,11 @@
|
|
|
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.
|
|
8
|
-
|
|
9
|
-
`ENGINE_VERSION`
|
|
10
|
-
|
|
7
|
+
testing. This source tree is the prepublication distribution 3.0.0 candidate.
|
|
8
|
+
Distribution and execution compatibility identities are separate: public
|
|
9
|
+
`ENGINE_VERSION` is 2.0.0, while the preserved DSL 1 path records Engine 1.0.0.
|
|
10
|
+
This statement does not assert package-index publication; PyPI and GitHub
|
|
11
|
+
Releases remain authoritative for public-release availability and history.
|
|
11
12
|
|
|
12
13
|
## Why it exists
|
|
13
14
|
|
|
@@ -21,6 +22,9 @@ make expected behavior explicit.
|
|
|
21
22
|
## Core capabilities
|
|
22
23
|
|
|
23
24
|
- DSL 1 parsing, compilation, and deterministic execution
|
|
25
|
+
- DSL 2 logical-actor execution with an explicit independent schedule seed
|
|
26
|
+
- canonical Result/2, Manifest/2, and Schedule/1 evidence with exact replay
|
|
27
|
+
- actor-aware inspect/explain and deterministic offline trace viewing
|
|
24
28
|
- addressed randomness and logical IDs that do not depend on a shared stream
|
|
25
29
|
- current state plus append-only committed history and artifacts
|
|
26
30
|
- whole-step atomicity
|
|
@@ -35,12 +39,18 @@ make expected behavior explicit.
|
|
|
35
39
|
- ordered Cartesian matrices with stable case IDs and original indexes
|
|
36
40
|
- immutable ordered batch plans and worker-independent results
|
|
37
41
|
- structured, redacted inspect/explain evidence and typed RFC 6901 semantic diff
|
|
38
|
-
-
|
|
42
|
+
- validated scenario-definition structural diff with canonical semantic addresses
|
|
43
|
+
- self-contained, deterministic offline HTML trace views of local result evidence
|
|
44
|
+
- `scenario` CLI for local and CI workflows, including bounded
|
|
39
45
|
local evidence export, verification, and lossless migration
|
|
40
46
|
- explicit immutable Domain Pack registries and pure Oracle Assertions
|
|
41
47
|
- canonical evidence bundles, ordered JSON/JSONL export, compatibility reports,
|
|
42
48
|
explicit adapters, closed lossless migrations, and fixture-directory export
|
|
43
49
|
|
|
50
|
+
The 3.0.0 candidate adds Engine 2.0.0 and DSL 2 while preserving Engine 1/DSL 1
|
|
51
|
+
behavior and immutable evidence. See the
|
|
52
|
+
[3.0.0 candidate notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md).
|
|
53
|
+
|
|
44
54
|
Core execution does not require a database, network service, plugin, or property
|
|
45
55
|
testing framework. See [security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md).
|
|
46
56
|
Neither Phase 2 nor Phase 3 adds hidden discovery, network, randomness,
|
|
@@ -50,57 +60,35 @@ additive evidence surface is frozen in the [Phase 3 public contract](https://git
|
|
|
50
60
|
|
|
51
61
|
## Installation
|
|
52
62
|
|
|
53
|
-
|
|
63
|
+
Supported Python versions are 3.11, 3.12, 3.13, and 3.14.
|
|
64
|
+
|
|
65
|
+
Install the published package and use its `scenario` entry point:
|
|
54
66
|
|
|
55
67
|
```console
|
|
56
|
-
python3 -m
|
|
57
|
-
|
|
68
|
+
python3 -m pip install deterministic-scenario-engine
|
|
69
|
+
scenario --help
|
|
58
70
|
```
|
|
59
71
|
|
|
60
72
|
Install only the named optional integrations you need:
|
|
61
73
|
|
|
62
74
|
```console
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
75
|
+
python3 -m pip install 'deterministic-scenario-engine[pytest]'
|
|
76
|
+
python3 -m pip install 'deterministic-scenario-engine[sqlalchemy]'
|
|
77
|
+
python3 -m pip install 'deterministic-scenario-engine[hypothesis]'
|
|
78
|
+
python3 -m pip install 'deterministic-scenario-engine[schemathesis]'
|
|
67
79
|
```
|
|
68
80
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
`pip install 'deterministic-scenario-engine[pytest]'`.
|
|
81
|
+
Installing the current checkout with `python3 -m pip install .` is a
|
|
82
|
+
source-development-only alternative.
|
|
72
83
|
|
|
73
84
|
## Minimal quickstart
|
|
74
85
|
|
|
75
|
-
The
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
from scenario_engine import (
|
|
82
|
-
compile_document,
|
|
83
|
-
parse_yaml,
|
|
84
|
-
replay_scenario,
|
|
85
|
-
run_scenario,
|
|
86
|
-
)
|
|
87
|
-
|
|
88
|
-
yaml_text = Path("examples/cart.yaml").read_text(encoding="utf-8")
|
|
89
|
-
document = parse_yaml(yaml_text)
|
|
90
|
-
scenario = compile_document(document)
|
|
91
|
-
result = run_scenario(scenario, root_seed="quickstart", run_index=0)
|
|
92
|
-
|
|
93
|
-
print(result.final_state["checkout_complete"])
|
|
94
|
-
print(result.trace())
|
|
95
|
-
stable_bytes = result.to_json_bytes()
|
|
96
|
-
manifest = result.manifest
|
|
97
|
-
|
|
98
|
-
replayed = replay_scenario(yaml_text, manifest)
|
|
99
|
-
assert replayed.to_json_bytes() == stable_bytes
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
`ScenarioResult.final_state` is the supported state-reading property; the stable
|
|
103
|
-
normalized result contains the same data under its `state` field.
|
|
86
|
+
The [canonical installed-package workflows](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/quickstart.md)
|
|
87
|
+
start by creating a complete portable DSL file under `/tmp/dse-demo`; they do
|
|
88
|
+
not require a source checkout or files from this repository. The guide covers
|
|
89
|
+
validate, run → replay, inspect/explain, both diff commands, conservative impact
|
|
90
|
+
analysis, export → verify, the static trace viewer, scaffold → validate, and the
|
|
91
|
+
human/machine diagnostic contract.
|
|
104
92
|
|
|
105
93
|
## Determinism contract
|
|
106
94
|
|
|
@@ -111,10 +99,24 @@ Unsupported cross-version replay fails explicitly. See the [determinism model](h
|
|
|
111
99
|
[reproducibility guide](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/reproducibility.md), and normative
|
|
112
100
|
[compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md).
|
|
113
101
|
|
|
102
|
+
The installed public compatibility corpus can be discovered with
|
|
103
|
+
`scenario --help` and exported without a source checkout using
|
|
104
|
+
`scenario compatibility-fixtures export --out /absolute/path`.
|
|
105
|
+
|
|
106
|
+
## Canonical command workflows
|
|
107
|
+
|
|
108
|
+
Use the [quickstart](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/quickstart.md#canonical-installed-package-workflows)
|
|
109
|
+
as the single canonical workflow document. In particular, `scenario diff`
|
|
110
|
+
compares execution artifacts, while `scenario diff-definition` structurally
|
|
111
|
+
compares validated scenario definitions. `scenario impact` is a separate,
|
|
112
|
+
conservative static may-impact analysis. `scenario trace-view` creates one
|
|
113
|
+
self-contained offline HTML file from supported result/evidence.
|
|
114
|
+
|
|
114
115
|
## Documentation
|
|
115
116
|
|
|
116
117
|
- [Quickstart](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/quickstart.md)
|
|
117
118
|
- [DSL 1 reference](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/dsl-reference.md)
|
|
119
|
+
- [DSL 2 reference](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/dsl2-reference.md)
|
|
118
120
|
- [Determinism model](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/determinism.md)
|
|
119
121
|
- [Reproducibility and replay](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/reproducibility.md)
|
|
120
122
|
- [Testing, faults, and oracle](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/testing-oracle.md)
|
|
@@ -125,13 +127,17 @@ Unsupported cross-version replay fails explicitly. See the [determinism model](h
|
|
|
125
127
|
- [Public Python API](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/api.md)
|
|
126
128
|
- [Security assumptions and non-goals](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/security-and-non-goals.md)
|
|
127
129
|
- [Compatibility contract](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/compatibility.md)
|
|
130
|
+
- [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 candidate notes](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/release-notes-3.0.0.md)
|
|
128
132
|
- [Phase 2 public contract, CLI, and hard bounds](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase2-public-contract.md)
|
|
129
133
|
- [Phase 3 public contract and evidence interchange](https://github.com/imshahinul/deterministic-scenario-engine/blob/main/docs/phase3-public-contract.md)
|
|
130
134
|
|
|
131
135
|
## Status
|
|
132
136
|
|
|
133
137
|
Distribution release identity and deterministic engine compatibility are
|
|
134
|
-
separate contracts. This source tree reports distribution
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
+
separate contracts. This prepublication source tree reports distribution
|
|
139
|
+
version 3.0.0 and public Engine 2.0.0. Engine 1 manifests remain exactly 1.0.0
|
|
140
|
+
with integer DSL 1; Engine 2 manifests use 2.0.0 with integer DSL 2. Supported
|
|
141
|
+
Python versions are 3.11–3.14. Suite Run/2 is reader/schema support only; Engine
|
|
142
|
+
2 suite orchestration, cross-major promotion, remote URI input, and implicit
|
|
143
|
+
schedule-seed derivation are unsupported. The project is Apache-2.0 licensed.
|
|
@@ -8,6 +8,11 @@ exports.
|
|
|
8
8
|
|
|
9
9
|
## Constants and value objects
|
|
10
10
|
|
|
11
|
+
- `scenario_engine.ENGINE_VERSION` — public current Engine coordinate, `2.0.0`.
|
|
12
|
+
- `scenario_engine._version.VERSION` — distribution coordinate, `3.0.0`.
|
|
13
|
+
- `scenario_engine._version.ENGINE1_VERSION` — explicit historical Engine 1
|
|
14
|
+
execution coordinate, `1.0.0`; not added to the frozen package-root exports.
|
|
15
|
+
|
|
11
16
|
- `ENGINE_VERSION` — engine compatibility version recorded in manifests; for
|
|
12
17
|
current manifests it remains 1.0.0 independently of distribution version.
|
|
13
18
|
- `MISSING` — singleton semantic missing value, distinct from null.
|
|
@@ -58,6 +63,43 @@ checks recorded compatibility before returning a replayed `ScenarioResult`.
|
|
|
58
63
|
`evaluate_scenario()` returns `OracleEvaluation` and optionally raises on an
|
|
59
64
|
oracle mismatch.
|
|
60
65
|
|
|
66
|
+
### Engine 2 explicit public workflow
|
|
67
|
+
|
|
68
|
+
These names are explicitly public from `scenario_engine.engine2` (execution and
|
|
69
|
+
replay) and `scenario_engine.compatibility` (classification). They are not added
|
|
70
|
+
to the compatibility-frozen package root.
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
validate_engine2(yaml_text: str) -> CompiledScenarioV2
|
|
74
|
+
execute_engine2(scenario: CompiledScenarioV2, root_seed: str | int, schedule_seed: int, *, run_index: int = 0, inputs: Mapping[str, Any] | None = None, plugins: PluginRegistry | None = None) -> tuple[Engine2Result, ScheduleArtifact]
|
|
75
|
+
replay_engine2(result: Engine2Result | bytes | str, schedule: ScheduleArtifact | bytes | str, scenario: CompiledScenarioV2, *, inputs: Mapping[str, Any] | None = None, plugins: PluginRegistry | None = None) -> Engine2Result
|
|
76
|
+
classify_engine_contract(*, dsl_version: int | None, engine_version: str | None, result_contract: str | None, operation: str) -> CompatibilityDecision
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`validate_engine2()` accepts only DSL 2. `execute_engine2()` requires both the
|
|
80
|
+
generation root seed and independent schedule seed and returns immutable,
|
|
81
|
+
canonically serializable Result/2 and Schedule/1 evidence. `replay_engine2()`
|
|
82
|
+
strictly reads supplied evidence when bytes or text are given, independently
|
|
83
|
+
executes every recorded scheduler choice, verifies all coordinates and final
|
|
84
|
+
observations, and returns the verified immutable Result/2. It never reconstructs
|
|
85
|
+
missing schedule evidence. Compatibility classification is explicit and does not
|
|
86
|
+
execute, migrate, or promote evidence. Existing Engine 1 functions are unchanged.
|
|
87
|
+
|
|
88
|
+
`schedule_seed` is a required independent unsigned 64-bit coordinate. It is not
|
|
89
|
+
derived from `root_seed`. Engine 2 writes Result/2, Manifest/2, and Schedule/1;
|
|
90
|
+
exact replay requires the matching result, schedule, scenario, and explicit
|
|
91
|
+
inputs. Actor-aware analysis is exposed through the existing inspection,
|
|
92
|
+
explanation, impact, and offline `scenario_engine.trace_view` surfaces.
|
|
93
|
+
|
|
94
|
+
The immutable Engine 2 evidence access names are also public from their explicit
|
|
95
|
+
modules: `Engine2Manifest`, `Engine2Result`, `ScheduleReference`,
|
|
96
|
+
`read_manifest2()`, `read_result2()`, and their canonical byte functions from
|
|
97
|
+
`scenario_engine.engine2`; and `ScheduleArtifact`, `read_schedule()`, and its
|
|
98
|
+
canonical byte functions from `scenario_engine.schedule`. `read_suite_run2()` is
|
|
99
|
+
schema/reader validation only and does not execute a suite. Errors remain in the
|
|
100
|
+
`Engine2EvidenceError`/`Engine2EvidenceBoundError`/`Engine2ReplayMismatch` and
|
|
101
|
+
`ScheduleError`/`ScheduleBoundError`/`ScheduleReplayMismatch` families.
|
|
102
|
+
|
|
61
103
|
## Canonical scenario functions
|
|
62
104
|
|
|
63
105
|
```python
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Scenario Engine 3.0 compatibility contract
|
|
2
|
+
|
|
3
|
+
This document is normative for the frozen DSL, deterministic result, manifest,
|
|
4
|
+
and plugin contracts. Distribution metadata remains a packaging concern.
|
|
5
|
+
|
|
6
|
+
## Version roles
|
|
7
|
+
|
|
8
|
+
Distribution `VERSION` is 3.0.0 and public `ENGINE_VERSION` is 2.0.0. The
|
|
9
|
+
historical Engine 1 coordinate is independently fixed at 1.0.0: every
|
|
10
|
+
`scenario.manifest/1` produced by DSL 1 continues to record 1.0.0. Engine 2
|
|
11
|
+
Manifest/2 records 2.0.0. Package version is never inferred as an execution
|
|
12
|
+
coordinate.
|
|
13
|
+
|
|
14
|
+
## Canonical compatibility matrix
|
|
15
|
+
|
|
16
|
+
| DSL | Engine | Execution/replay |
|
|
17
|
+
| --- | --- | --- |
|
|
18
|
+
| integer `1` | `1.0.0` | supported: Result/1, Manifest/1, Suite Run/1 |
|
|
19
|
+
| integer `2` | `2.0.0` | supported: Result/2, Manifest/2, Schedule/1 |
|
|
20
|
+
| integer `1` | `2.0.0` | unsupported cross-major |
|
|
21
|
+
| integer `2` | `1.0.0` | unsupported cross-major |
|
|
22
|
+
|
|
23
|
+
Unknown, mixed-major, missing, and incomplete tuples fail closed. Reading does
|
|
24
|
+
not silently migrate evidence. Suite Run/2 support is schema/reader-only and
|
|
25
|
+
does not provide Engine 2 suite orchestration.
|
|
26
|
+
|
|
27
|
+
Engine SemVer has these meanings:
|
|
28
|
+
|
|
29
|
+
* **Major:** breaks a public API, accepted DSL, result schema, manifest schema,
|
|
30
|
+
replay gate, or deterministic semantic contract.
|
|
31
|
+
* **Minor:** adds backward-compatible behavior or a newly and explicitly
|
|
32
|
+
versioned deterministic algorithm.
|
|
33
|
+
* **Patch:** makes backward-compatible corrections without silently changing
|
|
34
|
+
deterministic bytes inside the documented contract. A correctness or
|
|
35
|
+
security correction that must change such bytes requires an explicit
|
|
36
|
+
compatibility/version response.
|
|
37
|
+
|
|
38
|
+
## DSL 1.0
|
|
39
|
+
|
|
40
|
+
DSL version 1 is the integer `1`, never a boolean. Unknown fields are errors.
|
|
41
|
+
Accepted syntax, defaults, order, and types are not silently reinterpreted;
|
|
42
|
+
breaking changes require a new DSL version and/or major engine contract.
|
|
43
|
+
|
|
44
|
+
Parsing uses safe YAML construction. Duplicate mapping keys at every depth,
|
|
45
|
+
aliases, merge keys, arbitrary tags, floats as semantic values, and non-string
|
|
46
|
+
semantic mapping keys are rejected. Plain `true` and `false` are booleans;
|
|
47
|
+
legacy YAML 1.1 words (`yes`, `no`, `on`, `off`) are strings. Decimal integer
|
|
48
|
+
syntax is accepted; ambiguous legacy integer forms are strings. Standard null
|
|
49
|
+
spellings resolve to null. Semantic decimal, datetime, duration, and missing
|
|
50
|
+
values use their explicit typed wrappers.
|
|
51
|
+
|
|
52
|
+
Arithmetic operators accept only integers (excluding booleans) and finite
|
|
53
|
+
`Decimal` values. Addition, subtraction, and multiplication return an integer
|
|
54
|
+
for two integer operands and a `Decimal` if either operand is decimal. Division
|
|
55
|
+
always returns `Decimal`; division by zero is an expression error. Decimal
|
|
56
|
+
operations use precision 28 with round-half-even and never the caller's ambient
|
|
57
|
+
decimal context. Strings, lists, booleans, null, missing, duration, and arbitrary
|
|
58
|
+
Python operator overloads are not arithmetic operands.
|
|
59
|
+
|
|
60
|
+
Optional empty-container behavior remains compatibility-frozen: `validators`,
|
|
61
|
+
`invariants`, and `faults` may be empty; `resources`, `constraints`, and
|
|
62
|
+
`subflows` may not be explicitly empty. Empty `oracle.expected.constraints` and
|
|
63
|
+
`oracle.expected.invariants` collections are accepted.
|
|
64
|
+
|
|
65
|
+
## Result and manifest
|
|
66
|
+
|
|
67
|
+
`ScenarioResult` required stable normalized top-level fields are `artifacts`,
|
|
68
|
+
`clock`, `history`, `manifest`, `next`, `scenario_id`, `state`, and
|
|
69
|
+
`terminal_transition`. `provenance` is optional stable and appears only when it
|
|
70
|
+
has records. `next` is retained as a compatibility alias and is always identical
|
|
71
|
+
to `terminal_transition`. Runner, resources, and snapshot backing fields are
|
|
72
|
+
internal and not separately serialized.
|
|
73
|
+
|
|
74
|
+
Artifact fields are `address`, `id`, `name`, `type`, and `value`. History fields
|
|
75
|
+
are `address`, `artifacts`, `faults_applied`, `patch`, `post`, `pre`, `timestamp`,
|
|
76
|
+
and `transition`. Addresses are canonical JSON strings. Provenance and manifest
|
|
77
|
+
records use their normalized public mappings. Canonical result bytes are UTF-8,
|
|
78
|
+
semantic normalization, sorted keys, compact comma/colon separators, and no
|
|
79
|
+
trailing newline.
|
|
80
|
+
|
|
81
|
+
The stable manifest fields are `root_seed`, `scenario_canonical_hash`,
|
|
82
|
+
`engine_version`, `dsl_version`, `input_resource_hashes`,
|
|
83
|
+
`domain_pack_versions`, `generator_versions`, `rng_algorithm_version`,
|
|
84
|
+
`id_algorithm_version`, `locale`, `reference_clock_start`, and `run_index`.
|
|
85
|
+
Mappings normalize in key order. `domain_pack_versions` is reserved and must be
|
|
86
|
+
empty; replay rejects it otherwise. All other fields are active execution
|
|
87
|
+
coordinates or compatibility gates. A future additive field needs explicit
|
|
88
|
+
default and reader rules; unknown data is not silently treated as compatible.
|
|
89
|
+
|
|
90
|
+
Exact replay requires a compatible recorded engine contract, DSL version,
|
|
91
|
+
RNG/ID and generator/plugin algorithm versions, canonical scenario hash,
|
|
92
|
+
input/resource hashes, root seed, run index, locale, reference clock, and other
|
|
93
|
+
explicit execution context. Each engine requires its exact immutable execution
|
|
94
|
+
coordinate and compatibility-tuple match. Unsupported cross-version replay fails
|
|
95
|
+
explicitly; indefinite replay across incompatible future major versions is not
|
|
96
|
+
promised.
|
|
97
|
+
|
|
98
|
+
## Cross-version assurance
|
|
99
|
+
|
|
100
|
+
Inspection support is intentionally independent from replay support: an artifact
|
|
101
|
+
may remain safely inspectable while exact replay is rejected. Migration is an
|
|
102
|
+
explicit, non-destructive operation and is available only for already-supported
|
|
103
|
+
routes; reading never silently migrates an artifact. Unsupported and unknown
|
|
104
|
+
contracts or versions fail closed rather than being treated as current-compatible.
|
|
105
|
+
|
|
106
|
+
These boundaries are tested against a small immutable corpus whose bytes,
|
|
107
|
+
provenance, SHA-256 values, and per-operation expectations are frozen under the
|
|
108
|
+
`scenario.compatibility-fixtures/1` manifest. The corpus represents selected
|
|
109
|
+
public states and synthetic negative cases; it is not a promise of universal
|
|
110
|
+
backward compatibility.
|
|
111
|
+
|
|
112
|
+
### Consuming the compatibility fixture bundle
|
|
113
|
+
|
|
114
|
+
Starting only from an installed Scenario Engine, discover this workflow through
|
|
115
|
+
`scenario --help`, then export the complete frozen corpus to an absent absolute
|
|
116
|
+
local directory (no source checkout or network access is required):
|
|
117
|
+
|
|
118
|
+
```sh
|
|
119
|
+
scenario compatibility-fixtures export --out /absolute/path/phase4_11
|
|
120
|
+
cd /absolute/path/phase4_11
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
The fixture manifest's optional `scenario_resource` and `inputs_resource`
|
|
124
|
+
fields identify the immutable public resources needed to construct replay
|
|
125
|
+
commands. The bundle contains current, historical, and synthetic artifacts for
|
|
126
|
+
replay, inspect, migrate, and compatibility exercises. Its bytes are frozen.
|
|
127
|
+
`--inputs` takes a bounded JSON object, so the companion file is read as the
|
|
128
|
+
argument instead of copying a magic value into shell quoting.
|
|
129
|
+
|
|
130
|
+
The current fixture replays with its published scenario and inputs:
|
|
131
|
+
|
|
132
|
+
```sh
|
|
133
|
+
scenario --json replay artifacts/current-2.1.2-suite-run-v1.json \
|
|
134
|
+
--scenario scenarios/compatibility_case.yaml \
|
|
135
|
+
--inputs "$(cat inputs/current-2.1.2-suite-run-v1.inputs.json)"
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
The historical 2.0.0 suite fixture remains replayable with its own published
|
|
139
|
+
inputs:
|
|
140
|
+
|
|
141
|
+
```sh
|
|
142
|
+
scenario --json replay artifacts/historical-2.0.0-suite-run-v1.json \
|
|
143
|
+
--scenario scenarios/compatibility_case.yaml \
|
|
144
|
+
--inputs "$(cat inputs/historical-2.0.0-suite-run-v1.inputs.json)"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
The historical 1.0.0 result is inspectable and migratable but is not a supported
|
|
148
|
+
replay artifact. This command fails closed with exit 5 and
|
|
149
|
+
`ENGINE_VERSION_UNSUPPORTED` in the `scenario.error/1` envelope:
|
|
150
|
+
|
|
151
|
+
```sh
|
|
152
|
+
scenario --json replay artifacts/historical-1.0.0-result-v1.json \
|
|
153
|
+
--scenario scenarios/compatibility_case.yaml
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Omitting the current artifact's required inputs fails with
|
|
157
|
+
`REPLAY_DATA_INCOMPLETE`:
|
|
158
|
+
|
|
159
|
+
```sh
|
|
160
|
+
scenario --json replay artifacts/current-2.1.2-suite-run-v1.json \
|
|
161
|
+
--scenario scenarios/compatibility_case.yaml
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
An unknown engine compatibility value fails closed with
|
|
165
|
+
`ENGINE_VERSION_UNSUPPORTED`:
|
|
166
|
+
|
|
167
|
+
```sh
|
|
168
|
+
scenario --json replay artifacts/synthetic-unknown-engine-suite-run-v1.json \
|
|
169
|
+
--scenario scenarios/compatibility_case.yaml --inputs '{"selected":7}'
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Its existing lossless migration route can be exercised without repository or
|
|
173
|
+
maintainer-local paths. The migration CLI requires absolute local source and
|
|
174
|
+
destination paths, so derive both from the fixture workspace:
|
|
175
|
+
|
|
176
|
+
```sh
|
|
177
|
+
BUNDLE="$(pwd)"
|
|
178
|
+
scenario --json migrate "$BUNDLE/artifacts/historical-1.0.0-result-v1.json" \
|
|
179
|
+
"$BUNDLE/migrated-historical-1.0.0" --artifact-kind result \
|
|
180
|
+
--schema-version scenario.result/1 --product-version 1.0.0 \
|
|
181
|
+
--source-sha256 ea7068eac7888857800c2784eb1e662dbe7de4bb62f89e2e26f23b9150dc3a67
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Replay input values are external execution data, not recoverable from their
|
|
185
|
+
recorded fingerprints. When an artifact records required external inputs,
|
|
186
|
+
omitting them or supplying data that cannot be resolved fails closed with exit
|
|
187
|
+
5, `REPLAY_DATA_INCOMPLETE`, and the next action
|
|
188
|
+
`PROVIDE_REQUIRED_REPLAY_INPUTS`; it never reveals a hash preimage.
|
|
189
|
+
|
|
190
|
+
## Plugins
|
|
191
|
+
|
|
192
|
+
A plugin name identifies a generator family. Its version is an exact,
|
|
193
|
+
immutable deterministic algorithm-contract identifier and is recorded under
|
|
194
|
+
`plugin:<name>` in `generator_versions`. Behavior-changing implementations must
|
|
195
|
+
use another version. Replay requires an explicitly registered compatible name
|
|
196
|
+
and version; unavailable or incompatible versions fail and are never silently
|
|
197
|
+
substituted. Package-release and deterministic-algorithm versions may differ.
|
|
198
|
+
There is no discovery, migration, network retrieval, or global registry contract.
|
{deterministic_scenario_engine-2.1.2 → deterministic_scenario_engine-3.0.0}/docs/dsl-reference.md
RENAMED
|
@@ -3,6 +3,10 @@
|
|
|
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
|
+
distribution 3.0.0. Public Engine 2.0.0 does not promote or reinterpret DSL 1.
|
|
8
|
+
See [DSL 2](dsl2-reference.md) for logical actors.
|
|
9
|
+
|
|
6
10
|
## Root document
|
|
7
11
|
|
|
8
12
|
Required root keys are:
|