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.
Files changed (279) hide show
  1. {deterministic_scenario_engine-3.0.1/src/deterministic_scenario_engine.egg-info → deterministic_scenario_engine-3.1.0}/PKG-INFO +21 -11
  2. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/README.md +20 -10
  3. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/api.md +34 -1
  4. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/dsl-reference.md +2 -2
  5. deterministic_scenario_engine-3.1.0/docs/engine2-exploration.md +128 -0
  6. deterministic_scenario_engine-3.1.0/docs/engine2-suite.md +233 -0
  7. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/quickstart.md +20 -5
  8. deterministic_scenario_engine-3.1.0/docs/release-notes-3.1.0.md +51 -0
  9. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0/src/deterministic_scenario_engine.egg-info}/PKG-INFO +21 -11
  10. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/SOURCES.txt +7 -0
  11. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/_version.py +1 -1
  12. deterministic_scenario_engine-3.1.0/src/scenario_engine/engine2_explore.py +201 -0
  13. deterministic_scenario_engine-3.1.0/src/scenario_engine/engine2_suite.py +946 -0
  14. deterministic_scenario_engine-3.1.0/tests/test_e2_1_engine2_suite.py +531 -0
  15. deterministic_scenario_engine-3.1.0/tests/test_e2_2_engine2_exploration.py +345 -0
  16. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_1_0e_packaging_release_candidate.py +19 -17
  17. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_10_workflow_demonstrators.py +2 -2
  18. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_12_public_contract_docs_freeze.py +1 -1
  19. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_13_packaging_fresh_install_rc.py +1 -1
  20. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_1_v1_read_contract.py +1 -1
  21. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_2_composition.py +1 -1
  22. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_3_matrix.py +1 -1
  23. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_4_batch.py +1 -1
  24. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_5_inspect_explain.py +1 -1
  25. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_7_cli_product_surface.py +1 -1
  26. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_11_public_contract_docs_freeze.py +1 -1
  27. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_1_evidence_bundle_contract.py +1 -1
  28. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_12a_r2_quickstart_installed_consumer.py +1 -1
  29. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_12b_1_version_promotion.py +1 -1
  30. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/LICENSE +0 -0
  31. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/MANIFEST.in +0 -0
  32. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/compatibility.md +0 -0
  33. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/determinism.md +0 -0
  34. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/dsl2-reference.md +0 -0
  35. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/hypothesis.md +0 -0
  36. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/phase2-architecture.md +0 -0
  37. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/phase2-public-contract.md +0 -0
  38. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/phase3-architecture.md +0 -0
  39. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/phase3-public-contract.md +0 -0
  40. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/phase4-architecture.md +0 -0
  41. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/phase5-architecture.md +0 -0
  42. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/plugins.md +0 -0
  43. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/product-evidence-gate.md +0 -0
  44. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/release-notes-2.2.0.md +0 -0
  45. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/release-notes-3.0.0.md +0 -0
  46. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/release-notes-3.0.1.md +0 -0
  47. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/release-process.md +0 -0
  48. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/reproducibility.md +0 -0
  49. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/schemathesis.md +0 -0
  50. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/security-and-non-goals.md +0 -0
  51. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/sqlalchemy.md +0 -0
  52. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/docs/testing-oracle.md +0 -0
  53. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/api_scenario.yaml +0 -0
  54. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/cart.yaml +0 -0
  55. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/control_flow.yaml +0 -0
  56. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/ecommerce.yaml +0 -0
  57. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/openapi.yaml +0 -0
  58. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/oracle_fault.yaml +0 -0
  59. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_1b_cart.yaml +0 -0
  60. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_3_resources.yaml +0 -0
  61. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_4_control_flow.yaml +0 -0
  62. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_5_oracle_fault.yaml +0 -0
  63. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_6_sqlalchemy_rows.yaml +0 -0
  64. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_7_ecommerce_plugin.yaml +0 -0
  65. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_8_api_scenario.yaml +0 -0
  66. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase0_8_openapi.yaml +0 -0
  67. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/phase3_ecommerce_evidence.py +0 -0
  68. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/resources.yaml +0 -0
  69. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/examples/sqlalchemy_rows.yaml +0 -0
  70. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/pyproject.toml +0 -0
  71. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/setup.cfg +0 -0
  72. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/setup.py +0 -0
  73. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/dependency_links.txt +0 -0
  74. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/entry_points.txt +0 -0
  75. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/requires.txt +0 -0
  76. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/deterministic_scenario_engine.egg-info/top_level.txt +0 -0
  77. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/__init__.py +0 -0
  78. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/adapters/__init__.py +0 -0
  79. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/adapters/json_file.py +0 -0
  80. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/adapters/sqlalchemy.py +0 -0
  81. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/address.py +0 -0
  82. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/artifacts.py +0 -0
  83. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/__init__.py +0 -0
  84. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/canonical.py +0 -0
  85. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/errors.py +0 -0
  86. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/models.py +0 -0
  87. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/batch/runtime.py +0 -0
  88. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/canonical.py +0 -0
  89. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/cli/__init__.py +0 -0
  90. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/cli/__main__.py +0 -0
  91. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/cli/main.py +0 -0
  92. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/clock.py +0 -0
  93. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/compatibility.py +0 -0
  94. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/compatibility_fixtures.py +0 -0
  95. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/__init__.py +0 -0
  96. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/canonical.py +0 -0
  97. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/errors.py +0 -0
  98. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/models.py +0 -0
  99. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/parser.py +0 -0
  100. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/resolver.py +0 -0
  101. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/composition/runtime.py +0 -0
  102. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/context.py +0 -0
  103. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/control_flow.py +0 -0
  104. {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
  105. {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
  106. {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
  107. {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
  108. {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
  109. {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
  110. {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
  111. {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
  112. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase4_11/compatibility-fixtures.json +0 -0
  113. {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
  114. {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
  115. {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
  116. {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
  117. {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
  118. {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
  119. {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
  120. {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
  121. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/data/compatibility/phase5_10/compatibility-fixtures.json +0 -0
  122. {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
  123. {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
  124. {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
  125. {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
  126. {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
  127. {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
  128. {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
  129. {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
  130. {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
  131. {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
  132. {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
  133. {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
  134. {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
  135. {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
  136. {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
  137. {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
  138. {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
  139. {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
  140. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/definition_diff.py +0 -0
  141. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diagnostics.py +0 -0
  142. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/__init__.py +0 -0
  143. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/compare.py +0 -0
  144. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/errors.py +0 -0
  145. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/models.py +0 -0
  146. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/render.py +0 -0
  147. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/diff/serialization.py +0 -0
  148. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/__init__.py +0 -0
  149. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/canonical.py +0 -0
  150. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/errors.py +0 -0
  151. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/models.py +0 -0
  152. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/domain_packs/registry.py +0 -0
  153. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/__init__.py +0 -0
  154. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/actor_runtime.py +0 -0
  155. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/compiler.py +0 -0
  156. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/errors.py +0 -0
  157. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/models.py +0 -0
  158. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/parser.py +0 -0
  159. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/dsl/runtime.py +0 -0
  160. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/engine2.py +0 -0
  161. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/errors.py +0 -0
  162. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/__init__.py +0 -0
  163. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/adapter.py +0 -0
  164. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/canonical.py +0 -0
  165. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/compatibility.py +0 -0
  166. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/errors.py +0 -0
  167. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/export.py +0 -0
  168. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/fixture.py +0 -0
  169. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/migration.py +0 -0
  170. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/models.py +0 -0
  171. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/evidence/read.py +0 -0
  172. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/expressions.py +0 -0
  173. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/faults.py +0 -0
  174. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/history.py +0 -0
  175. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/ids.py +0 -0
  176. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/impact.py +0 -0
  177. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/__init__.py +0 -0
  178. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/errors.py +0 -0
  179. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/explain.py +0 -0
  180. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/inspect.py +0 -0
  181. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/models.py +0 -0
  182. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/redaction.py +0 -0
  183. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/inspection/serialization.py +0 -0
  184. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/integrations/__init__.py +0 -0
  185. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/integrations/hypothesis.py +0 -0
  186. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/integrations/schemathesis.py +0 -0
  187. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/invariants.py +0 -0
  188. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/manifest.py +0 -0
  189. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/__init__.py +0 -0
  190. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/canonical.py +0 -0
  191. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/errors.py +0 -0
  192. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/expand.py +0 -0
  193. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/filtering.py +0 -0
  194. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/models.py +0 -0
  195. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/matrix/runtime.py +0 -0
  196. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle.py +0 -0
  197. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/__init__.py +0 -0
  198. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/errors.py +0 -0
  199. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/evaluate.py +0 -0
  200. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/models.py +0 -0
  201. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/oracle_assertions/serialization.py +0 -0
  202. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/plugins.py +0 -0
  203. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/provenance.py +0 -0
  204. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/pytest_plugin.py +0 -0
  205. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/reference_packs/__init__.py +0 -0
  206. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/reference_packs/ecommerce.py +0 -0
  207. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/reference_packs/ecommerce_evidence.py +0 -0
  208. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/resources.py +0 -0
  209. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/result.py +0 -0
  210. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/rng.py +0 -0
  211. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/runner.py +0 -0
  212. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/scaffolding.py +0 -0
  213. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/schedule.py +0 -0
  214. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/scheduler.py +0 -0
  215. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/state.py +0 -0
  216. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/__init__.py +0 -0
  217. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/errors.py +0 -0
  218. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/models.py +0 -0
  219. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/publication.py +0 -0
  220. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/read.py +0 -0
  221. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/suite/serialization.py +0 -0
  222. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/trace_view.py +0 -0
  223. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/validation.py +0 -0
  224. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/src/scenario_engine/values.py +0 -0
  225. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_1a_semantic_kernel.py +0 -0
  226. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_1b_linear_dsl.py +0 -0
  227. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_1c_integrated_phase0_1.py +0 -0
  228. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_1c_r1_missing_sentinel_repair.py +0 -0
  229. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_2a_reproducible_results.py +0 -0
  230. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_2b_json_pytest_integration.py +0 -0
  231. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_3_resources_constraints.py +0 -0
  232. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_4_control_flow.py +0 -0
  233. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_5_oracle_faults.py +0 -0
  234. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_6_sqlalchemy_materializer.py +0 -0
  235. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_7_plugins_ecommerce.py +0 -0
  236. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_0_8_hypothesis_schemathesis.py +0 -0
  237. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_1_0b_public_api_error_contract.py +0 -0
  238. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_1_0c_dsl_compatibility_contract.py +0 -0
  239. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_1_0d_documentation_examples.py +0 -0
  240. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_11_performance_scale_hardening.py +0 -0
  241. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_1_models_serialization.py +0 -0
  242. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_6_structured_semantic_diff.py +0 -0
  243. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_8_domain_pack_foundation.py +0 -0
  244. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_2_9_oracle_assertions.py +0 -0
  245. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_10_performance_security_hardening.py +0 -0
  246. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_12_packaging_fresh_install_rc.py +0 -0
  247. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_2_safe_bundle_reader_validator.py +0 -0
  248. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_3_ordered_export.py +0 -0
  249. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_4_evidence_adapter_contract.py +0 -0
  250. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_5_compatibility_migration_planner.py +0 -0
  251. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_6_lossless_migrations_fixture_export.py +0 -0
  252. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_7_cli_interchange_surface.py +0 -0
  253. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_3_8_ecommerce_evidence_workflow.py +0 -0
  254. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_10_canonical_workflow_help.py +0 -0
  255. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_11_cross_version_fixtures.py +0 -0
  256. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_12_hardening.py +0 -0
  257. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_12r2_public_fixture_packaging.py +0 -0
  258. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_12r3_consumer_secret_redaction.py +0 -0
  259. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_1_cli_replay_workflow.py +0 -0
  260. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_2_replay_compatibility_diagnostics.py +0 -0
  261. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_3_filesystem_trust_boundary.py +0 -0
  262. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_4_actionable_human_diagnostics.py +0 -0
  263. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_5_machine_readable_error_envelope.py +0 -0
  264. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_6_author_time_scaffolding.py +0 -0
  265. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_7_scenario_definition_structural_diff.py +0 -0
  266. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_8_conservative_impact_analysis.py +0 -0
  267. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_4_9_static_trace_viewer.py +0 -0
  268. {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
  269. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_11_performance_security_contract_freeze.py +0 -0
  270. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_1_dsl2_actor_lane_foundation.py +0 -0
  271. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_2_scheduler_kernel.py +0 -0
  272. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_3_actor_execution_shared_state.py +0 -0
  273. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_4_schedule_identity_replay.py +0 -0
  274. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_5_result2_engine2_compatibility.py +0 -0
  275. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_6_public_cli_python_execution.py +0 -0
  276. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_phase_5_7_actor_aware_analysis.py +0 -0
  277. {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
  278. {deterministic_scenario_engine-3.0.1 → deterministic_scenario_engine-3.1.0}/tests/test_readme_pypi_portability.py +0 -0
  279. {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.1
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
- For this release the distribution is `3.0.1`; a source-development editable
119
- install resolves the module under its `src/scenario_engine` directory. The DSE
120
- distribution version is distinct from Engine 1 (`1.0.0`) and Engine 2 (`2.0.0`)
121
- compatibility versions.
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 published distribution version
191
- 3.0.1 and public Engine 2.0.0. Engine 1 manifests remain exactly 1.0.0
192
- with integer DSL 1; Engine 2 manifests use 2.0.0 with integer DSL 2. Supported
193
- Python versions are 3.11–3.14. Suite Run/2 is reader/schema support only; Engine
194
- 2 suite orchestration, cross-major promotion, remote URI input, and implicit
195
- schedule-seed derivation are unsupported. The project is Apache-2.0 licensed.
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
- For this release the distribution is `3.0.1`; a source-development editable
82
- install resolves the module under its `src/scenario_engine` directory. The DSE
83
- distribution version is distinct from Engine 1 (`1.0.0`) and Engine 2 (`2.0.0`)
84
- compatibility versions.
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 published distribution version
154
- 3.0.1 and public Engine 2.0.0. Engine 1 manifests remain exactly 1.0.0
155
- with integer DSL 1; Engine 2 manifests use 2.0.0 with integer DSL 2. Supported
156
- Python versions are 3.11–3.14. Suite Run/2 is reader/schema support only; Engine
157
- 2 suite orchestration, cross-major promotion, remote URI input, and implicit
158
- schedule-seed derivation are unsupported. The project is Apache-2.0 licensed.
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.0.0`.
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
@@ -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
- distribution 3.0.0. Public Engine 2.0.0 does not promote or reinterpret DSL 1.
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.
@@ -1,6 +1,9 @@
1
1
  # Canonical installed-package workflows
2
2
 
3
- **3.0.1 release documentation.** These commands apply to distribution 3.0.1.
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. It
41
- should report DSE distribution `3.0.1`; the resolved module path shows the code
42
- Python actually imports. This distribution version is distinct from Engine 1
43
- (`1.0.0`) and Engine 2 (`2.0.0`) compatibility versions.
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.