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.
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/CONTRACT.md +2 -2
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/PKG-INFO +6 -6
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/README.md +5 -5
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/aspic-method.md +1 -1
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/eal3-composition.md +1 -1
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/eal3-design.md +1 -1
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/mcp-and-tools.md +1 -1
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/mcp-architecture.md +1 -1
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/packaging.md +17 -17
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/README.md +1 -1
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/pyproject.toml +1 -1
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/scripts/distribution_smoke.py +14 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/__init__.py +1 -1
- engineering_argument_language-3.2.4/src/eal/host_redaction.py +90 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/engineering_argument_language.egg-info/PKG-INFO +6 -6
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/engineering_argument_language.egg-info/SOURCES.txt +1 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_host_credentials.py +38 -12
- engineering_argument_language-3.2.4/tests/test_host_redaction.py +128 -0
- engineering_argument_language-3.2.3/src/eal/host_redaction.py +0 -51
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/.github/workflows/experiment-stage.yml +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/.github/workflows/experiment.yml +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/.github/workflows/publish.yml +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/.github/workflows/test.yml +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/.github/workflows/verify.yml +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/AGENTS.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/LICENSE +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/MANIFEST.in +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/Makefile +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/argument-model.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/argument-reconstruction.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/argument-service.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/aspic-view-v1.schema.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/aspic-view.schema.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/design-aim.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/eal3-experiment-methodology.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/eal3-syntax-comparison.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/grounded-reasoning.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/language.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/reasoning-modes.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/sources.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/vocabulary.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/aspic-compiled.eal +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/aspic-fixture.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/aspic-source.eal +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/aspic-tools.toml +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/aspic_compiled_demo.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/aspic_demo.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/aspic_fixture_collector.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/collect_results.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/mcp.toml +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/recompute_synthetic.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/report.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/run.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/source.eal +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/api-load-test/tools.toml +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/README.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/collector.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/demo.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/fixture.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/formal.eal +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/output/compiled-view.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/output/formal-view.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/output/summary.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/source.eal +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/aspic-keywords/tools.toml +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/multi-environment/README.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/multi-environment/collector.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/multi-environment/fixtures.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/multi-environment/run.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/multi-environment/source.eal +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/multi-environment/tools.toml +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/scoped-review/README.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/scoped-review/collector.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/scoped-review/review.eal +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/scoped-review/run.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/examples/scoped-review/tools.toml +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/__init__.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/README.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/WORKFLOW.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/__init__.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/accounting.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/adoption_costs.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/allocation_assessment.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/analyse.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/annotation_provenance.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/annotations.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/answers.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/artifacts.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/batch_simulation.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/benchmark.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/bounded_statistics.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/cadence-diagnostic-plan.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/cadence-information-design.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/cadence-plan.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/calibration.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/cases.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/collector.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/comparisons.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/conditions.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/conventional_reasoner.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/corpus_cases.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/corpus_context.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/corpus_logic.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/corpus_reference.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/decision_statistics.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/design.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostic-plan.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostic_design.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostic_inference.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostic_measurement.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostic_preparation.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostic_reporting.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostic_resources.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/diagnostics.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/evaluation-tasks.example.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/execution.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/information-design.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/information_config.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/information_design.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/journal.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/nuisance.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/outcomes.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/pilot_data.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/plan.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/plan_information.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/progress.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/project.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/prompts.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/protocol.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/provenance.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/provider.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/reasoning_context.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/records.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/rehearse.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/reporting.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/requirements.lock +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/resources.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/results/run-36432530106.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/run_state.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/runner.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/scoring.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/session.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/session_recovery.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/statistical_quantiles.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/task_case.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/task_context.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/task_corpus.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/task_manifest.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/threshold_method.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/trajectory_simulation.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validate_design.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/design-validation-screening.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/design-validation.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/eal3-language.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/eal31-composition.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/rehearsals.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/runtime-rehearsals.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/throughput.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/validation/wrapper.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/verification-eal3.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/verification-eal31.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/verification.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/model_transfer/workflow.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/README.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/__init__.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/__main__.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/analysis.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/calibration.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/demo/eal-authoring-example.eal +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/demo/eal-authoring-tools.toml +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/demo/plan.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/demo/seed/README.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/demo/seed/measurement.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/demo/seed/probe.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/design.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/inference.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/mock_model.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/model_gateway.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/openai_responses.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/operations.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/protocol.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/verification/calibration.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/verification/results.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/experiments/transfer_study/workspace.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/grammar/EAL.g4 +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/scripts/check_distribution.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/scripts/check_release_tag.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/scripts/experiment_pipeline.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/scripts/generate_parser.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/setup.cfg +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/eal-assessment-routing/SKILL.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/SKILL.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/agents/openai.yaml +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/assets/icon.svg +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/references/design-contract.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/references/expert-language-design.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/references/implementation-patterns.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/references/mcp-execution.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/references/reasoning-modes.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/references/reasoning-semantics.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/skills/engineer-argumentation-languages/references/sources.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/abstractions.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/acquisition_coordination.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/api_load_methods.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/aspic.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/aspic_compiler.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/aspic_export.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/builtin_methods.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/catalogue.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/cli.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/client_transports.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/collection_identity.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/collection_scheduler.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/command_process.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/command_supervisor.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/composition.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/credentials.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/dialectic.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/discovery.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/evaluator.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/expressions.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/extensions.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/formatter.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/generated/EALLexer.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/generated/EALParser.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/generated/EALVisitor.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/generated/__init__.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/host.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/knowledge.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/limits.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/mcp_guard.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/methods.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/model.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/model_context.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/modes.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/observation_reuse.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/operation_contracts.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/operations.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/packets.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/parser.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/planning.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/propositions.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reachability.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/__init__.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/abductive.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/analogical.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/causal.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/counterfactual.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/deductive.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/inductive.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/strategy.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/structured.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/temporal.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/reasoning/validation.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/registered_assessment.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/runtime.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/sampled_negative.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/scope_transfer.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/semantics.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/server.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/server_auth.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/server_settings.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/source_printer.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/store.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/eal/tool_acquisition.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/engineering_argument_language.egg-info/dependency_links.txt +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/engineering_argument_language.egg-info/entry_points.txt +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/engineering_argument_language.egg-info/requires.txt +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/src/engineering_argument_language.egg-info/top_level.txt +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_acquisition_coordination.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_ai_annotation_provenance.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_api_load_methods.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic_compiler.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic_compiler_entrypoints.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic_export.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic_extensions.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic_formal_annotations.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic_keywords_example.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_aspic_pyarg.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_binding_contract_review.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_builtin_method_specs.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_catalogue.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_cli_catalogue.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_client_transports.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_collection_budgets.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_collection_identity.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_collection_scheduler.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_command_process.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_composed_dialectic.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_composed_language.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_dialectic.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_discovery.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_distribution_metadata.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_eal3_frontend.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_eal3_integration.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_eal3_runtime.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_eal3_syntax.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_evaluator.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_execution_contract_review.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_experiment_pipeline.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_extension_runtime.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_formatter.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_frontend_contract_review.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_host.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_host_limits.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_http_origin.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_investigation_improvements.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_knowledge.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_language.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_language_version.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_load_test_example.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_mcp.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_mcp_lifetime.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_mcp_transports.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_method_extensions.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_method_worker_limits.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_answers.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_corpus.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_design.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_diagnostics.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_execution.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_information_design.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_records.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_rehearsal.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_reporting.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_session.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_task.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_model_transfer_workflow.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_modes.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_multi_environment_example.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_observation_reuse.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_packets.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_planning.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_qualified_packets.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_reachability_companion.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_reasoning_contract_review.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_reasoning_pipeline_contract.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_registered_assessment.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_release_tag.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_revision_contract.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_runtime.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_sampled_negative.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_scope_transfer_language.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_scoped_composition.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_semantic_review.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_server_auth.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_server_settings.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_service_workflow.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_store_initialisation.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_store_lifecycle.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_transfer_inference.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_transfer_study.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tests/test_typed_propositions.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tools/investigation-validator/README.md +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tools/investigation-validator/assets/investigation-protocol.template.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tools/investigation-validator/provenance.json +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tools/investigation-validator/scripts/validate_design.py +0 -0
- {engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/tools/investigation-validator/scripts/validate_investigation.py +0 -0
- {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
|
+
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
|
|
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
|
+
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
{engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/aspic-method.md
RENAMED
|
@@ -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.
|
|
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
|
|
{engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/eal3-composition.md
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Scoped composition in EAL/3
|
|
2
2
|
|
|
3
|
-
EAL/3 package 3.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
|
|
{engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/eal3-design.md
RENAMED
|
@@ -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.
|
|
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
|
|
{engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/mcp-and-tools.md
RENAMED
|
@@ -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
|
|
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
|
|
{engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/mcp-architecture.md
RENAMED
|
@@ -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
|
|
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
|
|
{engineering_argument_language-3.2.3 → engineering_argument_language-3.2.4}/docs/packaging.md
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Packaging and releases
|
|
2
2
|
|
|
3
|
-
The Python distribution is `engineering-argument-language` version `3.2.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
141
|
-
-f release_tag=v3.2.
|
|
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.
|
|
148
|
-
-f release_tag=v3.2.
|
|
149
|
-
gh workflow run publish.yml --repo emmett08/earl --ref v3.2.
|
|
150
|
-
-f release_tag=v3.2.
|
|
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.
|
|
160
|
+
'engineering-argument-language==3.2.4'
|
|
161
161
|
python -m pip install \
|
|
162
|
-
./test-release/engineering_argument_language-3.2.
|
|
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.
|
|
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
|
|
|
@@ -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
|
+
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
"
|
|
49
|
-
"nested": [{"
|
|
50
|
-
"encoded": json.dumps({
|
|
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
|
-
"
|
|
67
|
-
"nested": [{"
|
|
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"]) == {"
|
|
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",
|
|
108
|
-
|
|
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"] == {
|
|
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
|
|
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
|
-
|
|
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())
|