deterministic-scenario-engine 3.0.0__tar.gz → 3.1.0__tar.gz

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