engineering-argument-language 3.2.3__tar.gz → 3.2.4__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 (361) hide show
  1. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/CONTRACT.md +2 -2
  2. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/PKG-INFO +6 -6
  3. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/README.md +5 -5
  4. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/aspic-method.md +1 -1
  5. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/eal3-composition.md +1 -1
  6. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/eal3-design.md +1 -1
  7. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/mcp-and-tools.md +1 -1
  8. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/mcp-architecture.md +1 -1
  9. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/packaging.md +17 -17
  10. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/README.md +1 -1
  11. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/pyproject.toml +1 -1
  12. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/scripts/distribution_smoke.py +14 -0
  13. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/__init__.py +1 -1
  14. engineering_argument_language-3.2.4/src/eal/host_redaction.py +90 -0
  15. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/engineering_argument_language.egg-info/PKG-INFO +6 -6
  16. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/engineering_argument_language.egg-info/SOURCES.txt +1 -0
  17. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_host_credentials.py +38 -12
  18. engineering_argument_language-3.2.4/tests/test_host_redaction.py +128 -0
  19. engineering_argument_language-3.2.3/src/eal/host_redaction.py +0 -51
  20. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/.github/workflows/experiment-stage.yml +0 -0
  21. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/.github/workflows/experiment.yml +0 -0
  22. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/.github/workflows/publish.yml +0 -0
  23. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/.github/workflows/test.yml +0 -0
  24. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/.github/workflows/verify.yml +0 -0
  25. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/AGENTS.md +0 -0
  26. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/LICENSE +0 -0
  27. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/MANIFEST.in +0 -0
  28. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/Makefile +0 -0
  29. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/argument-model.md +0 -0
  30. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/argument-reconstruction.md +0 -0
  31. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/argument-service.md +0 -0
  32. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/aspic-view-v1.schema.json +0 -0
  33. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/aspic-view.schema.json +0 -0
  34. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/design-aim.md +0 -0
  35. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/eal3-experiment-methodology.md +0 -0
  36. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/eal3-syntax-comparison.md +0 -0
  37. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/grounded-reasoning.md +0 -0
  38. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/language.md +0 -0
  39. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/reasoning-modes.md +0 -0
  40. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/sources.md +0 -0
  41. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/vocabulary.md +0 -0
  42. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/aspic-compiled.eal +0 -0
  43. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/aspic-fixture.json +0 -0
  44. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/aspic-source.eal +0 -0
  45. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/aspic-tools.toml +0 -0
  46. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/aspic_compiled_demo.py +0 -0
  47. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/aspic_demo.py +0 -0
  48. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/aspic_fixture_collector.py +0 -0
  49. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/collect_results.py +0 -0
  50. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/mcp.toml +0 -0
  51. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/recompute_synthetic.py +0 -0
  52. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/report.json +0 -0
  53. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/run.py +0 -0
  54. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/source.eal +0 -0
  55. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/tools.toml +0 -0
  56. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/README.md +0 -0
  57. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/collector.py +0 -0
  58. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/demo.py +0 -0
  59. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/fixture.json +0 -0
  60. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/formal.eal +0 -0
  61. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/output/compiled-view.json +0 -0
  62. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/output/formal-view.json +0 -0
  63. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/output/summary.json +0 -0
  64. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/source.eal +0 -0
  65. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/tools.toml +0 -0
  66. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/multi-environment/README.md +0 -0
  67. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/multi-environment/collector.py +0 -0
  68. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/multi-environment/fixtures.json +0 -0
  69. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/multi-environment/run.py +0 -0
  70. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/multi-environment/source.eal +0 -0
  71. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/multi-environment/tools.toml +0 -0
  72. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/scoped-review/README.md +0 -0
  73. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/scoped-review/collector.py +0 -0
  74. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/scoped-review/review.eal +0 -0
  75. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/scoped-review/run.py +0 -0
  76. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/scoped-review/tools.toml +0 -0
  77. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/__init__.py +0 -0
  78. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/README.md +0 -0
  79. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/WORKFLOW.md +0 -0
  80. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/__init__.py +0 -0
  81. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/accounting.py +0 -0
  82. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/adoption_costs.py +0 -0
  83. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/allocation_assessment.py +0 -0
  84. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/analyse.py +0 -0
  85. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/annotation_provenance.py +0 -0
  86. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/annotations.py +0 -0
  87. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/answers.py +0 -0
  88. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/artifacts.py +0 -0
  89. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/batch_simulation.py +0 -0
  90. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/benchmark.py +0 -0
  91. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/bounded_statistics.py +0 -0
  92. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/cadence-diagnostic-plan.json +0 -0
  93. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/cadence-information-design.json +0 -0
  94. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/cadence-plan.json +0 -0
  95. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/calibration.py +0 -0
  96. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/cases.py +0 -0
  97. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/collector.py +0 -0
  98. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/comparisons.py +0 -0
  99. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/conditions.py +0 -0
  100. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/conventional_reasoner.py +0 -0
  101. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/corpus_cases.py +0 -0
  102. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/corpus_context.py +0 -0
  103. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/corpus_logic.py +0 -0
  104. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/corpus_reference.py +0 -0
  105. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/decision_statistics.py +0 -0
  106. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/design.py +0 -0
  107. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostic-plan.json +0 -0
  108. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostic_design.py +0 -0
  109. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostic_inference.py +0 -0
  110. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostic_measurement.py +0 -0
  111. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostic_preparation.py +0 -0
  112. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostic_reporting.py +0 -0
  113. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostic_resources.py +0 -0
  114. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostics.py +0 -0
  115. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/evaluation-tasks.example.json +0 -0
  116. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/execution.py +0 -0
  117. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/information-design.json +0 -0
  118. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/information_config.py +0 -0
  119. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/information_design.py +0 -0
  120. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/journal.py +0 -0
  121. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/nuisance.py +0 -0
  122. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/outcomes.py +0 -0
  123. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/pilot_data.py +0 -0
  124. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/plan.json +0 -0
  125. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/plan_information.py +0 -0
  126. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/progress.py +0 -0
  127. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/project.py +0 -0
  128. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/prompts.py +0 -0
  129. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/protocol.json +0 -0
  130. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/provenance.py +0 -0
  131. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/provider.py +0 -0
  132. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/reasoning_context.py +0 -0
  133. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/records.py +0 -0
  134. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/rehearse.py +0 -0
  135. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/reporting.py +0 -0
  136. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/requirements.lock +0 -0
  137. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/resources.py +0 -0
  138. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/results/run-36432530106.md +0 -0
  139. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/run_state.py +0 -0
  140. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/runner.py +0 -0
  141. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/scoring.py +0 -0
  142. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/session.py +0 -0
  143. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/session_recovery.py +0 -0
  144. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/statistical_quantiles.py +0 -0
  145. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/task_case.py +0 -0
  146. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/task_context.py +0 -0
  147. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/task_corpus.json +0 -0
  148. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/task_manifest.py +0 -0
  149. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/threshold_method.py +0 -0
  150. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/trajectory_simulation.py +0 -0
  151. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validate_design.py +0 -0
  152. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/design-validation-screening.json +0 -0
  153. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/design-validation.json +0 -0
  154. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/eal3-language.json +0 -0
  155. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/eal31-composition.json +0 -0
  156. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/rehearsals.json +0 -0
  157. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/runtime-rehearsals.json +0 -0
  158. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/throughput.json +0 -0
  159. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/wrapper.json +0 -0
  160. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/verification-eal3.md +0 -0
  161. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/verification-eal31.md +0 -0
  162. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/verification.md +0 -0
  163. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/workflow.py +0 -0
  164. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/README.md +0 -0
  165. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/__init__.py +0 -0
  166. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/__main__.py +0 -0
  167. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/analysis.py +0 -0
  168. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/calibration.py +0 -0
  169. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/demo/eal-authoring-example.eal +0 -0
  170. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/demo/eal-authoring-tools.toml +0 -0
  171. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/demo/plan.json +0 -0
  172. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/demo/seed/README.md +0 -0
  173. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/demo/seed/measurement.json +0 -0
  174. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/demo/seed/probe.py +0 -0
  175. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/design.py +0 -0
  176. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/inference.py +0 -0
  177. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/mock_model.py +0 -0
  178. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/model_gateway.py +0 -0
  179. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/openai_responses.py +0 -0
  180. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/operations.py +0 -0
  181. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/protocol.json +0 -0
  182. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/verification/calibration.json +0 -0
  183. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/verification/results.md +0 -0
  184. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/workspace.py +0 -0
  185. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/grammar/EAL.g4 +0 -0
  186. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/scripts/check_distribution.py +0 -0
  187. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/scripts/check_release_tag.py +0 -0
  188. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/scripts/experiment_pipeline.py +0 -0
  189. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/scripts/generate_parser.py +0 -0
  190. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/setup.cfg +0 -0
  191. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/eal-assessment-routing/SKILL.md +0 -0
  192. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/SKILL.md +0 -0
  193. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/agents/openai.yaml +0 -0
  194. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/assets/icon.svg +0 -0
  195. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/references/design-contract.md +0 -0
  196. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/references/expert-language-design.md +0 -0
  197. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/references/implementation-patterns.md +0 -0
  198. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/references/mcp-execution.md +0 -0
  199. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/references/reasoning-modes.md +0 -0
  200. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/references/reasoning-semantics.md +0 -0
  201. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/references/sources.md +0 -0
  202. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/abstractions.py +0 -0
  203. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/acquisition_coordination.py +0 -0
  204. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/api_load_methods.py +0 -0
  205. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/aspic.py +0 -0
  206. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/aspic_compiler.py +0 -0
  207. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/aspic_export.py +0 -0
  208. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/builtin_methods.py +0 -0
  209. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/catalogue.py +0 -0
  210. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/cli.py +0 -0
  211. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/client_transports.py +0 -0
  212. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/collection_identity.py +0 -0
  213. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/collection_scheduler.py +0 -0
  214. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/command_process.py +0 -0
  215. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/command_supervisor.py +0 -0
  216. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/composition.py +0 -0
  217. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/credentials.py +0 -0
  218. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/dialectic.py +0 -0
  219. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/discovery.py +0 -0
  220. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/evaluator.py +0 -0
  221. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/expressions.py +0 -0
  222. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/extensions.py +0 -0
  223. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/formatter.py +0 -0
  224. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/generated/EALLexer.py +0 -0
  225. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/generated/EALParser.py +0 -0
  226. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/generated/EALVisitor.py +0 -0
  227. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/generated/__init__.py +0 -0
  228. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/host.py +0 -0
  229. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/knowledge.py +0 -0
  230. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/limits.py +0 -0
  231. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/mcp_guard.py +0 -0
  232. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/methods.py +0 -0
  233. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/model.py +0 -0
  234. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/model_context.py +0 -0
  235. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/modes.py +0 -0
  236. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/observation_reuse.py +0 -0
  237. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/operation_contracts.py +0 -0
  238. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/operations.py +0 -0
  239. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/packets.py +0 -0
  240. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/parser.py +0 -0
  241. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/planning.py +0 -0
  242. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/propositions.py +0 -0
  243. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reachability.py +0 -0
  244. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/__init__.py +0 -0
  245. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/abductive.py +0 -0
  246. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/analogical.py +0 -0
  247. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/causal.py +0 -0
  248. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/counterfactual.py +0 -0
  249. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/deductive.py +0 -0
  250. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/inductive.py +0 -0
  251. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/strategy.py +0 -0
  252. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/structured.py +0 -0
  253. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/temporal.py +0 -0
  254. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/validation.py +0 -0
  255. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/registered_assessment.py +0 -0
  256. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/runtime.py +0 -0
  257. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/sampled_negative.py +0 -0
  258. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/scope_transfer.py +0 -0
  259. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/semantics.py +0 -0
  260. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/server.py +0 -0
  261. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/server_auth.py +0 -0
  262. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/server_settings.py +0 -0
  263. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/source_printer.py +0 -0
  264. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/store.py +0 -0
  265. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/tool_acquisition.py +0 -0
  266. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/engineering_argument_language.egg-info/dependency_links.txt +0 -0
  267. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/engineering_argument_language.egg-info/entry_points.txt +0 -0
  268. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/engineering_argument_language.egg-info/requires.txt +0 -0
  269. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/engineering_argument_language.egg-info/top_level.txt +0 -0
  270. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_acquisition_coordination.py +0 -0
  271. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_ai_annotation_provenance.py +0 -0
  272. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_api_load_methods.py +0 -0
  273. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic.py +0 -0
  274. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic_compiler.py +0 -0
  275. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic_compiler_entrypoints.py +0 -0
  276. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic_export.py +0 -0
  277. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic_extensions.py +0 -0
  278. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic_formal_annotations.py +0 -0
  279. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic_keywords_example.py +0 -0
  280. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic_pyarg.py +0 -0
  281. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_binding_contract_review.py +0 -0
  282. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_builtin_method_specs.py +0 -0
  283. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_catalogue.py +0 -0
  284. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_cli_catalogue.py +0 -0
  285. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_client_transports.py +0 -0
  286. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_collection_budgets.py +0 -0
  287. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_collection_identity.py +0 -0
  288. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_collection_scheduler.py +0 -0
  289. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_command_process.py +0 -0
  290. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_composed_dialectic.py +0 -0
  291. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_composed_language.py +0 -0
  292. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_dialectic.py +0 -0
  293. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_discovery.py +0 -0
  294. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_distribution_metadata.py +0 -0
  295. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_eal3_frontend.py +0 -0
  296. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_eal3_integration.py +0 -0
  297. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_eal3_runtime.py +0 -0
  298. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_eal3_syntax.py +0 -0
  299. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_evaluator.py +0 -0
  300. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_execution_contract_review.py +0 -0
  301. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_experiment_pipeline.py +0 -0
  302. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_extension_runtime.py +0 -0
  303. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_formatter.py +0 -0
  304. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_frontend_contract_review.py +0 -0
  305. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_host.py +0 -0
  306. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_host_limits.py +0 -0
  307. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_http_origin.py +0 -0
  308. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_investigation_improvements.py +0 -0
  309. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_knowledge.py +0 -0
  310. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_language.py +0 -0
  311. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_language_version.py +0 -0
  312. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_load_test_example.py +0 -0
  313. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_mcp.py +0 -0
  314. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_mcp_lifetime.py +0 -0
  315. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_mcp_transports.py +0 -0
  316. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_method_extensions.py +0 -0
  317. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_method_worker_limits.py +0 -0
  318. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer.py +0 -0
  319. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_answers.py +0 -0
  320. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_corpus.py +0 -0
  321. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_design.py +0 -0
  322. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_diagnostics.py +0 -0
  323. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_execution.py +0 -0
  324. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_information_design.py +0 -0
  325. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_records.py +0 -0
  326. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_rehearsal.py +0 -0
  327. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_reporting.py +0 -0
  328. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_session.py +0 -0
  329. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_task.py +0 -0
  330. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_workflow.py +0 -0
  331. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_modes.py +0 -0
  332. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_multi_environment_example.py +0 -0
  333. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_observation_reuse.py +0 -0
  334. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_packets.py +0 -0
  335. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_planning.py +0 -0
  336. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_qualified_packets.py +0 -0
  337. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_reachability_companion.py +0 -0
  338. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_reasoning_contract_review.py +0 -0
  339. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_reasoning_pipeline_contract.py +0 -0
  340. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_registered_assessment.py +0 -0
  341. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_release_tag.py +0 -0
  342. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_revision_contract.py +0 -0
  343. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_runtime.py +0 -0
  344. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_sampled_negative.py +0 -0
  345. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_scope_transfer_language.py +0 -0
  346. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_scoped_composition.py +0 -0
  347. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_semantic_review.py +0 -0
  348. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_server_auth.py +0 -0
  349. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_server_settings.py +0 -0
  350. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_service_workflow.py +0 -0
  351. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_store_initialisation.py +0 -0
  352. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_store_lifecycle.py +0 -0
  353. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_transfer_inference.py +0 -0
  354. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_transfer_study.py +0 -0
  355. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_typed_propositions.py +0 -0
  356. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tools/investigation-validator/README.md +0 -0
  357. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tools/investigation-validator/assets/investigation-protocol.template.json +0 -0
  358. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tools/investigation-validator/provenance.json +0 -0
  359. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tools/investigation-validator/scripts/validate_design.py +0 -0
  360. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tools/investigation-validator/scripts/validate_investigation.py +0 -0
  361. {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tools/investigation-validator/scripts/validate_workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  # EAL/3 integration contract
2
2
 
3
- EAL/3 is the supported source language. The Python distribution is `engineering-argument-language` version `3.2.3`, imported as `eal`, and its source notation uses newline-terminated fields and typed flows. The source language, persisted `EAL/observation-record/1`, typed `EAL/typed-input/1`, compact `EAL/assessment-packet/2` and registered `EAL/registered-assessment/1` results are separate contracts. See [language syntax](docs/language.md), [reasoning modes](docs/reasoning-modes.md) and the [argument service](docs/argument-service.md).
3
+ EAL/3 is the supported source language. The Python distribution is `engineering-argument-language` version `3.2.4`, imported as `eal`, and its source notation uses newline-terminated fields and typed flows. The source language, persisted `EAL/observation-record/1`, typed `EAL/typed-input/1`, compact `EAL/assessment-packet/2` and registered `EAL/registered-assessment/1` results are separate contracts. See [language syntax](docs/language.md), [reasoning modes](docs/reasoning-modes.md) and the [argument service](docs/argument-service.md).
4
4
 
5
5
  Source fields use newlines, contexts resolve metadata defaults, and typed support flows lower to the existing argument model. Package, source notation and stored observation versions remain separate. Strictness, ranks and contraries retain their opt-in ASPIC+ compilation effects.
6
6
 
@@ -49,7 +49,7 @@ FastMCP `4.0.10` supplies stdio and Streamable HTTP transports through MCP Pytho
49
49
 
50
50
  The HTTP runner always enables strict Host/Origin protection before MCP handling. Accepted hosts include FastMCP's loopback defaults, the configured host, the actual bound address and `allowed_hosts` additions. Supplied origins must match the request's origin, qualify as loopback on a loopback request, or appear in `allowed_origins`. Untrusted Host and Origin headers receive HTTP 421 and 403 respectively. `[server.http].allowed_hosts` and `.allowed_origins` contain up to 128 unique literal entries each; repeated `--allowed-host` / `--allowed-origin` options and JSON-array `EAL_MCP_ALLOWED_HOSTS` / `EAL_MCP_ALLOWED_ORIGINS` variables follow normal precedence. Wildcards are rejected.
51
51
 
52
- Non-loopback HTTP binds and additional non-loopback trusted hosts/origins require `--token-env NAME` or `[server.http].token_env`, including public proxies forwarding to loopback. Startup reads the token from that environment variable; settings and source contain only its name. The bearer credential grants access to the endpoint's fixed operator workspace or registered-entry allowlist. The service implements one host trust domain per endpoint. HTTP clients use `eal-host --url URL [--token-env NAME]`; this connects to an already running service and treats the credential as an opaque bearer value. The host's default route launches a stdio subprocess, and its flat JSON `compile_aspic` operation uses the same checked contract as `eal_compile_aspic`. Credential sanitisation preserves JSON field names and public host metadata, while redacting application string values and diagnostics, including values in JSON-bearing content text. See [MCP and tools](docs/mcp-and-tools.md) for settings and examples.
52
+ Non-loopback HTTP binds and additional non-loopback trusted hosts/origins require `--token-env NAME` or `[server.http].token_env`, including public proxies forwarding to loopback. Startup reads the token from that environment variable; settings and source contain only its name. The bearer credential grants access to the endpoint's fixed operator workspace or registered-entry allowlist. The service implements one host trust domain per endpoint. HTTP clients use `eal-host --url URL [--token-env NAME]`; this connects to an already running service and treats the credential as an opaque bearer value. The host's default route launches a stdio subprocess, and its flat JSON `compile_aspic` operation uses the same checked contract as `eal_compile_aspic`. Credential sanitisation preserves fixed host and MCP content-block fields and public metadata, while redacting application object keys, string values, extra wrapper fields and diagnostics, including escaped keys in JSON-bearing text. Unsafe JSON-looking text is replaced in full; collisions between sanitised object keys produce one error response with exit code 2. See [MCP and tools](docs/mcp-and-tools.md) for settings and examples.
53
53
 
54
54
  Collections bind exact source bytes and context. The evaluator reports `supported`, `contested`, `unsupported` or `out_of_scope` for claims; it also returns named argument, evidence, assumption, objection and reasoning results. Objections and support dependencies are solved under the finite authored argument model. An `unsupported` result does not assert the opposite claim. Typed propositions check formal correspondence and result predicates within the installed method's limits; human review remains responsible for whether an authored claim and its measurement answer the intended engineering question.
55
55
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: engineering-argument-language
3
- Version: 3.2.3
3
+ Version: 3.2.4
4
4
  Summary: An ANTLR4 language and MCP interpreter for engineering reasoning and argumentation
5
5
  Author: Emmett Miller
6
6
  Maintainer: Emmett Miller
@@ -41,7 +41,7 @@ Dynamic: license-file
41
41
 
42
42
  EAL/3 records engineering claims, their evidence requirements, reasoning methods, assumptions and objections in reusable source files. A Python host binds declared tools to a separate TOML configuration, collects observations, assesses claims and stores the result. Later sessions and different models can find the same source and reuse compatible observations until they expire.
43
43
 
44
- The Python distribution is **`engineering-argument-language` 3.2.3** and requires Python **3.11 or later**; application code imports `eal`. The supported source language is `EAL/3`, with newline-terminated fields and typed flows. Stored tool results use `EAL/observation-record/1`; model-facing summaries use `EAL/assessment-packet/2`.
44
+ The Python distribution is **`engineering-argument-language` 3.2.4** and requires Python **3.11 or later**; application code imports `eal`. The supported source language is `EAL/3`, with newline-terminated fields and typed flows. Stored tool results use `EAL/observation-record/1`; model-facing summaries use `EAL/assessment-packet/2`.
45
45
 
46
46
  ## Author a bounded argument
47
47
 
@@ -82,18 +82,18 @@ Create a virtual environment, then install a built or downloaded wheel:
82
82
  ```bash
83
83
  python3 -m venv .venv
84
84
  . .venv/bin/activate
85
- python -m pip install ./engineering_argument_language-3.2.3-py3-none-any.whl
85
+ python -m pip install ./engineering_argument_language-3.2.4-py3-none-any.whl
86
86
  eal --help
87
87
  ```
88
88
 
89
- After the maintainer creates the `v3.2.3` release tag, a pinned source installation is also available:
89
+ After the maintainer creates the `v3.2.4` release tag, a pinned source installation is also available:
90
90
 
91
91
  ```bash
92
92
  python -m pip install \
93
- 'engineering-argument-language @ git+https://github.com/emmett08/earl.git@v3.2.3'
93
+ 'engineering-argument-language @ git+https://github.com/emmett08/earl.git@v3.2.4'
94
94
  ```
95
95
 
96
- PyPI installation becomes available when that version is published: `python -m pip install 'engineering-argument-language==3.2.3'`. See [packaging and releases](https://github.com/emmett08/earl/blob/main/docs/packaging.md) for artefact verification, supported Python imports and publication setup. Command collectors and custom reasoning methods require a POSIX host; the release workflow is configured to check distribution installation on Linux and macOS.
96
+ PyPI installation becomes available when that version is published: `python -m pip install 'engineering-argument-language==3.2.4'`. See [packaging and releases](https://github.com/emmett08/earl/blob/main/docs/packaging.md) for artefact verification, supported Python imports and publication setup. Command collectors and custom reasoning methods require a POSIX host; the release workflow is configured to check distribution installation on Linux and macOS.
97
97
 
98
98
  Original EARL software is available under the [Unlicense](https://github.com/emmett08/earl/blob/main/LICENSE), permitting commercial and non-commercial use, modification and redistribution. Dependencies and any third-party material retain their own terms; see [licence scope](https://github.com/emmett08/earl/blob/main/docs/packaging.md#licence-scope).
99
99
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  EAL/3 records engineering claims, their evidence requirements, reasoning methods, assumptions and objections in reusable source files. A Python host binds declared tools to a separate TOML configuration, collects observations, assesses claims and stores the result. Later sessions and different models can find the same source and reuse compatible observations until they expire.
4
4
 
5
- The Python distribution is **`engineering-argument-language` 3.2.3** and requires Python **3.11 or later**; application code imports `eal`. The supported source language is `EAL/3`, with newline-terminated fields and typed flows. Stored tool results use `EAL/observation-record/1`; model-facing summaries use `EAL/assessment-packet/2`.
5
+ The Python distribution is **`engineering-argument-language` 3.2.4** and requires Python **3.11 or later**; application code imports `eal`. The supported source language is `EAL/3`, with newline-terminated fields and typed flows. Stored tool results use `EAL/observation-record/1`; model-facing summaries use `EAL/assessment-packet/2`.
6
6
 
7
7
  ## Author a bounded argument
8
8
 
@@ -43,18 +43,18 @@ Create a virtual environment, then install a built or downloaded wheel:
43
43
  ```bash
44
44
  python3 -m venv .venv
45
45
  . .venv/bin/activate
46
- python -m pip install ./engineering_argument_language-3.2.3-py3-none-any.whl
46
+ python -m pip install ./engineering_argument_language-3.2.4-py3-none-any.whl
47
47
  eal --help
48
48
  ```
49
49
 
50
- After the maintainer creates the `v3.2.3` release tag, a pinned source installation is also available:
50
+ After the maintainer creates the `v3.2.4` release tag, a pinned source installation is also available:
51
51
 
52
52
  ```bash
53
53
  python -m pip install \
54
- 'engineering-argument-language @ git+https://github.com/emmett08/earl.git@v3.2.3'
54
+ 'engineering-argument-language @ git+https://github.com/emmett08/earl.git@v3.2.4'
55
55
  ```
56
56
 
57
- PyPI installation becomes available when that version is published: `python -m pip install 'engineering-argument-language==3.2.3'`. See [packaging and releases](https://github.com/emmett08/earl/blob/main/docs/packaging.md) for artefact verification, supported Python imports and publication setup. Command collectors and custom reasoning methods require a POSIX host; the release workflow is configured to check distribution installation on Linux and macOS.
57
+ PyPI installation becomes available when that version is published: `python -m pip install 'engineering-argument-language==3.2.4'`. See [packaging and releases](https://github.com/emmett08/earl/blob/main/docs/packaging.md) for artefact verification, supported Python imports and publication setup. Command collectors and custom reasoning methods require a POSIX host; the release workflow is configured to check distribution installation on Linux and macOS.
58
58
 
59
59
  Original EARL software is available under the [Unlicense](https://github.com/emmett08/earl/blob/main/LICENSE), permitting commercial and non-commercial use, modification and redistribution. Dependencies and any third-party material retain their own terms; see [licence scope](https://github.com/emmett08/earl/blob/main/docs/packaging.md#licence-scope).
60
60
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  `argumentation/aspic/2` is a bounded, host-installed ASPIC+ instantiation. It constructs arguments from an explicit finite theory, derives undermining, rebutting and undercutting defeats, and computes grounded, preferred or stable extensions with a separate credulous or sceptical conclusion query. The separate, opt-in `EAL/3-compiled-aspic/5` operation translates authored EAL routes at a checked observation snapshot. EAL/3 admits reviewed `strict`, `rank`, `contrary` and `prefer` relations with targets resolved through its own declaration namespace. The default authored evaluator validates these directives without applying their inference effects. The [ASPIC+ tutorial](sources.md#argument-and-reasoning-models) supplies the framework's argument, attack and defeat definitions; the restrictions and ranking below are this implementation's choices.
4
4
 
5
- The Python package is 3.2.3. The compiled profile is `/5`, while the installed ASPIC method is `argumentation/aspic/2` with implementation `eal-aspic-finite-5`. Stored observations retain acquisition identities and original measurement times; returned records contain output digests and byte counts without raw process streams.
5
+ The Python package is 3.2.4. The compiled profile is `/5`, while the installed ASPIC method is `argumentation/aspic/2` with implementation `eal-aspic-finite-5`. Stored observations retain acquisition identities and original measurement times; returned records contain output digests and byte counts without raw process streams.
6
6
 
7
7
  ## Run the synthetic engineering case
8
8
 
@@ -1,6 +1,6 @@
1
1
  # Scoped composition in EAL/3
2
2
 
3
- EAL/3 package 3.2.3 retains the typed evidence, assumption, reasoning, claim, argument, objection, proposition and reviewed-directive mappings. ANTLR recognition is followed by lexical binding, hygienic expansion, typed validation, local method evaluation and a separately selected argument calculus. [The syntax comparison](eal3-syntax-comparison.md) shows original-to-EAL/3 structural mappings. [EAL.g4](../grammar/EAL.g4) is the complete grammar; generated recognisers are committed and checked against ANTLR 4.13.2.
3
+ EAL/3 package 3.2.4 retains the typed evidence, assumption, reasoning, claim, argument, objection, proposition and reviewed-directive mappings. ANTLR recognition is followed by lexical binding, hygienic expansion, typed validation, local method evaluation and a separately selected argument calculus. [The syntax comparison](eal3-syntax-comparison.md) shows original-to-EAL/3 structural mappings. [EAL.g4](../grammar/EAL.g4) is the complete grammar; generated recognisers are committed and checked against ANTLR 4.13.2.
4
4
 
5
5
  ## Names, modules and source imports
6
6
 
@@ -15,7 +15,7 @@ This explains the design of the EAL/3 source language. Syntax, the argument solv
15
15
 
16
16
  ## Purpose and extension criterion
17
17
 
18
- EAL/3 is the semantic source contract, `EAL/3` identifies the current newline-based notation, and the installed Python package declares version 3.2.3. Formal reasoning-method inputs use `EAL/typed-input/1`. Source version, package version, acquisition fields, typed-method input envelope and method identifiers name different contracts. Model summaries use `EAL/assessment-packet/2` and `EAL/model-context/2`; the observation-record schema remains `/1`.
18
+ EAL/3 is the semantic source contract, `EAL/3` identifies the current newline-based notation, and the installed Python package declares version 3.2.4. Formal reasoning-method inputs use `EAL/typed-input/1`. Source version, package version, acquisition fields, typed-method input envelope and method identifiers name different contracts. Model summaries use `EAL/assessment-packet/2` and `EAL/model-context/2`; the observation-record schema remains `/1`.
19
19
 
20
20
  The service keeps validated EAL/3 source, claim identity, compatible tool observations and checked reasoning results available across sessions and model providers. A developer can request a registered claim without sending the source, reconstructing its dependency graph or rerunning unexpired observations. A gain in correctness, time or cost remains a **hypothesis** to measure. The maintained [API load-test example](../examples/api-load-test/README.md) establishes an execution path using synthetic data.
21
21
 
@@ -139,7 +139,7 @@ JSON
139
139
 
140
140
  Add `--token-env EAL_MCP_TOKEN` for an authenticated endpoint. A configured `http` transport also connects to an existing server, using the configured host, port and path; a wildcard bind such as `0.0.0.0` requires an explicit client `--url`. An explicit URL overrides the configured transport. The server's launch configuration fixes its workspace, methods and tool exposure. The host validates the flat request and the discovered input schema before invoking the remote operation. The MCP client negotiates a supported protocol profile; EAL operation identities and persisted assessment bindings are independent of that profile.
141
141
 
142
- The host returns one JSON response. Credential sanitisation preserves its field names and public envelope metadata (`operation`, `protocol_version`, `is_error` and content-block `type`), while replacing credential occurrences in application string values and diagnostic text with `[redacted]`. JSON encoded within content text is decoded before sanitisation so its field names also remain stable. A credential may share its spelling with a public field name; preserving that name maintains the response contract.
142
+ The host returns one JSON response. Credential sanitisation preserves the fixed host envelope fields and the content-block fields declared by the pinned MCP SDK. Public envelope metadata (`operation`, `protocol_version`, `is_error`) and recognised content-block `type` values remain stable. Application object keys, string values, extra wrapper fields and diagnostic text replace credential occurrences with `[redacted]`, including application keys whose spelling matches a public field name. JSON encoded within text is decoded before sanitisation, including escaped keys and nested JSON strings. Text beginning with a JSON object, array or quoted string that fails strict decoding is replaced in full because its escapes cannot be safely retained. An empty string is used when the replacement marker or its surrounding text would disclose the credential. When redaction would merge distinct object keys, the host returns one error response with exit code 2 and emits no partial application result.
143
143
 
144
144
  `--timeout SECONDS` sets the host's total MCP-session deadline, defaulting to 120 seconds. In the stdio route, ending the owned server process signals its command supervisor to stop the collector group; the inherited acquisition lease remains held until cleanup finishes. An HTTP host connects to an independently running server, so its session deadline ends that client interaction. The server continues to enforce acquisition ownership and configured collector timeouts.
145
145
 
@@ -28,7 +28,7 @@ Registered exposure requires a non-empty entry allowlist and uses those entries'
28
28
 
29
29
  The HTTP runner explicitly enables strict Host/Origin protection. FastMCP accepts its loopback host defaults, the configured host, the actual bound address and configured host additions. It accepts same-origin requests and loopback origins on loopback requests, plus configured origin additions. Untrusted headers are rejected before MCP handling. Host/Origin trust lists contain up to 128 unique literal entries each; their validation rejects wildcards. Browser CORS response headers remain a separate deployment setting.
30
30
 
31
- The HTTP client constructs `BearerAuth` explicitly, keeping credentials opaque instead of interpreting token spellings as authentication modes. Host sanitisation keeps public JSON field names and envelope metadata stable and redacts application string values and diagnostic text. It parses JSON-bearing content text before redacting values, preserving the same structure in structured and text representations.
31
+ The HTTP client constructs `BearerAuth` explicitly, keeping credentials opaque instead of interpreting token spellings as authentication modes. Host sanitisation preserves fixed envelope fields and the content-block fields declared by the pinned MCP SDK, together with public envelope metadata and recognised content discriminators. Application object keys and string values are remote data and are sanitised recursively, including JSON encoded within content text. Extra wrapper fields receive the same treatment. Strictly undecodable JSON-looking text is replaced in full; object-key collisions caused by redaction return an error instead of overwriting a value. Structured and text representations use the same application-data sanitiser.
32
32
 
33
33
  ## Execution and verification scope
34
34
 
@@ -1,6 +1,6 @@
1
1
  # Packaging and releases
2
2
 
3
- The Python distribution is `engineering-argument-language` version `3.2.3`; its import package is `eal`. It supplies the Python API, the `eal`, `eal-mcp` and `eal-host` commands, and one FastMCP server configurable for stdio or Streamable HTTP. Python 3.11 or later is required. Runtime dependencies are declared in [pyproject.toml](../pyproject.toml) and installed by pip; development dependencies are separate.
3
+ The Python distribution is `engineering-argument-language` version `3.2.4`; its import package is `eal`. It supplies the Python API, the `eal`, `eal-mcp` and `eal-host` commands, and one FastMCP server configurable for stdio or Streamable HTTP. Python 3.11 or later is required. Runtime dependencies are declared in [pyproject.toml](../pyproject.toml) and installed by pip; development dependencies are separate.
4
4
 
5
5
  ## Install a distribution
6
6
 
@@ -9,14 +9,14 @@ Use a virtual environment. The commands below use a POSIX shell:
9
9
  ```bash
10
10
  python3 -m venv .venv
11
11
  . .venv/bin/activate
12
- python -m pip install ./engineering_argument_language-3.2.3-py3-none-any.whl
12
+ python -m pip install ./engineering_argument_language-3.2.4-py3-none-any.whl
13
13
  python -m pip check
14
14
  eal --help
15
15
  eal-mcp --help
16
16
  eal-host --help
17
17
  ```
18
18
 
19
- Supply the path to a downloaded workflow artefact or a wheel built from the reviewed source. A downloaded workflow archive includes `dist/` and `SHA256SUMS`; from its extracted root, run `shasum -a 256 --check SHA256SUMS` before installing a file under `dist/`. A source distribution can be installed with `python -m pip install ./engineering_argument_language-3.2.3.tar.gz`; pip installs the build requirements and builds its wheel. The committed generated ANTLR parser makes Java unnecessary for ordinary installation and parsing.
19
+ Supply the path to a downloaded workflow artefact or a wheel built from the reviewed source. A downloaded workflow archive includes `dist/` and `SHA256SUMS`; from its extracted root, run `shasum -a 256 --check SHA256SUMS` before installing a file under `dist/`. A source distribution can be installed with `python -m pip install ./engineering_argument_language-3.2.4.tar.gz`; pip installs the build requirements and builds its wheel. The committed generated ANTLR parser makes Java unnecessary for ordinary installation and parsing.
20
20
 
21
21
  For a reviewed GitHub revision, substitute its full commit SHA for `FULL_COMMIT_SHA`:
22
22
 
@@ -29,13 +29,13 @@ Git must be installed for this route. A pinned tag can replace the commit SHA af
29
29
 
30
30
  ```bash
31
31
  python -m pip install \
32
- 'engineering-argument-language @ git+https://github.com/emmett08/earl.git@v3.2.3'
32
+ 'engineering-argument-language @ git+https://github.com/emmett08/earl.git@v3.2.4'
33
33
  ```
34
34
 
35
- The tag command requires an existing `v3.2.3` tag. PyPI installation requires publication of that version; once published, use:
35
+ The tag command requires an existing `v3.2.4` tag. PyPI installation requires publication of that version; once published, use:
36
36
 
37
37
  ```bash
38
- python -m pip install 'engineering-argument-language==3.2.3'
38
+ python -m pip install 'engineering-argument-language==3.2.4'
39
39
  ```
40
40
 
41
41
  The wheel is pure Python. Command collectors require POSIX process groups and file descriptors; bounded custom reasoning methods require POSIX resource limits. The release workflow is configured to check distribution installation on Linux with Python 3.11–3.14 and macOS with Python 3.12. Other Python/platform combinations require separate validation for the features used. Workspace coordination covers participating processes on one local filesystem; distributed replicas and network filesystems require another coordinator. See [MCP and tools](mcp-and-tools.md) for execution limits and [MCP architecture](mcp-architecture.md) for acquisition ownership.
@@ -81,7 +81,7 @@ canonical_source = format_source(source)
81
81
 
82
82
  This example checks a declaration's syntax and references. An assessment needs its authored support routes and observations. Private helpers, generated-parser classes and database tables are implementation details; integration code uses the documented interfaces. Pin a reviewed package release and consult the current contract before upgrading. This project develops the current EAL/3 language without a backwards-compatibility guarantee.
83
83
 
84
- Package `3.2.3` identifies this distributed implementation. `EAL/3` identifies source syntax and semantics. Schema identifiers describe different records: observations use `EAL/observation-record/1`, assessment packets use `EAL/assessment-packet/2`, and model messages use `EAL/model-context/2`. A packaging change does not itself revise those language or record contracts.
84
+ Package `3.2.4` identifies this distributed implementation. `EAL/3` identifies source syntax and semantics. Schema identifiers describe different records: observations use `EAL/observation-record/1`, assessment packets use `EAL/assessment-packet/2`, and model messages use `EAL/model-context/2`. A packaging change does not itself revise those language or record contracts.
85
85
 
86
86
  ## Licence scope
87
87
 
@@ -128,26 +128,26 @@ Each publishing job receives `id-token: write` at job level. The PyPA action aut
128
128
 
129
129
  The initial release procedure is:
130
130
 
131
- 1. Merge the reviewed packaging change. Ensure `pyproject.toml` and `eal.__version__` agree on `3.2.3`, then create `v3.2.3` at that reviewed commit on `main`.
131
+ 1. Merge the reviewed packaging change. Ensure `pyproject.toml` and `eal.__version__` agree on `3.2.4`, then create `v3.2.4` at that reviewed commit on `main`.
132
132
  2. Register the production Trusted Publisher with the exact identity above. Configure the repository environment `pypi.org` to permit release tags and apply any required deployment reviewers. For optional TestPyPI publication, register its separate Trusted Publisher and configure the `testpypi` environment's deployment rules. Each package index uses a pending publisher for a new project or a normal publisher for an existing project.
133
- 3. Dispatch the workflow from the `v3.2.3` tag, with `release_tag=v3.2.3` and `destination=verify`, using the GitHub CLI command below. The workflow must first exist on the default branch. It requires a stable `vMAJOR.MINOR.PATCH` tag, checks its resolved commit and package version, and requires that commit to belong to `main`'s history.
133
+ 3. Dispatch the workflow from the `v3.2.4` tag, with `release_tag=v3.2.4` and `destination=verify`, using the GitHub CLI command below. The workflow must first exist on the default branch. It requires a stable `vMAJOR.MINOR.PATCH` tag, checks its resolved commit and package version, and requires that commit to belong to `main`'s history.
134
134
  4. Review the full check and artefact installation results, and download the retained wheel and source distribution. If TestPyPI is configured, dispatch from the same tag with `destination=testpypi` to exercise its publication path and check that release.
135
135
  5. Dispatch from the same tag with `destination=pypi` to publish the production release. Publication begins after all required verification jobs and the `pypi.org` environment's deployment rules pass.
136
136
 
137
137
  Dispatch verification with the matching tag ref and input:
138
138
 
139
139
  ```bash
140
- gh workflow run publish.yml --repo emmett08/earl --ref v3.2.3 \
141
- -f release_tag=v3.2.3 -f destination=verify
140
+ gh workflow run publish.yml --repo emmett08/earl --ref v3.2.4 \
141
+ -f release_tag=v3.2.4 -f destination=verify
142
142
  ```
143
143
 
144
144
  After verification and authentication setup, dispatch the optional TestPyPI release and the production PyPI release:
145
145
 
146
146
  ```bash
147
- gh workflow run publish.yml --repo emmett08/earl --ref v3.2.3 \
148
- -f release_tag=v3.2.3 -f destination=testpypi
149
- gh workflow run publish.yml --repo emmett08/earl --ref v3.2.3 \
150
- -f release_tag=v3.2.3 -f destination=pypi
147
+ gh workflow run publish.yml --repo emmett08/earl --ref v3.2.4 \
148
+ -f release_tag=v3.2.4 -f destination=testpypi
149
+ gh workflow run publish.yml --repo emmett08/earl --ref v3.2.4 \
150
+ -f release_tag=v3.2.4 -f destination=pypi
151
151
  ```
152
152
 
153
153
  The release workflow is configured to produce exactly one wheel and one source distribution with a SHA-256 checksum file. Linux and macOS installation jobs verify those artefacts; the publishing job verifies the checksum and consumes the same build's retained artefacts by immutable upload ID. Both publishing jobs run without checking out or installing the package. Only the publishing jobs receive `id-token: write`; build and verification jobs have read-only repository permissions. Each package index's Trusted Publisher registration must match the publishing job's repository, workflow and environment identity.
@@ -157,9 +157,9 @@ To check a published TestPyPI wheel while resolving dependencies through ordinar
157
157
  ```bash
158
158
  python -m pip download --no-deps --only-binary=:all: \
159
159
  --index-url https://test.pypi.org/simple/ --dest test-release \
160
- 'engineering-argument-language==3.2.3'
160
+ 'engineering-argument-language==3.2.4'
161
161
  python -m pip install \
162
- ./test-release/engineering_argument_language-3.2.3-py3-none-any.whl
162
+ ./test-release/engineering_argument_language-3.2.4-py3-none-any.whl
163
163
  python -m pip check
164
164
  ```
165
165
 
@@ -117,7 +117,7 @@ JSON
117
117
 
118
118
  The result describes EAL/3 and includes `engineering/api-load-criteria/1`. Subsequent requests can use `validate`, `collect`, `reason`, `explain` and `compile_aspic` with their documented fields. In the stdio route, `eal-host --config examples/api-load-test/mcp.toml` launches its subprocess with the same service settings. Each server process selects one transport; the database and observation identities remain shared when both launches use this local workspace.
119
119
 
120
- The example binds HTTP to loopback and uses operator exposure. Host and Origin validation is always enabled. Configure a named token environment variable for authenticated HTTP; a non-loopback bind or an additional non-loopback trust entry requires it. Public proxies need their client-facing hostname in `allowed_hosts`, and a trusted browser application on a separate origin needs its HTTP(S) origin in `allowed_origins`. The supplied configuration includes commented examples. [MCP and tools](../../docs/mcp-and-tools.md) documents precedence, access scope and concurrency. Shared local launches coordinate initial database setup, and command supervision retains acquisition exclusion through collector cleanup if an owned stdio server stops. HTTP serving changes how clients reach the synthetic assessment; its availability supplies no measurements of production performance.
120
+ The example binds HTTP to loopback and uses operator exposure. Host and Origin validation is always enabled. Configure a named token environment variable for authenticated HTTP; a non-loopback bind or an additional non-loopback trust entry requires it. Public proxies need their client-facing hostname in `allowed_hosts`, and a trusted browser application on a separate origin needs its HTTP(S) origin in `allowed_origins`. The supplied configuration includes commented examples. The host sanitises credential occurrences in application object keys and string values, including JSON encoded within content text, while retaining fixed response wrappers. A collision between sanitised keys produces an error instead of discarding a measurement. [MCP and tools](../../docs/mcp-and-tools.md) documents precedence, access scope and concurrency. Shared local launches coordinate initial database setup, and command supervision retains acquisition exclusion through collector cleanup if an owned stdio server stops. HTTP serving changes how clients reach the synthetic assessment; its availability supplies no measurements of production performance.
121
121
 
122
122
  ## Reuse the registered argument across sessions
123
123
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "engineering-argument-language"
7
- version = "3.2.3"
7
+ version = "3.2.4"
8
8
  description = "An ANTLR4 language and MCP interpreter for engineering reasoning and argumentation"
9
9
  readme = "README.md"
10
10
  license = "Unlicense"
@@ -14,6 +14,7 @@ import time
14
14
 
15
15
  import eal
16
16
  from eal.formatter import format_source
17
+ from eal.host_redaction import sanitise_response
17
18
  from eal.knowledge import EALKnowledgeBase, ModelContextAdapter
18
19
  from eal.parser import parse
19
20
  from eal.runtime import ReasoningService
@@ -108,6 +109,19 @@ def main() -> None:
108
109
  assert Path(eal.__file__).resolve().is_relative_to(Path(sys.prefix).resolve()), eal.__file__
109
110
  assert eal.__version__ == arguments.expected_version
110
111
  assert importlib.metadata.version("engineering-argument-language") == arguments.expected_version
112
+ token = 'synthetic\\"bearer-key'
113
+ payload = {"nested": [{token: token}]}
114
+ sanitised = sanitise_response(
115
+ {"result": payload, "content": [{"type": "text", "text": json.dumps(payload)}]}, token,
116
+ )
117
+ assert sanitised["result"] == {"nested": [{"[redacted]": "[redacted]"}]}
118
+ assert json.loads(sanitised["content"][0]["text"]) == sanitised["result"]
119
+ try:
120
+ sanitise_response({"result": {token: "first", "[redacted]": "second"}}, token)
121
+ except ValueError as exc:
122
+ assert token not in str(exc)
123
+ else:
124
+ raise AssertionError("Installed redactor silently merged object keys")
111
125
  assert validate(parse(SOURCE)) == []
112
126
  assert validate(parse(format_source(SOURCE))) == []
113
127
 
@@ -1,3 +1,3 @@
1
1
  """Engineering Argument Language: explicit, revisable engineering reasoning."""
2
2
 
3
- __version__ = "3.2.3"
3
+ __version__ = "3.2.4"
@@ -0,0 +1,90 @@
1
+ """Sanitise remote JSON keys and values while retaining fixed host wrappers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from typing import Any
7
+
8
+ from mcp.types import AudioContent, EmbeddedResource, ImageContent, ResourceLink, TextContent
9
+
10
+ from .tool_acquisition import strict_json
11
+
12
+
13
+ _HOST_FIELDS = frozenset({"operation", "protocol_version", "is_error", "result", "content", "error"})
14
+ _HOST_METADATA = frozenset({"operation", "protocol_version", "is_error"})
15
+ # Only fields declared by the pinned MCP models are public wrapper names.
16
+ # Extra fields and keys inside application payloads remain remote data.
17
+ _CONTENT_FIELDS = {
18
+ model.model_fields["type"].default: frozenset(model.model_fields) | frozenset(
19
+ field.alias for field in model.model_fields.values() if field.alias
20
+ )
21
+ for model in (TextContent, ImageContent, AudioContent, ResourceLink, EmbeddedResource)
22
+ }
23
+
24
+
25
+ def _replacement(token: str) -> str:
26
+ # An opaque credential may itself be the conventional marker or part of it.
27
+ return "" if token in "[redacted]" else "[redacted]"
28
+
29
+
30
+ def _redact_text(value: str, token: str) -> str:
31
+ sanitised = value.replace(token, _replacement(token))
32
+ # Adjacent text can reconstruct the credential around a replacement marker.
33
+ return "" if token in sanitised else sanitised
34
+
35
+
36
+ def _redact_object(value: dict[str, Any], token: str, *, public_keys: frozenset[str] = frozenset(),
37
+ public_values: frozenset[str] = frozenset()) -> dict[str, Any]:
38
+ sanitised = {}
39
+ for key, item in value.items():
40
+ field = key if key in public_keys else _redact_text(key, token)
41
+ if field in sanitised:
42
+ raise ValueError("Credential redaction would merge distinct JSON object keys")
43
+ sanitised[field] = item if key in public_values else _redact(item, token)
44
+ return sanitised
45
+
46
+
47
+ def _redact(value: Any, token: str) -> Any:
48
+ """Decode nested JSON representations before sanitising application data."""
49
+ if isinstance(value, str):
50
+ try:
51
+ decoded = strict_json(value)
52
+ except ValueError:
53
+ # Unsafe JSON (including duplicate keys) can conceal an escaped
54
+ # credential. Preserve no partially sanitised representation.
55
+ if value.lstrip().startswith(("{", "[", '"')):
56
+ return _replacement(token)
57
+ decoded = None
58
+ if isinstance(decoded, (dict, list, str)):
59
+ sanitised = _redact(decoded, token)
60
+ if sanitised == decoded:
61
+ return value
62
+ return json.dumps(sanitised, ensure_ascii=False, allow_nan=False)
63
+ return _redact_text(value, token)
64
+ if isinstance(value, list):
65
+ return [_redact(item, token) for item in value]
66
+ if isinstance(value, dict):
67
+ return _redact_object(value, token)
68
+ return value
69
+
70
+
71
+ def sanitise_response(response: dict[str, Any], token: str | None) -> dict[str, Any]:
72
+ """Keep fixed wrappers stable; refuse redaction that would merge object keys."""
73
+ if not token:
74
+ return response
75
+ content = response.get("content")
76
+ public_values = _HOST_METADATA | {"content"} if isinstance(content, list) else _HOST_METADATA
77
+ sanitised = _redact_object(response, token, public_keys=_HOST_FIELDS, public_values=public_values)
78
+ if isinstance(content, list):
79
+ sanitised["content"] = []
80
+ for block in content:
81
+ if isinstance(block, dict):
82
+ kind = block.get("type")
83
+ fields = _CONTENT_FIELDS.get(kind) if isinstance(kind, str) else None
84
+ sanitised["content"].append(_redact_object(
85
+ block, token, public_keys=fields or frozenset({"type"}),
86
+ public_values=frozenset({"type"}) if fields else frozenset(),
87
+ ))
88
+ else:
89
+ sanitised["content"].append(_redact(block, token))
90
+ return sanitised
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: engineering-argument-language
3
- Version: 3.2.3
3
+ Version: 3.2.4
4
4
  Summary: An ANTLR4 language and MCP interpreter for engineering reasoning and argumentation
5
5
  Author: Emmett Miller
6
6
  Maintainer: Emmett Miller
@@ -41,7 +41,7 @@ Dynamic: license-file
41
41
 
42
42
  EAL/3 records engineering claims, their evidence requirements, reasoning methods, assumptions and objections in reusable source files. A Python host binds declared tools to a separate TOML configuration, collects observations, assesses claims and stores the result. Later sessions and different models can find the same source and reuse compatible observations until they expire.
43
43
 
44
- The Python distribution is **`engineering-argument-language` 3.2.3** and requires Python **3.11 or later**; application code imports `eal`. The supported source language is `EAL/3`, with newline-terminated fields and typed flows. Stored tool results use `EAL/observation-record/1`; model-facing summaries use `EAL/assessment-packet/2`.
44
+ The Python distribution is **`engineering-argument-language` 3.2.4** and requires Python **3.11 or later**; application code imports `eal`. The supported source language is `EAL/3`, with newline-terminated fields and typed flows. Stored tool results use `EAL/observation-record/1`; model-facing summaries use `EAL/assessment-packet/2`.
45
45
 
46
46
  ## Author a bounded argument
47
47
 
@@ -82,18 +82,18 @@ Create a virtual environment, then install a built or downloaded wheel:
82
82
  ```bash
83
83
  python3 -m venv .venv
84
84
  . .venv/bin/activate
85
- python -m pip install ./engineering_argument_language-3.2.3-py3-none-any.whl
85
+ python -m pip install ./engineering_argument_language-3.2.4-py3-none-any.whl
86
86
  eal --help
87
87
  ```
88
88
 
89
- After the maintainer creates the `v3.2.3` release tag, a pinned source installation is also available:
89
+ After the maintainer creates the `v3.2.4` release tag, a pinned source installation is also available:
90
90
 
91
91
  ```bash
92
92
  python -m pip install \
93
- 'engineering-argument-language @ git+https://github.com/emmett08/earl.git@v3.2.3'
93
+ 'engineering-argument-language @ git+https://github.com/emmett08/earl.git@v3.2.4'
94
94
  ```
95
95
 
96
- PyPI installation becomes available when that version is published: `python -m pip install 'engineering-argument-language==3.2.3'`. See [packaging and releases](https://github.com/emmett08/earl/blob/main/docs/packaging.md) for artefact verification, supported Python imports and publication setup. Command collectors and custom reasoning methods require a POSIX host; the release workflow is configured to check distribution installation on Linux and macOS.
96
+ PyPI installation becomes available when that version is published: `python -m pip install 'engineering-argument-language==3.2.4'`. See [packaging and releases](https://github.com/emmett08/earl/blob/main/docs/packaging.md) for artefact verification, supported Python imports and publication setup. Command collectors and custom reasoning methods require a POSIX host; the release workflow is configured to check distribution installation on Linux and macOS.
97
97
 
98
98
  Original EARL software is available under the [Unlicense](https://github.com/emmett08/earl/blob/main/LICENSE), permitting commercial and non-commercial use, modification and redistribution. Dependencies and any third-party material retain their own terms; see [licence scope](https://github.com/emmett08/earl/blob/main/docs/packaging.md#licence-scope).
99
99
 
@@ -300,6 +300,7 @@ tests/test_frontend_contract_review.py
300
300
  tests/test_host.py
301
301
  tests/test_host_credentials.py
302
302
  tests/test_host_limits.py
303
+ tests/test_host_redaction.py
303
304
  tests/test_http_origin.py
304
305
  tests/test_investigation_improvements.py
305
306
  tests/test_knowledge.py
@@ -38,16 +38,16 @@ async def invoke_host(url: str, token: str, source: str, workspace: Path):
38
38
 
39
39
 
40
40
  @pytest.mark.parametrize("token", ["oauth", "is_error", "result", "operation", "validate", "text"])
41
- def test_http_host_preserves_envelope_and_nested_schema_on_success_and_tool_failure(tmp_path, token):
41
+ def test_http_host_preserves_envelope_and_redacts_remote_keys_on_success_and_tool_failure(tmp_path, token):
42
42
  class CredentialEchoService(ReasoningService):
43
43
  def validate(self, source):
44
44
  if source == "failure":
45
45
  raise ValueError("Remote diagnostic echoed credential=" + token)
46
46
  return {
47
47
  "valid": True,
48
- "result": {"operation": token, "is_error": False,
49
- "nested": [{"result": token}]},
50
- "encoded": json.dumps({"result": {"operation": token}}),
48
+ "echoes": {token: "key echo", "secret": token,
49
+ "nested": [{"prefix-" + token + "-suffix": token}]},
50
+ "encoded": json.dumps({token: token}),
51
51
  }
52
52
 
53
53
  server = create_server(CredentialEchoService(tmp_path), auth=BearerTokenVerifier(token))
@@ -63,12 +63,12 @@ def test_http_host_preserves_envelope_and_nested_schema_on_success_and_tool_fail
63
63
  assert response["is_error"] is False
64
64
  expected = {
65
65
  "valid": True,
66
- "result": {"operation": "[redacted]", "is_error": False,
67
- "nested": [{"result": "[redacted]"}]},
66
+ "echoes": {"[redacted]": "key echo", "secret": "[redacted]",
67
+ "nested": [{"prefix-[redacted]-suffix": "[redacted]"}]},
68
68
  }
69
69
  payload = response["result"]
70
70
  assert {key: payload[key] for key in expected} == expected
71
- assert json.loads(payload["encoded"]) == {"result": {"operation": "[redacted]"}}
71
+ assert json.loads(payload["encoded"]) == {"[redacted]": "[redacted]"}
72
72
  for block in response["content"]:
73
73
  if block["type"] == "text":
74
74
  assert json.loads(block["text"]) == payload
@@ -104,15 +104,18 @@ def test_http_host_preserves_failure_envelope_without_disclosing_credential(tmp_
104
104
  asyncio.run(exercise())
105
105
 
106
106
 
107
- @pytest.mark.parametrize("token", ["operation", "is_error", "result", "2026-07-28"])
108
- def test_public_response_metadata_is_stable_when_it_coincides_with_a_credential(token):
107
+ @pytest.mark.parametrize(("token", "application_key"), [
108
+ ("operation", "result"), ("is_error", "result"),
109
+ ("result", "[redacted]"), ("2026-07-28", "result"),
110
+ ])
111
+ def test_public_response_metadata_is_stable_when_it_coincides_with_a_credential(token, application_key):
109
112
  response = {"operation": "operation", "protocol_version": "2026-07-28",
110
113
  "is_error": False, "result": {"result": token}}
111
114
  sanitised = sanitise_response(response, token)
112
115
  assert sanitised["operation"] == response["operation"]
113
116
  assert sanitised["protocol_version"] == response["protocol_version"]
114
117
  assert sanitised["is_error"] is False
115
- assert sanitised["result"] == {"result": "[redacted]"}
118
+ assert sanitised["result"] == {application_key: "[redacted]"}
116
119
 
117
120
 
118
121
  def test_json_text_decodes_escaped_credentials_before_value_redaction():
@@ -130,7 +133,30 @@ def test_json_string_text_decodes_escaped_credentials_before_value_redaction():
130
133
  assert json.loads(sanitised["content"][0]["text"]) == "[redacted]"
131
134
 
132
135
 
133
- def test_json_text_with_only_a_schema_key_collision_keeps_its_representation():
136
+ def test_json_text_redacts_an_application_key_even_when_it_matches_a_public_field():
134
137
  encoded = '{\n "result": true\n}'
135
138
  response = {"content": [{"type": "text", "text": encoded}]}
136
- assert sanitise_response(response, "result") == response
139
+ sanitised = sanitise_response(response, "result")
140
+ assert json.loads(sanitised["content"][0]["text"]) == {"[redacted]": True}
141
+
142
+
143
+ def test_http_host_refuses_key_collisions_without_emitting_partial_results(tmp_path):
144
+ token = "synthetic-collision-token"
145
+
146
+ class CollidingService(ReasoningService):
147
+ def validate(self, source):
148
+ return {token: "first", "[redacted]": "second"}
149
+
150
+ server = create_server(CollidingService(tmp_path), auth=BearerTokenVerifier(token))
151
+
152
+ async def exercise():
153
+ async with run_server_async(server) as url:
154
+ completed = await invoke_host(url, token, "success", tmp_path)
155
+ assert completed.returncode == 2
156
+ assert token not in completed.stdout
157
+ assert json.loads(completed.stdout) == {
158
+ "is_error": True,
159
+ "error": "Credential redaction would merge distinct JSON object keys",
160
+ }
161
+
162
+ asyncio.run(exercise())