From 5ceacd044abc3030a9ffdc1f22ebccdb141e227f Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:19:34 +0100 Subject: [PATCH 1/5] =?UTF-8?q?chore(licence):=20reconcile=20SPDX=20header?= =?UTF-8?q?s=20to=20the=20AGPL=20ruling=20=E2=80=94=20three-part=20split?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner ruling: ECHIDNA is AGPL-3.0-or-later. Until now LICENSE and Cargo.toml said so while every source file granted MPL-2.0, NOTICE described the project as MPL, and .reuse/dep5 claimed PMPL-1.0 AND Palimpsest-0.6. Since per-file SPDX headers are themselves a licence grant, a recipient could have taken the tree under MPL — which has no network clause. This reconciles the tree to the ruling. Three parts, deliberately: code -> AGPL-3.0-or-later (594 files + 6 duals) documentation -> CC-BY-SA-4.0 (92 files + 1 dual) echidna-playground/ -> MPL-2.0, UNCHANGED The playground is not relicensed: it carries contributions attributed to 'Coq-Jr Contributors', and relicensing another party's contribution needs their consent. It does not need relicensing — MPL-2.0 s3.3 names the GNU licences (incl. AGPL-3.0+) as Secondary Licenses, so MPL files combine into an AGPL work and distribute under the AGPL while remaining individually available under MPL. Verified no file carries the Exhibit B 'Incompatible With Secondary Licenses' notice that would prevent this; the only match in the tree is inside LICENSES/MPL-2.0.txt, which is the licence's own boilerplate. Method — identifiers were REPLACED IN PLACE on SPDX-License-Identifier lines only, never inserted. A previous estate sweep mis-licensed files by imposing a header where a different one already sat further down. Consequences of that choice: - prose mentioning MPL is untouched - the 7 files offering Palimpsest-0.6 keep that grant ('AGPL-3.0-or-later OR/AND Palimpsest-0.6') — dropping half of a dual would withdraw a licence the owner granted - 3 workflows carrying PMPL-1.0-or-later folded into AGPL - SPDX stays on line 1 of all 30 workflows (linter greps head -1) Excluded deliberately: LICENSES/ and docs/legal/ — licence texts and their exhibits are reference documents, and restating the licensing of a licence text is confusing. Also: - NOTICE rewritten: it previously said 'licensed under MPL-2.0' while citing LICENSE (AGPL) as its full text. Now sets out the three-part split, the MPL s3.3 compatibility argument, and the licence history. - .reuse/dep5 rewritten to match reality. - LICENSE: dropped the two prepended SPDX lines, making it byte-identical to LICENSES/AGPL-3.0-or-later.txt. GitHub reported the licence as 'Other' because the prepend stopped its detector matching the body. Known gap, unchanged by this commit: Palimpsest-0.6 has no licence text in this repository or the estate, so those 7 dual grants reference an unresolvable identifier. Recorded in docs/DEBT.md rather than resolved by dropping the grant. Co-Authored-By: Claude Opus 5 --- .clusterfuzzlite/Containerfile | 2 +- .clusterfuzzlite/Dockerfile | 2 +- .clusterfuzzlite/build.sh | 2 +- .clusterfuzzlite/project.yaml | 2 +- .containerization/Containerfile | 2 +- .containerization/Containerfile.full | 4 +- .containerization/Containerfile.mcp | 2 +- .containerization/Containerfile.wave3 | 2 +- .containerization/build.sh | 2 +- .echidnabot.toml | 2 +- .editorconfig | 2 +- .gitattributes | 2 +- .githooks/pre-commit | 2 +- .githooks/validate-a2ml.sh | 2 +- .githooks/validate-k9.sh | 2 +- .github/CODEOWNERS | 2 +- .github/FUNDING.yml | 2 +- .../canonical-references/prover-counts.yml | 2 +- .github/dependabot.yml | 2 +- .github/settings.yml | 2 +- .github/workflows/agda-meta-checker.yml | 2 +- .github/workflows/boj-build.yml | 2 +- .github/workflows/bridge-gate.yml | 2 +- .github/workflows/cargo-audit.yml | 2 +- .github/workflows/cflite_batch.yml | 2 +- .github/workflows/cflite_pr.yml | 2 +- .github/workflows/chapel-ci.yml | 2 +- .github/workflows/codeql.yml | 2 +- .github/workflows/container-ci.yml | 2 +- .github/workflows/dogfood-gate.yml | 2 +- .github/workflows/dogfood-proofs-ci.yml | 2 +- .github/workflows/formal-verification.yml | 2 +- .../generator-generic-ossf-slsa3-publish.yml | 2 +- .github/workflows/ghcr-publish.yml | 2 +- .github/workflows/governance.yml | 2 +- .github/workflows/hypatia-scan.yml | 2 +- .github/workflows/idris2-abi-ci.yml | 2 +- .github/workflows/live-provers.yml | 2 +- .github/workflows/mirror.yml | 2 +- .github/workflows/mvp-smoke.yml | 2 +- .github/workflows/rust-ci.yml | 2 +- .github/workflows/s4-loop.yml | 2 +- .github/workflows/scorecard.yml | 2 +- .github/workflows/secret-scanner.yml | 2 +- .github/workflows/security-scan.yml | 2 +- .github/workflows/server-boot-gate.yml | 2 +- .github/workflows/spark-theatre-gate.yml | 2 +- .../workflows/verification-proofs-cron.yml | 2 +- .github/workflows/workflow-linter.yml | 2 +- .gitignore | 2 +- .gitlab-ci.yml | 2 +- .guix-channel | 2 +- .machine_readable/ADJUST.contractile | 2 +- .machine_readable/CLADE.a2ml | 2 +- .machine_readable/ER.a2ml | 2 +- .machine_readable/INTENT.contractile | 2 +- .machine_readable/MUST.contractile | 2 +- .machine_readable/ROADMAP.a2ml | 2 +- .machine_readable/TRUST.contractile | 2 +- .machine_readable/ai/AI.a2ml | 2 +- .machine_readable/anchors/ANCHOR.a2ml | 2 +- .../bot_directives/coverage.a2ml | 2 +- .machine_readable/bot_directives/debt.a2ml | 2 +- .../bot_directives/echidnabot.a2ml | 2 +- .../bot_directives/methodology.a2ml | 2 +- .machine_readable/contractiles/INDEX.a2ml | 2 +- .machine_readable/contractiles/README.adoc | 2 +- .machine_readable/contractiles/_base.ncl | 2 +- .../contractiles/adjust/Adjustfile.a2ml | 2 +- .../contractiles/adjust/adjust.k9.ncl | 2 +- .../contractiles/adjust/adjust.manifest.a2ml | 2 +- .../contractiles/adjust/adjust.ncl | 2 +- .../contractiles/bust/Bustfile.a2ml | 2 +- .../contractiles/bust/bust.k9.ncl | 2 +- .../contractiles/bust/bust.manifest.a2ml | 2 +- .machine_readable/contractiles/bust/bust.ncl | 2 +- .../contractiles/dust/Dustfile.a2ml | 2 +- .../contractiles/dust/dust.k9.ncl | 2 +- .../contractiles/dust/dust.manifest.a2ml | 2 +- .machine_readable/contractiles/dust/dust.ncl | 2 +- .../contractiles/intend/Intentfile.a2ml | 2 +- .../contractiles/intend/intend.k9.ncl | 2 +- .../contractiles/intend/intend.manifest.a2ml | 2 +- .../contractiles/intend/intend.ncl | 2 +- .../contractiles/must/Mustfile.a2ml | 2 +- .../contractiles/must/must.k9.ncl | 2 +- .../contractiles/must/must.manifest.a2ml | 2 +- .machine_readable/contractiles/must/must.ncl | 2 +- .../contractiles/trust/Trustfile.a2ml | 2 +- .../contractiles/trust/trust.k9.ncl | 2 +- .../contractiles/trust/trust.manifest.a2ml | 2 +- .../contractiles/trust/trust.ncl | 2 +- .machine_readable/deployment.a2ml | 2 +- .machine_readable/descriptiles/AGENTIC.a2ml | 2 +- .machine_readable/descriptiles/ANCHOR.a2ml | 2 +- .machine_readable/descriptiles/ECOSYSTEM.a2ml | 2 +- .machine_readable/descriptiles/META.a2ml | 2 +- .machine_readable/descriptiles/NEUROSYM.a2ml | 2 +- .machine_readable/descriptiles/PLAYBOOK.a2ml | 2 +- .machine_readable/descriptiles/STATE.a2ml | 2 +- .../integrations/feedback-o-tron.a2ml | 2 +- .machine_readable/integrations/proven.a2ml | 2 +- .machine_readable/integrations/verisim.a2ml | 2 +- .machine_readable/integrations/vexometer.a2ml | 2 +- .../policies/MAINTENANCE-AXES.a2ml | 2 +- .../policies/MAINTENANCE-CHECKLIST.a2ml | 2 +- .../SOFTWARE-DEVELOPMENT-APPROACH.a2ml | 2 +- .machine_readable/provers.a2ml | 2 +- .machine_readable/setup-prover-env.k9.ncl | 2 +- .../svc/k9/examples/ci-config.k9.ncl | 2 +- .../svc/k9/examples/project-metadata.k9.ncl | 2 +- .../svc/k9/examples/setup-repo.k9.ncl | 2 +- .machine_readable/svc/k9/template-hunt.k9.ncl | 2 +- .../svc/k9/template-kennel.k9.ncl | 2 +- .machine_readable/svc/k9/template-yard.k9.ncl | 2 +- .pre-commit-config.yaml | 2 +- .reuse/dep5 | 135 ++++++++++-------- .trivyignore | 2 +- .well-known/ai.txt | 2 +- .well-known/humans.txt | 2 +- .well-known/security.txt | 2 +- 0-AI-MANIFEST.a2ml | 2 +- CLAUDE.md | 12 +- Cargo.toml | 2 +- Containerfile | 2 +- GOVERNANCE.adoc | 2 +- .../.machine_readable/6a2/ECOSYSTEM.a2ml | 2 +- .../.machine_readable/6a2/META.a2ml | 2 +- .../.machine_readable/6a2/STATE.a2ml | 2 +- HOL-o-extension/0-AI-MANIFEST.a2ml | 2 +- HOL-o-extension/activate.sh | 2 +- HOL-o-extension/overlays/default.sml | 2 +- HOL-o-extension/overlays/security.sml | 2 +- HOL-o-extension/tactics/neurosymbolicTac.sml | 2 +- .../theories/echidnaTrustScript.sml | 2 +- LICENSE | 2 - Mustfile | 2 +- NOTICE | 90 +++++++++--- Project.toml | 2 +- TEST_CI_ECHIDNA.md | 2 +- alloyiser.toml | 2 +- audits/assail-classifications.a2ml | 2 +- benches/proof_benchmarks.rs | 2 +- benches/routing_benchmarks.rs | 2 +- build.rs | 2 +- codecov.yml | 2 +- config/config.ncl | 2 +- config/solver-manifest.toml | 2 +- container/.gatekeeper.yaml | 2 +- container/Containerfile | 2 +- container/compose.toml | 2 +- container/ct-build.sh | 2 +- container/deploy.k9.ncl | 2 +- container/entrypoint.sh | 2 +- container/manifest.toml | 2 +- container/vordr.toml | 2 +- contractile.just | 2 +- crates/echidna-core-spark/Cargo.toml | 2 +- crates/echidna-core-spark/rust-toolchain.toml | 2 +- .../echidna-core-spark/src/axiom_tracker.rs | 2 +- crates/echidna-core-spark/src/lib.rs | 2 +- crates/echidna-core-spark/src/pareto.rs | 2 +- crates/echidna-core/Cargo.toml | 2 +- crates/echidna-core/src/core.rs | 2 +- crates/echidna-core/src/lib.rs | 2 +- crates/echidna-core/src/types.rs | 2 +- crates/echidna-mcp/Cargo.toml | 2 +- crates/echidna-mcp/src/main.rs | 2 +- crates/echidna-wire/Cargo.toml | 2 +- crates/echidna-wire/build.rs | 2 +- crates/echidna-wire/schemas/verisim_er.capnp | 2 +- crates/echidna-wire/src/lib.rs | 2 +- crates/typed_wasm/Cargo.toml | 2 +- crates/typed_wasm/src/lib.rs | 2 +- data/synonyms/_conceptnet_seed.toml | 2 +- data/synonyms/_disciplines.toml | 2 +- data/synonyms/_msc2020.toml | 2 +- data/synonyms/_wordnet_math.toml | 2 +- data/synonyms/acl2.toml | 2 +- data/synonyms/agda.toml | 2 +- data/synonyms/coq.toml | 2 +- data/synonyms/dafny.toml | 2 +- data/synonyms/fstar.toml | 2 +- data/synonyms/hol4.toml | 2 +- data/synonyms/hol_light.toml | 2 +- data/synonyms/idris2.toml | 2 +- data/synonyms/isabelle.toml | 2 +- data/synonyms/isabelle_afp.toml | 2 +- data/synonyms/lean4.toml | 2 +- data/synonyms/metamath.toml | 2 +- data/synonyms/mizar.toml | 2 +- data/synonyms/why3.toml | 2 +- deploy/hetzner/Caddyfile | 2 +- deploy/hetzner/Containerfile.caddy | 2 +- deploy/hetzner/README.adoc | 2 +- deploy/hetzner/caddy.container | 2 +- deploy/hetzner/echidna.container | 2 +- deploy/hetzner/echidna.network | 2 +- deploy/hetzner/env.example | 2 +- docs-site/config/policy.yml | 2 +- docs-site/lib/echidna_docs/application.ex | 2 +- docs-site/lib/echidna_docs/gateway_config.ex | 2 +- docs-site/mix.exs | 2 +- docs-site/src/api_explorer.ecl | 2 +- docs-site/src/app.ecl | 2 +- docs-site/src/routes.ecl | 2 +- .../arcvix-neurosymbolic-theorem-proving.bib | 2 +- .../arcvix-neurosymbolic-theorem-proving.tex | 2 +- ...2026-06-06-hypatia-alert-classification.md | 2 +- eclexiaiser.toml | 2 +- examples/aspect_tagging_demo.rs | 2 +- examples/simple_proof.v | 2 +- ffi/zig/build.zig | 2 +- ffi/zig/src/boj.zig | 2 +- ffi/zig/src/capnp_bridge.zig | 2 +- ffi/zig/src/main.zig | 2 +- ffi/zig/src/overlay.zig | 2 +- ffi/zig/src/provers/atp.zig | 2 +- ffi/zig/src/provers/autoactive.zig | 2 +- ffi/zig/src/provers/constraint.zig | 2 +- ffi/zig/src/provers/declarative.zig | 2 +- ffi/zig/src/provers/interactive.zig | 2 +- ffi/zig/src/provers/smt.zig | 2 +- ffi/zig/src/provers/vcl_ut.zig | 2 +- ffi/zig/src/tentacles.zig | 2 +- ffi/zig/src/typell.zig | 2 +- ffi/zig/test/benchmark.zig | 2 +- ffi/zig/test/core_native_test.zig | 2 +- ffi/zig/test/integration_test.zig | 2 +- ffi/zig/test/overlay_benchmark.zig | 2 +- ffi/zig/test/overlay_integration_test.zig | 2 +- ffi/zig/test/overlay_native_test.zig | 2 +- fuzz/Cargo.toml | 2 +- fuzz/fuzz_targets/fuzz_axiom_tracker.rs | 2 +- fuzz/fuzz_targets/fuzz_input.rs | 2 +- fuzz/fuzz_targets/fuzz_proof_state.rs | 2 +- fuzz/fuzz_targets/fuzz_trust_pipeline.rs | 2 +- generated/abi/echidna_boj.h | 2 +- generated/abi/echidna_ffi.h | 2 +- generated/abi/echidna_overlay.h | 2 +- generated/abi/echidna_tentacles.h | 2 +- generated/abi/echidna_typell.h | 2 +- generated/alloyiser/run-analysis.sh | 2 +- guix-channel/echidna.scm | 2 +- guix.scm | 2 +- guix/echidna/packages.scm | 2 +- hooks/pre-commit | 2 +- hooks/pre-push | 2 +- k9iser.toml | 2 +- manifests/live-provers.scm | 2 +- meta-checker/echidna-meta.agda-lib | 2 +- meta-checker/src/Echidna/AxiomSafety.agda | 2 +- .../src/Echidna/AxiomTrackerCompleteness.agda | 2 +- meta-checker/src/Echidna/Dispatch.agda | 2 +- meta-checker/src/Echidna/MetaChecker.agda | 2 +- meta-checker/src/Echidna/Portfolio.agda | 2 +- meta-checker/src/Echidna/TrustLevel.agda | 2 +- metrics/MetricsSuite.jl | 2 +- metrics/alignment_rate.jl | 2 +- metrics/corpus_loader.jl | 2 +- metrics/floor_progress.jl | 2 +- metrics/heaps_beta.jl | 2 +- metrics/msc_taxonomy_coverage.jl | 2 +- metrics/oov_rate.jl | 2 +- metrics/prover_floor.jl | 2 +- metrics/run_all.jl | 2 +- metrics/tactic_cluster_purity.jl | 2 +- metrics/triangulation_rate.jl | 2 +- metrics/verisim_sink.jl | 2 +- metrics/zipf_s.jl | 2 +- proofs/acl2/associativity.lisp | 2 +- proofs/acl2/binary_trees.lisp | 2 +- proofs/acl2/factorial.lisp | 2 +- proofs/acl2/list_append.lisp | 2 +- proofs/acl2/sorting.lisp | 2 +- proofs/agda/AxiomMonotonicity.agda | 2 +- proofs/agda/Basic.agda | 2 +- proofs/agda/CertificateChain.agda | 2 +- proofs/agda/DispatchOrdering.agda | 2 +- proofs/agda/IdentityLaws.agda | 2 +- proofs/agda/List.agda | 2 +- proofs/agda/Nat.agda | 2 +- proofs/agda/ParallelSoundness.agda | 2 +- proofs/agda/PortfolioConsistency.agda | 2 +- proofs/agda/ProofComposition.agda | 2 +- proofs/agda/Propositional.agda | 2 +- proofs/agda/SoundnessPreservation.agda | 2 +- proofs/agda/TrustLattice.agda | 2 +- proofs/agda/echidna-proofs.agda-lib | 2 +- proofs/coq/algebra/GroupTheory.v | 2 +- proofs/dimacs/graph_3color.cnf | 2 +- proofs/dimacs/pigeonhole_3_2.cnf | 2 +- proofs/dimacs/satisfiable_basic.cnf | 2 +- proofs/dimacs/unsatisfiable_basic.cnf | 2 +- proofs/dimacs/xor_chain.cnf | 2 +- proofs/hol4/arithmetic.sml | 2 +- proofs/hol4/binary_tree.sml | 2 +- proofs/hol4/list_append.sml | 2 +- proofs/hol4/set_theory.sml | 2 +- proofs/hol4/sorting.sml | 2 +- proofs/isabelle/ROOT | 2 +- proofs/isabelle/algebra/GroupTheory.thy | 2 +- proofs/lean/Basic.lean | 2 +- proofs/lean/ECHIDNA.lean | 2 +- proofs/lean/List.lean | 2 +- proofs/lean/Nat.lean | 2 +- proofs/lean/Propositional.lean | 2 +- proofs/lean/algebra/GroupTheory.lean | 2 +- proofs/metamath/broken.mm | 2 +- proofs/metamath/tiny.mm | 2 +- proofs/pvs/arithmetic.pvs | 2 +- proofs/pvs/binary_search.pvs | 2 +- proofs/pvs/list_theory.pvs | 2 +- proofs/pvs/set_theory.pvs | 2 +- proofs/pvs/sorting.pvs | 2 +- proofs/tptp/contradiction.p | 2 +- proofs/tptp/disjunction_elim.p | 2 +- proofs/tptp/double_negation.p | 2 +- proofs/tptp/group_left_identity.p | 2 +- proofs/tptp/modus_ponens.p | 2 +- proofs/tptp/socrates.p | 2 +- proofs/tptp/symmetry_eq.p | 2 +- proofs/tptp/transitivity.p | 2 +- rules/security_learning.lgt | 2 +- rustfmt.toml | 2 +- schemas/echidna.capnp | 2 +- scripts/a2ml_emit.jl | 4 +- scripts/align_premises.jl | 2 +- scripts/balance_corpus.jl | 2 +- scripts/ban-npm.sh | 2 +- scripts/build-production.sh | 2 +- scripts/collect-field-signal.sh | 2 +- scripts/demo-proof.sh | 2 +- scripts/expand_training_data.sh | 2 +- scripts/extract_abc.jl | 2 +- scripts/extract_abella.jl | 2 +- scripts/extract_acl2.jl | 2 +- scripts/extract_acl2s.jl | 2 +- scripts/extract_afp.jl | 2 +- scripts/extract_agda.jl | 2 +- scripts/extract_all.sh | 2 +- scripts/extract_alloy.jl | 2 +- scripts/extract_arend.jl | 2 +- scripts/extract_athena.jl | 2 +- scripts/extract_boogie.jl | 2 +- scripts/extract_cameleer.jl | 2 +- scripts/extract_cbmc.jl | 2 +- scripts/extract_coqgym.jl | 2 +- scripts/extract_dafny.jl | 2 +- scripts/extract_dedukti.jl | 2 +- scripts/extract_dreal.jl | 2 +- scripts/extract_framac.jl | 2 +- scripts/extract_fstar.jl | 2 +- scripts/extract_hol4.jl | 2 +- scripts/extract_hol_light.jl | 2 +- scripts/extract_idris2.jl | 2 +- scripts/extract_isabelle_tropical.jl | 2 +- scripts/extract_isabelle_zf.jl | 2 +- scripts/extract_key.jl | 2 +- scripts/extract_lambda_prolog.jl | 2 +- scripts/extract_lean3.jl | 2 +- scripts/extract_mathcomp.jl | 4 +- scripts/extract_mathlib4.jl | 2 +- scripts/extract_matita.jl | 2 +- scripts/extract_mercury.jl | 2 +- scripts/extract_metamath.jl | 2 +- scripts/extract_minizinc.jl | 2 +- scripts/extract_mizar.jl | 2 +- scripts/extract_naproche.jl | 2 +- scripts/extract_nitpick.jl | 2 +- scripts/extract_nunchaku.jl | 2 +- scripts/extract_nusmv.jl | 2 +- scripts/extract_opentheory.jl | 2 +- scripts/extract_prism.jl | 2 +- scripts/extract_proverif.jl | 2 +- scripts/extract_pvs.jl | 2 +- scripts/extract_sat_benchmarks.jl | 2 +- scripts/extract_seahorn.jl | 2 +- scripts/extract_smtlib.jl | 4 +- scripts/extract_spin.jl | 2 +- scripts/extract_tamarin.jl | 2 +- scripts/extract_tlaps.jl | 2 +- scripts/extract_tlc.jl | 2 +- scripts/extract_tptp.jl | 4 +- scripts/extract_typechecker_ecosystem.jl | 2 +- scripts/extract_typed_wasm.jl | 2 +- scripts/extract_uppaal.jl | 2 +- scripts/extract_viper.jl | 2 +- scripts/extract_why3.jl | 2 +- scripts/extractor_save_common.jl | 2 +- scripts/final_complete_merge.jl | 2 +- scripts/final_normalization.jl | 2 +- scripts/gen-provers-a2ml.sh | 2 +- scripts/generate_synthetic_dafny_scale.jl | 2 +- scripts/generate_synthetic_provers.jl | 2 +- scripts/generate_synthetic_tail_scale.jl | 2 +- scripts/install-proof-toolchains.sh | 2 +- scripts/max_extract_coqgym.jl | 2 +- scripts/max_extract_mathlib4.jl | 2 +- scripts/merge_all_corpora.jl | 2 +- scripts/merge_corpus.jl | 2 +- scripts/merge_training_data.jl | 2 +- scripts/metamath_extract_working.jl | 2 +- scripts/metamath_final.jl | 2 +- scripts/mvp-functional.sh | 2 +- scripts/provision_corpora.sh | 2 +- scripts/simple_merge.jl | 2 +- scripts/simple_metamath_extract.jl | 2 +- scripts/test-integration.sh | 2 +- scripts/test-proofs.sh | 2 +- scripts/test_integration.sh | 2 +- scripts/ultimate_expansion.jl | 2 +- scripts/vocabulary_5x_expansion.jl | 2 +- scripts/vocabulary_canonicalize.jl | 2 +- scripts/vocabulary_expansion.jl | 2 +- scripts/vocabulary_final.jl | 2 +- scripts/vocabulary_mine_corpus.jl | 2 +- selur-compose.toml | 2 +- setup.sh | 2 +- spark/axiom_tracker/axiom_tracker.adb | 2 +- spark/axiom_tracker/axiom_tracker.ads | 2 +- spark/axiom_tracker/axiom_tracker_proof.adb | 2 +- spark/certificates/certificates.adb | 2 +- spark/certificates/certificates.ads | 2 +- spark/certificates/certificates_proof.adb | 2 +- spark/solver_integrity/solver_integrity.adb | 2 +- spark/solver_integrity/solver_integrity.ads | 2 +- .../solver_integrity_proof.adb | 2 +- src/abi/Boj/Foreign.idr | 2 +- src/abi/BojForeign.idr | 2 +- src/abi/CoprocessorForeign.idr | 2 +- src/abi/EchidnaABI/AxiomTracker.idr | 2 +- src/abi/EchidnaABI/CapnSchemas.idr | 2 +- src/abi/EchidnaABI/Foreign.idr | 2 +- src/abi/EchidnaABI/Gnn.idr | 2 +- src/abi/EchidnaABI/Layout.idr | 2 +- src/abi/EchidnaABI/Provers.idr | 2 +- src/abi/EchidnaABI/Provers/AutoActive.idr | 2 +- .../EchidnaABI/Provers/ConstraintSolvers.idr | 2 +- .../EchidnaABI/Provers/DeclarativeProvers.idr | 2 +- src/abi/EchidnaABI/Provers/FirstOrderAtp.idr | 2 +- .../Provers/InteractiveAssistants.idr | 2 +- src/abi/EchidnaABI/Provers/SmtSolvers.idr | 2 +- src/abi/EchidnaABI/TacticRecord.idr | 2 +- src/abi/EchidnaABI/Types.idr | 2 +- src/abi/EchidnaABI/VqlUt.idr | 2 +- src/abi/Foreign.idr | 2 +- src/abi/Layout.idr | 2 +- src/abi/NeSyAssistTesting.idr | 2 +- src/abi/Overlay.idr | 2 +- src/abi/Overlay/Foreign.idr | 2 +- src/abi/OverlayForeign.idr | 2 +- src/abi/Tentacles/Foreign.idr | 2 +- src/abi/TentaclesForeign.idr | 2 +- src/abi/TypeLL/Foreign.idr | 2 +- src/abi/TypeLLForeign.idr | 2 +- src/abi/Types.idr | 2 +- src/abi/echidnaabi.ipkg | 2 +- src/ada/spark/axiom_c_bridge.adb | 2 +- src/ada/spark/axiom_c_bridge.ads | 2 +- src/ada/spark/axiom_policy.adb | 2 +- src/ada/spark/axiom_policy.ads | 2 +- src/ada/spark/axiom_types.ads | 2 +- src/ada/spark/coprocessor_safety.adb | 2 +- src/ada/spark/coprocessor_safety.ads | 2 +- src/ada/spark/echidna_spark.gpr | 2 +- src/chapel/bench_mrr.chpl | 2 +- src/chapel/chapel_ffi_exports.chpl | 2 +- src/chapel/parallel_proof_search.chpl | 2 +- src/chapel/smoke.chpl | 2 +- src/idris/ProofTerm.idr | 2 +- src/idris/Validator.idr | 2 +- src/idris/echidna-validator.ipkg | 2 +- src/interfaces/ffi_integration_test.rs | 2 +- src/interfaces/graphql/Cargo.toml | 2 +- src/interfaces/graphql/ffi_wrapper.rs | 2 +- src/interfaces/graphql/main.rs | 2 +- src/interfaces/graphql/resolvers.rs | 2 +- src/interfaces/graphql/schema.rs | 2 +- src/interfaces/grpc/Cargo.toml | 2 +- src/interfaces/grpc/build.rs | 2 +- src/interfaces/grpc/ffi_wrapper.rs | 2 +- src/interfaces/grpc/main.rs | 2 +- src/interfaces/grpc/proto/echidna.proto | 2 +- src/interfaces/rest/Cargo.toml | 2 +- src/interfaces/rest/ffi_wrapper.rs | 2 +- src/interfaces/rest/handlers.rs | 2 +- src/interfaces/rest/main.rs | 2 +- src/interfaces/rest/models.rs | 2 +- src/julia/EchidnaBuddy.jl | 2 +- src/julia/EchidnaML.jl | 2 +- src/julia/api/gnn_endpoint.jl | 2 +- src/julia/api/server.jl | 2 +- src/julia/api_server.jl | 2 +- src/julia/archive/train_advanced_models.jl | 2 +- src/julia/archive/train_and_evaluate.jl | 2 +- src/julia/archive/train_complete_final.jl | 2 +- src/julia/archive/train_final_models.jl | 2 +- src/julia/archive/train_models.jl | 2 +- src/julia/coprocessor.jl | 2 +- src/julia/corpus_loader.jl | 2 +- src/julia/eval_held_out.jl | 2 +- src/julia/extract_all_proofs.jl | 2 +- src/julia/extract_training_data.jl | 2 +- src/julia/inference/predict.jl | 2 +- src/julia/ipc.jl | 2 +- src/julia/models/encoder.jl | 2 +- src/julia/models/neural_solver.jl | 2 +- src/julia/probabilistic/gen_reasoning.jl | 2 +- src/julia/retrain_from_verisim.jl | 2 +- src/julia/rl/training.jl | 2 +- src/julia/run_server.jl | 2 +- src/julia/run_training.jl | 2 +- src/julia/run_training_cpu.jl | 2 +- src/julia/saturation_synonyms.jl | 2 +- src/julia/test_server.jl | 2 +- src/julia/training/dataloader.jl | 2 +- src/julia/training/train.jl | 2 +- src/provers/Mod.res | 2 +- src/provers/clients/LeanTool.res | 2 +- src/provers/clients/Metamath.res | 2 +- src/provers/clients/SystemOnTptp.res | 2 +- src/provers/clients/Unified.res | 2 +- src/provers/clients/UnifiedTest.res | 2 +- src/provers/clients/Wolfram.res | 2 +- src/provers/clients/Z3Wasm.res | 2 +- src/provers/runners/Cli.res | 2 +- src/provers/runners/Daemon.res | 2 +- src/provers/types/Prover.res | 2 +- src/provers/types/ProverTest.res | 2 +- src/provers/utils/Http.res | 2 +- src/rescript/src/Main.res | 2 +- src/rescript/src/Server.res | 2 +- src/rescript/src/api/Client.res | 2 +- src/rescript/src/components/GoalList.res | 2 +- src/rescript/src/components/ProofTree.res | 2 +- src/rescript/src/components/ProofViewer.res | 2 +- .../src/components/ProverSelector.res | 2 +- .../src/components/TacticSuggester.res | 2 +- src/rescript/src/components/TheoremSearch.res | 2 +- src/rescript/src/state/Store.res | 2 +- src/rescript/test-ui.js | 2 +- src/rust/agent/actors.rs | 2 +- src/rust/agent/explanations.rs | 2 +- src/rust/agent/memory.rs | 2 +- src/rust/agent/meta_controller.rs | 2 +- src/rust/agent/mod.rs | 2 +- src/rust/agent/planner.rs | 2 +- src/rust/agent/router.rs | 2 +- src/rust/agent/swarm.rs | 2 +- src/rust/anomaly_detection.rs | 2 +- src/rust/aspect.rs | 2 +- src/rust/coprocessor/audio.rs | 2 +- src/rust/coprocessor/crypto.rs | 2 +- src/rust/coprocessor/dsp.rs | 2 +- src/rust/coprocessor/flint.rs | 2 +- src/rust/coprocessor/fpga.rs | 2 +- src/rust/coprocessor/gap.rs | 2 +- src/rust/coprocessor/graphics.rs | 2 +- src/rust/coprocessor/io.rs | 2 +- src/rust/coprocessor/julia_bridge.rs | 2 +- src/rust/coprocessor/macaulay2.rs | 2 +- src/rust/coprocessor/math.rs | 2 +- src/rust/coprocessor/maxima.rs | 2 +- src/rust/coprocessor/mod.rs | 2 +- src/rust/coprocessor/parigp.rs | 2 +- src/rust/coprocessor/physics.rs | 2 +- src/rust/coprocessor/singular.rs | 2 +- src/rust/coprocessor/tensor.rs | 2 +- src/rust/coprocessor/trust.rs | 2 +- src/rust/coprocessor/types.rs | 2 +- src/rust/coprocessor/vector.rs | 2 +- src/rust/corpus/acl2_books.rs | 2 +- src/rust/corpus/agda.rs | 2 +- src/rust/corpus/coq.rs | 2 +- src/rust/corpus/dafny.rs | 2 +- src/rust/corpus/embed.rs | 2 +- src/rust/corpus/fstar.rs | 2 +- src/rust/corpus/hol4.rs | 2 +- src/rust/corpus/hol_light.rs | 2 +- src/rust/corpus/idris2.rs | 2 +- src/rust/corpus/isabelle.rs | 2 +- src/rust/corpus/lean.rs | 2 +- src/rust/corpus/metamath.rs | 2 +- src/rust/corpus/metrics.rs | 2 +- src/rust/corpus/minif2f.rs | 2 +- src/rust/corpus/mizar.rs | 2 +- src/rust/corpus/mod.rs | 2 +- src/rust/corpus/octad.rs | 2 +- src/rust/corpus/proofnet.rs | 2 +- src/rust/corpus/query.rs | 2 +- src/rust/corpus/smtlib.rs | 2 +- src/rust/corpus/tptp.rs | 2 +- src/rust/corpus/why3.rs | 2 +- src/rust/diagnostics/corpus_monitor.rs | 2 +- src/rust/diagnostics/fallback_monitor.rs | 2 +- src/rust/diagnostics/gnn_training.rs | 2 +- src/rust/diagnostics/health.rs | 2 +- src/rust/diagnostics/mod.rs | 2 +- src/rust/diagnostics/nesy_validation.rs | 2 +- src/rust/diagnostics/proof_failure.rs | 2 +- src/rust/disciplines/detector.rs | 2 +- src/rust/disciplines/mod.rs | 2 +- src/rust/disciplines/registry.rs | 2 +- src/rust/dispatch.rs | 2 +- src/rust/exchange/dedukti.rs | 2 +- src/rust/exchange/lambdapi.rs | 2 +- src/rust/exchange/mod.rs | 2 +- src/rust/exchange/opentheory.rs | 2 +- src/rust/exchange/smtcoq.rs | 2 +- src/rust/exchange/smtlib.rs | 2 +- src/rust/exchange/tptp.rs | 2 +- src/rust/executor/bounded.rs | 2 +- src/rust/executor/mod.rs | 2 +- src/rust/executor/sandbox.rs | 2 +- src/rust/fault_tolerance/mod.rs | 2 +- src/rust/fault_tolerance/resilience.rs | 2 +- src/rust/ffi/mod.rs | 2 +- src/rust/ffi/spark_axiom.rs | 2 +- src/rust/gnn/client.rs | 2 +- src/rust/gnn/embeddings.rs | 2 +- src/rust/gnn/fallback_monitor.rs | 2 +- src/rust/gnn/graph.rs | 2 +- src/rust/gnn/guided_search.rs | 2 +- src/rust/gnn/mod.rs | 2 +- src/rust/groove.rs | 2 +- src/rust/integration.rs | 2 +- src/rust/integrations/conceptnet.rs | 2 +- src/rust/integrity/io.rs | 2 +- src/rust/integrity/mod.rs | 2 +- src/rust/integrity/solver_integrity.rs | 2 +- src/rust/ipc/mod.rs | 2 +- src/rust/learning/buchholz_rank.rs | 2 +- src/rust/learning/curriculum.rs | 2 +- src/rust/learning/daemon.rs | 2 +- src/rust/learning/design_search.rs | 2 +- src/rust/learning/mcts.rs | 2 +- src/rust/learning/mod.rs | 2 +- src/rust/learning/self_play.rs | 2 +- src/rust/lib.rs | 2 +- src/rust/llm.rs | 2 +- src/rust/main.rs | 2 +- src/rust/neural.rs | 2 +- src/rust/output.rs | 2 +- src/rust/parsers/mod.rs | 2 +- src/rust/proof_encoding.rs | 2 +- src/rust/proof_search.rs | 2 +- src/rust/provers/abc.rs | 2 +- src/rust/provers/abella.rs | 2 +- src/rust/provers/acl2.rs | 2 +- src/rust/provers/acl2s.rs | 2 +- src/rust/provers/agda.rs | 2 +- src/rust/provers/agsyhol.rs | 2 +- src/rust/provers/alloy.rs | 2 +- src/rust/provers/altergo.rs | 2 +- src/rust/provers/aprove.rs | 2 +- src/rust/provers/arend.rs | 2 +- src/rust/provers/athena.rs | 2 +- src/rust/provers/boogie.rs | 2 +- src/rust/provers/cadical.rs | 2 +- src/rust/provers/cameleer.rs | 2 +- src/rust/provers/cbmc.rs | 2 +- src/rust/provers/chuffed.rs | 2 +- src/rust/provers/connection_method.rs | 2 +- src/rust/provers/coq.rs | 2 +- src/rust/provers/cryptoverif.rs | 4 +- src/rust/provers/csi.rs | 2 +- src/rust/provers/cubical_agda.rs | 2 +- src/rust/provers/cvc5.rs | 2 +- src/rust/provers/dafny.rs | 4 +- src/rust/provers/dedukti.rs | 2 +- src/rust/provers/dreal.rs | 2 +- src/rust/provers/easycrypt.rs | 4 +- src/rust/provers/elk.rs | 2 +- src/rust/provers/eprover.rs | 2 +- src/rust/provers/faial.rs | 2 +- src/rust/provers/framac.rs | 2 +- src/rust/provers/fstar.rs | 2 +- src/rust/provers/glpk.rs | 2 +- src/rust/provers/gnatprove.rs | 8 +- src/rust/provers/gpuverify.rs | 2 +- src/rust/provers/hol4.rs | 2 +- src/rust/provers/hol_light.rs | 2 +- src/rust/provers/hp_ecosystem.rs | 2 +- src/rust/provers/idris2.rs | 4 +- src/rust/provers/ileancop.rs | 2 +- src/rust/provers/imandra.rs | 2 +- src/rust/provers/io.rs | 2 +- src/rust/provers/iprover.rs | 2 +- src/rust/provers/isabelle.rs | 2 +- src/rust/provers/isabelle_zf.rs | 2 +- src/rust/provers/key.rs | 2 +- src/rust/provers/keymaerax.rs | 2 +- src/rust/provers/kissat.rs | 2 +- src/rust/provers/konclude.rs | 2 +- src/rust/provers/lambda_prolog.rs | 2 +- src/rust/provers/lash.rs | 2 +- src/rust/provers/lean.rs | 2 +- src/rust/provers/lean3.rs | 2 +- src/rust/provers/leo3.rs | 2 +- src/rust/provers/liquid_haskell.rs | 4 +- src/rust/provers/matita.rs | 2 +- src/rust/provers/mercury.rs | 2 +- src/rust/provers/metamath.rs | 2 +- src/rust/provers/metitarski.rs | 2 +- src/rust/provers/mettel2.rs | 2 +- src/rust/provers/minisat.rs | 2 +- src/rust/provers/minizinc.rs | 2 +- src/rust/provers/minlog.rs | 2 +- src/rust/provers/mizar.rs | 2 +- src/rust/provers/mizar_ar.rs | 2 +- src/rust/provers/mleancop.rs | 2 +- src/rust/provers/mod.rs | 2 +- src/rust/provers/nanocop.rs | 2 +- src/rust/provers/naproche.rs | 2 +- src/rust/provers/nitpick.rs | 2 +- src/rust/provers/nunchaku.rs | 2 +- src/rust/provers/nuprl.rs | 2 +- src/rust/provers/nusmv.rs | 2 +- src/rust/provers/opensmt.rs | 2 +- src/rust/provers/ortools.rs | 2 +- src/rust/provers/outcome.rs | 2 +- src/rust/provers/princess.rs | 2 +- src/rust/provers/prism.rs | 2 +- src/rust/provers/prob.rs | 2 +- src/rust/provers/prover9.rs | 2 +- src/rust/provers/proverif.rs | 2 +- src/rust/provers/pvs.rs | 2 +- src/rust/provers/qepcad.rs | 2 +- src/rust/provers/redlog.rs | 2 +- src/rust/provers/rocq.rs | 2 +- src/rust/provers/satallax.rs | 2 +- src/rust/provers/scip.rs | 2 +- src/rust/provers/seahorn.rs | 2 +- src/rust/provers/smtrat.rs | 2 +- src/rust/provers/spass.rs | 2 +- src/rust/provers/spin_checker.rs | 2 +- src/rust/provers/stainless.rs | 4 +- src/rust/provers/storm.rs | 2 +- src/rust/provers/tamarin.rs | 2 +- src/rust/provers/tlaps.rs | 2 +- src/rust/provers/tlc.rs | 2 +- src/rust/provers/tptp_output.rs | 2 +- src/rust/provers/twee.rs | 2 +- src/rust/provers/twelf.rs | 2 +- src/rust/provers/typed_wasm.rs | 2 +- src/rust/provers/uppaal.rs | 2 +- src/rust/provers/uppaal_stratego.rs | 2 +- src/rust/provers/vampire.rs | 2 +- src/rust/provers/viper.rs | 2 +- src/rust/provers/why3.rs | 2 +- src/rust/provers/z3.rs | 2 +- src/rust/provers/zipperposition.rs | 2 +- src/rust/repl/diagnostics.rs | 2 +- src/rust/repl/mod.rs | 2 +- src/rust/repl/proof.rs | 2 +- src/rust/server.rs | 2 +- src/rust/suggest/extractor.rs | 2 +- src/rust/suggest/mod.rs | 2 +- src/rust/suggest/report.rs | 2 +- src/rust/suggest/synonyms.rs | 2 +- src/rust/suggest/tester.rs | 2 +- src/rust/suggest/variant.rs | 2 +- src/rust/vcl_ut.rs | 2 +- src/rust/verification/axiom_tracker.rs | 2 +- src/rust/verification/bayesian_arbiter.rs | 2 +- src/rust/verification/certificates.rs | 2 +- src/rust/verification/confidence.rs | 2 +- src/rust/verification/dempster_shafer.rs | 2 +- src/rust/verification/mod.rs | 2 +- src/rust/verification/mutation.rs | 2 +- src/rust/verification/pareto.rs | 2 +- src/rust/verification/pareto_arbiter.rs | 2 +- src/rust/verification/portfolio.rs | 2 +- src/rust/verification/proof.rs | 2 +- src/rust/verification/result_arbiter.rs | 2 +- src/rust/verification/statistics.rs | 2 +- src/rust/verisim_bridge.rs | 2 +- src/ui/public/prove.html | 2 +- src/ui/tea/echidna_gui.affine | 2 +- src/ui/tea/echidna_tea.js | 2 +- src/zig/build.zig | 2 +- src/zig/ffi/axiom_spark_bridge.zig | 2 +- src/zig/ffi/echidna_ffi.h | 2 +- src/zig/ffi/echidna_ffi.zig | 2 +- src/zig_ffi/build.zig | 2 +- src/zig_ffi/chapel_bridge.zig | 2 +- src/zig_ffi/chapel_ffi_exports.h | 2 +- src/zig_ffi/chapel_stubs.c | 2 +- stapeln.toml | 2 +- tests/agentic_integration.rs | 2 +- tests/aspect_tests.rs | 2 +- tests/chapel_fixtures/agda_trivial.agda | 2 +- tests/chapel_fixtures/coq_trivial.v | 2 +- tests/chapel_fixtures/idris2_trivial.idr | 2 +- tests/chapel_fixtures/lean_trivial.lean | 2 +- tests/common/assertions.rs | 2 +- tests/common/generators.rs | 2 +- tests/common/mock_prover.rs | 2 +- tests/common/mod.rs | 2 +- tests/concurrency_test.rs | 2 +- tests/corpus_fixtures/acl2/smoke.lisp | 2 +- tests/corpus_fixtures/dafny/Smoke.dfy | 2 +- tests/corpus_fixtures/fstar/Smoke.fst | 2 +- tests/corpus_fixtures/hol4/MiniScript.sml | 2 +- tests/corpus_fixtures/hol_light/smoke.ml | 2 +- tests/corpus_fixtures/isabelle/Smoke.thy | 2 +- tests/corpus_fixtures/mizar/MINI.miz | 2 +- tests/corpus_fixtures/why3/smoke.mlw | 2 +- tests/corpus_health_integration_test.rs | 2 +- tests/e2e_proof_pipeline.rs | 2 +- tests/e2e_prover_test.rs | 2 +- tests/fallback_monitor_integration_test.rs | 2 +- tests/fixtures/hp/echo_trivial.tll | 2 +- tests/fixtures/hp/katagoria_trivial.k | 2 +- tests/fixtures/hp/tropical_trivial.tll | 2 +- tests/full_health_system_test.rs | 2 +- tests/gnn_augment_integration.rs | 2 +- tests/gnn_training_integration_test.rs | 2 +- tests/integration_test.sh | 2 +- tests/integration_tests.rs | 2 +- tests/integration_v1_2.rs | 2 +- tests/julia/gnn_rank_smoke.jl | 2 +- tests/julia/smoke_test.jl | 2 +- tests/julia_corpus_loader_smoke.jl | 2 +- tests/live_prover_suite.rs | 2 +- tests/live_prover_verify.rs | 2 +- tests/neural_property_tests.rs | 2 +- tests/p2p_property_tests.rs | 2 +- tests/panic_attack_props.rs | 2 +- tests/performance_check.rs | 2 +- tests/property_tests.rs | 2 +- .../prove_handler_health_integration_test.rs | 2 +- tests/s4_loop_closure.rs | 2 +- tests/sanity_suite.rs | 2 +- tests/security_aspect_tests.rs | 2 +- tests/shell/validate_scripts.sh | 2 +- tests/smoke_e2e.rs | 2 +- tests/stage1_integration_test.rs | 2 +- tests/test_agda_backend.rs | 2 +- tests/test_neural_integration.rs | 2 +- tests/typed_wasm_properties.rs | 2 +- training_data/proof_states_mathcomp.a2ml | 2 +- training_data/proof_states_v2.jsonl | 10 +- training_data/stats_mathcomp.a2ml | 2 +- training_data/stats_tptp.a2ml | 2 +- training_data/tactics_mathcomp.a2ml | 2 +- training_data/tactics_tptp.a2ml | 2 +- .../proofs/idris2/AxiomCompleteness.idr | 2 +- .../proofs/idris2/AxiomPolicyOrdering.idr | 2 +- verification/proofs/idris2/BasicTotality.idr | 2 +- .../proofs/idris2/ClampTrustBounds.idr | 2 +- .../proofs/idris2/DispatchCorrectness.idr | 2 +- .../proofs/idris2/DispatchOrdering.idr | 2 +- verification/proofs/idris2/NatLte.idr | 2 +- .../proofs/idris2/ProofStateSerialisation.idr | 2 +- .../proofs/idris2/ProverKindInjectivity.idr | 2 +- .../proofs/idris2/TrustKernelMonotonicity.idr | 2 +- .../proofs/idris2/TrustLevelSoundness.idr | 2 +- .../proofs/idris2/echidna-verif-proofs.ipkg | 2 +- .../proofs/lean4/ConfidenceLattice.lean | 2 +- .../proofs/lean4/IntegrityVerification.lean | 2 +- .../proofs/lean4/ParetoMaximality.lean | 2 +- .../proofs/lean4/ParetoStrongMaximality.lean | 2 +- .../proofs/lean4/PortfolioCompleteness.lean | 2 +- verification/proofs/lean4/lakefile.lean | 2 +- 866 files changed, 1036 insertions(+), 963 deletions(-) diff --git a/.clusterfuzzlite/Containerfile b/.clusterfuzzlite/Containerfile index 43f88636..c02d019e 100644 --- a/.clusterfuzzlite/Containerfile +++ b/.clusterfuzzlite/Containerfile @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later FROM gcr.io/oss-fuzz-base/base-builder-rust@sha256:73c1d5648db54100639339d411a5d192cbc8bf413ee91e843a07cf6f0e319dc7 COPY . $SRC/echidna diff --git a/.clusterfuzzlite/Dockerfile b/.clusterfuzzlite/Dockerfile index 43f88636..c02d019e 100644 --- a/.clusterfuzzlite/Dockerfile +++ b/.clusterfuzzlite/Dockerfile @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later FROM gcr.io/oss-fuzz-base/base-builder-rust@sha256:73c1d5648db54100639339d411a5d192cbc8bf413ee91e843a07cf6f0e319dc7 COPY . $SRC/echidna diff --git a/.clusterfuzzlite/build.sh b/.clusterfuzzlite/build.sh index 5b801c6d..f180fc9d 100755 --- a/.clusterfuzzlite/build.sh +++ b/.clusterfuzzlite/build.sh @@ -1,5 +1,5 @@ #!/bin/bash -eu -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later cd "$SRC"/echidna cargo +nightly fuzz build # `fuzz` is excluded from the workspace (`Cargo.toml:154-157`), so diff --git a/.clusterfuzzlite/project.yaml b/.clusterfuzzlite/project.yaml index 311ed3dc..4a622527 100644 --- a/.clusterfuzzlite/project.yaml +++ b/.clusterfuzzlite/project.yaml @@ -1,2 +1,2 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later language: rust diff --git a/.containerization/Containerfile b/.containerization/Containerfile index 9122c3c6..af3a9f9a 100644 --- a/.containerization/Containerfile +++ b/.containerization/Containerfile @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2024-2025 Jonathan D.A. Jewell # # ECHIDNA Minimal Containerfile - Multi-stage build for Podman diff --git a/.containerization/Containerfile.full b/.containerization/Containerfile.full index 3bfb8abc..139fc4f5 100644 --- a/.containerization/Containerfile.full +++ b/.containerization/Containerfile.full @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2024-2025 Jonathan D.A. Jewell # # ECHIDNA Full Containerfile - Includes a curated prover set @@ -135,7 +135,7 @@ COPY guix-channel/echidna.scm /channel/echidna/ # If no guix channel file exists, create a stub RUN if [ ! -f /channel/echidna/echidna.scm ]; then \ - printf ';;; SPDX-License-Identifier: MPL-2.0\n\ + printf ';;; SPDX-License-Identifier: AGPL-3.0-or-later\n\ (define-module (echidna)\n\ #:use-module (guix packages)\n\ #:use-module (guix build-system cargo)\n\ diff --git a/.containerization/Containerfile.mcp b/.containerization/Containerfile.mcp index ef69531e..a0d3fabd 100644 --- a/.containerization/Containerfile.mcp +++ b/.containerization/Containerfile.mcp @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # ECHIDNA MCP Container — exposes ECHIDNA as a Model Context Protocol server diff --git a/.containerization/Containerfile.wave3 b/.containerization/Containerfile.wave3 index 3dd3a6f6..f736c0b0 100644 --- a/.containerization/Containerfile.wave3 +++ b/.containerization/Containerfile.wave3 @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # ECHIDNA Wave-3 (Tier-3, weekly) prover images — CONSOLIDATED multi-target diff --git a/.containerization/build.sh b/.containerization/build.sh index 0d48402f..24edf0ae 100755 --- a/.containerization/build.sh +++ b/.containerization/build.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Build ECHIDNA container images using Podman set -euo pipefail diff --git a/.echidnabot.toml b/.echidnabot.toml index ff959b95..1427998f 100644 --- a/.echidnabot.toml +++ b/.echidnabot.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Hyperpolymath # # echidnabot configuration for echidna diff --git a/.editorconfig b/.editorconfig index 016781b6..8ba04db4 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2024-2026 Jonathan D.A. Jewell (hyperpolymath) # EditorConfig helps maintain consistent coding styles diff --git a/.gitattributes b/.gitattributes index e860a85c..7bbe6d53 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # RSR-compliant .gitattributes * text=auto eol=lf diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 92c8d936..c38d1228 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -3,7 +3,7 @@ # ECHIDNA Pre-commit Hook # Enforces npm ban and runs checks # -# SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-or-later +# SPDX-License-Identifier: AGPL-3.0-or-later OR AGPL-3.0-or-later set -euo pipefail diff --git a/.githooks/validate-a2ml.sh b/.githooks/validate-a2ml.sh index b0536764..277c0e54 100755 --- a/.githooks/validate-a2ml.sh +++ b/.githooks/validate-a2ml.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # validate-a2ml.sh — A2ML manifest validation script diff --git a/.githooks/validate-k9.sh b/.githooks/validate-k9.sh index c83e2908..b60ee5cd 100755 --- a/.githooks/validate-k9.sh +++ b/.githooks/validate-k9.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # validate-k9.sh — K9 configuration file validation script diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index fb9afafe..1c57dd76 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # CODEOWNERS - Code ownership for ECHIDNA # See https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 688a442c..38fe1416 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Funding platforms for hyperpolymath projects # See: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/displaying-a-sponsor-button-in-your-repository diff --git a/.github/canonical-references/prover-counts.yml b/.github/canonical-references/prover-counts.yml index 2ce3c1ff..cecb1173 100644 --- a/.github/canonical-references/prover-counts.yml +++ b/.github/canonical-references/prover-counts.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2025-2026 Jonathan D.A. Jewell # # R5 canonical-reference rule: bare prover counts in load-bearing diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 94bf53d8..3c928372 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later version: 2 updates: - package-ecosystem: "cargo" diff --git a/.github/settings.yml b/.github/settings.yml index ca11ccbf..1e7b5cac 100644 --- a/.github/settings.yml +++ b/.github/settings.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Repository settings for probot/settings GitHub App. # https://github.com/probot/settings diff --git a/.github/workflows/agda-meta-checker.yml b/.github/workflows/agda-meta-checker.yml index 8a46b28f..d835b433 100644 --- a/.github/workflows/agda-meta-checker.yml +++ b/.github/workflows/agda-meta-checker.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # CI workflow for ECHIDNA Agda meta-checker # Type-checks all formal proofs verifying trust pipeline correctness diff --git a/.github/workflows/boj-build.yml b/.github/workflows/boj-build.yml index da7de081..1445eb6f 100644 --- a/.github/workflows/boj-build.yml +++ b/.github/workflows/boj-build.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. name: BoJ Server Build Trigger on: diff --git a/.github/workflows/bridge-gate.yml b/.github/workflows/bridge-gate.yml index cbd400f3..75c97809 100644 --- a/.github/workflows/bridge-gate.yml +++ b/.github/workflows/bridge-gate.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # Copyright (c) 2026 Jonathan D.A. Jewell # diff --git a/.github/workflows/cargo-audit.yml b/.github/workflows/cargo-audit.yml index 728fe7f8..26299f4d 100644 --- a/.github/workflows/cargo-audit.yml +++ b/.github/workflows/cargo-audit.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # diff --git a/.github/workflows/cflite_batch.yml b/.github/workflows/cflite_batch.yml index 023a1c3f..35167d47 100644 --- a/.github/workflows/cflite_batch.yml +++ b/.github/workflows/cflite_batch.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. name: ClusterFuzzLite batch fuzzing on: diff --git a/.github/workflows/cflite_pr.yml b/.github/workflows/cflite_pr.yml index 10a8fdab..975a7e5e 100644 --- a/.github/workflows/cflite_pr.yml +++ b/.github/workflows/cflite_pr.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. name: ClusterFuzzLite PR fuzzing on: diff --git a/.github/workflows/chapel-ci.yml b/.github/workflows/chapel-ci.yml index 949acbb8..acc67b1c 100644 --- a/.github/workflows/chapel-ci.yml +++ b/.github/workflows/chapel-ci.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. name: Chapel Accelerator CI diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index aa2b465b..169aa4b7 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. name: CodeQL Security Analysis diff --git a/.github/workflows/container-ci.yml b/.github/workflows/container-ci.yml index 89613386..1c81f5d1 100644 --- a/.github/workflows/container-ci.yml +++ b/.github/workflows/container-ci.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # # container-ci.yml — Container build verification. diff --git a/.github/workflows/dogfood-gate.yml b/.github/workflows/dogfood-gate.yml index 247840af..1702341c 100644 --- a/.github/workflows/dogfood-gate.yml +++ b/.github/workflows/dogfood-gate.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # diff --git a/.github/workflows/dogfood-proofs-ci.yml b/.github/workflows/dogfood-proofs-ci.yml index 52779574..c7f492db 100644 --- a/.github/workflows/dogfood-proofs-ci.yml +++ b/.github/workflows/dogfood-proofs-ci.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # Gates the ECHIDNA dogfood proof corpus: every theorem under proofs/{coq,lean,agda} # must type-check. These proofs had no CI coverage before this workflow -- the other diff --git a/.github/workflows/formal-verification.yml b/.github/workflows/formal-verification.yml index e007d657..707454a6 100644 --- a/.github/workflows/formal-verification.yml +++ b/.github/workflows/formal-verification.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # diff --git a/.github/workflows/generator-generic-ossf-slsa3-publish.yml b/.github/workflows/generator-generic-ossf-slsa3-publish.yml index 69bb8947..d11d3d4f 100644 --- a/.github/workflows/generator-generic-ossf-slsa3-publish.yml +++ b/.github/workflows/generator-generic-ossf-slsa3-publish.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # This workflow uses actions that are not certified by GitHub. # They are provided by a third-party and are governed by diff --git a/.github/workflows/ghcr-publish.yml b/.github/workflows/ghcr-publish.yml index b1431b44..7b08de67 100644 --- a/.github/workflows/ghcr-publish.yml +++ b/.github/workflows/ghcr-publish.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. name: Publish to GHCR diff --git a/.github/workflows/governance.yml b/.github/workflows/governance.yml index 0d830b6c..da4c97f9 100644 --- a/.github/workflows/governance.yml +++ b/.github/workflows/governance.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: PMPL-1.0-or-later +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. name: Governance diff --git a/.github/workflows/hypatia-scan.yml b/.github/workflows/hypatia-scan.yml index 91443525..7408eaba 100644 --- a/.github/workflows/hypatia-scan.yml +++ b/.github/workflows/hypatia-scan.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: PMPL-1.0-or-later +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. name: Hypatia Security Scan diff --git a/.github/workflows/idris2-abi-ci.yml b/.github/workflows/idris2-abi-ci.yml index 707d0c13..a24a0614 100644 --- a/.github/workflows/idris2-abi-ci.yml +++ b/.github/workflows/idris2-abi-ci.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. name: Idris2 ABI Type-Check diff --git a/.github/workflows/live-provers.yml b/.github/workflows/live-provers.yml index 31fa39b3..6b2e93c8 100644 --- a/.github/workflows/live-provers.yml +++ b/.github/workflows/live-provers.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # ECHIDNA — Live-Prover CI # diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index 411141eb..2d14e71d 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. name: Mirror to Git Forges diff --git a/.github/workflows/mvp-smoke.yml b/.github/workflows/mvp-smoke.yml index 19810eb8..92fd1d66 100644 --- a/.github/workflows/mvp-smoke.yml +++ b/.github/workflows/mvp-smoke.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. name: MVP Smoke (Best Effort) diff --git a/.github/workflows/rust-ci.yml b/.github/workflows/rust-ci.yml index d4980ca3..e30eb284 100644 --- a/.github/workflows/rust-ci.yml +++ b/.github/workflows/rust-ci.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # Rust CI — thin wrapper calling the shared estate reusable in # hyperpolymath/standards. Configure once, propagate everywhere. diff --git a/.github/workflows/s4-loop.yml b/.github/workflows/s4-loop.yml index 9d4b96f0..4537b41e 100644 --- a/.github/workflows/s4-loop.yml +++ b/.github/workflows/s4-loop.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # S4 loop-closure CI — brings up verisim-api as a service container and # runs the echidna s4_loop_closure integration test. Filed once diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 51152ca5..174ac296 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: PMPL-1.0-or-later +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. name: OSSF Scorecard diff --git a/.github/workflows/secret-scanner.yml b/.github/workflows/secret-scanner.yml index 7b38e6f8..672a2698 100644 --- a/.github/workflows/secret-scanner.yml +++ b/.github/workflows/secret-scanner.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. name: Secret Scanner diff --git a/.github/workflows/security-scan.yml b/.github/workflows/security-scan.yml index 44c6ec0d..58d56448 100644 --- a/.github/workflows/security-scan.yml +++ b/.github/workflows/security-scan.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. name: Security Scan diff --git a/.github/workflows/server-boot-gate.yml b/.github/workflows/server-boot-gate.yml index 9c3807ca..f9f0333d 100644 --- a/.github/workflows/server-boot-gate.yml +++ b/.github/workflows/server-boot-gate.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # Server boot gate — builds the echidna binary, boots the server, and # verifies that /api/health, /api/provers, and a session {id} route all diff --git a/.github/workflows/spark-theatre-gate.yml b/.github/workflows/spark-theatre-gate.yml index 8915f3b5..f581a0e8 100644 --- a/.github/workflows/spark-theatre-gate.yml +++ b/.github/workflows/spark-theatre-gate.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # Estate SPARK Theatre Gate — thin caller of the reusable workflow in # hyperpolymath/standards (#135 / #141). Pinned by commit SHA per the diff --git a/.github/workflows/verification-proofs-cron.yml b/.github/workflows/verification-proofs-cron.yml index 2e5f9f6f..8c9ed337 100644 --- a/.github/workflows/verification-proofs-cron.yml +++ b/.github/workflows/verification-proofs-cron.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # Weekly verification of the heavier self-proof corpora that are too slow and too # network-heavy to gate on every PR: currently Isabelle/HOL (proofs/isabelle). The diff --git a/.github/workflows/workflow-linter.yml b/.github/workflows/workflow-linter.yml index ed0ae72a..bcaea649 100644 --- a/.github/workflows/workflow-linter.yml +++ b/.github/workflows/workflow-linter.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # This workflow is managed by gh actions-lock. # Prevention workflow - validates all workflows have proper security config name: Workflow Security Linter diff --git a/.gitignore b/.gitignore index 0d95b689..e7d095d0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # RSR-compliant .gitignore # OS & Editor diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7e7fdba4..54634b17 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2024-2025 ECHIDNA Project Contributors # # ECHIDNA GitLab CI/CD Pipeline diff --git a/.guix-channel b/.guix-channel index 8ecae4a9..29e94809 100644 --- a/.guix-channel +++ b/.guix-channel @@ -1,4 +1,4 @@ -;; SPDX-License-Identifier: MPL-2.0 +;; SPDX-License-Identifier: AGPL-3.0-or-later ;; Guix channel definition for ECHIDNA (channel (version 0) diff --git a/.machine_readable/ADJUST.contractile b/.machine_readable/ADJUST.contractile index 0b50760c..c82c6685 100644 --- a/.machine_readable/ADJUST.contractile +++ b/.machine_readable/ADJUST.contractile @@ -1,4 +1,4 @@ -; SPDX-License-Identifier: MPL-2.0 +; SPDX-License-Identifier: AGPL-3.0-or-later ; ADJUST.contractile — Accessibility invariants for echidna ; "ADJUST" = Accessibility & Digital Justice for Universal Software & Technology ; diff --git a/.machine_readable/CLADE.a2ml b/.machine_readable/CLADE.a2ml index bd8caffd..ced9d944 100644 --- a/.machine_readable/CLADE.a2ml +++ b/.machine_readable/CLADE.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Clade declaration — part of the gv-clade-index registry [manifest] diff --git a/.machine_readable/ER.a2ml b/.machine_readable/ER.a2ml index 02b133b6..add0fd14 100644 --- a/.machine_readable/ER.a2ml +++ b/.machine_readable/ER.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # ER.a2ml — Canonical Entity-Relationship model for ECHIDNA diff --git a/.machine_readable/INTENT.contractile b/.machine_readable/INTENT.contractile index b46a91fe..70a26a88 100644 --- a/.machine_readable/INTENT.contractile +++ b/.machine_readable/INTENT.contractile @@ -1,4 +1,4 @@ -; SPDX-License-Identifier: MPL-2.0 +; SPDX-License-Identifier: AGPL-3.0-or-later ; INTENT.contractile — Purpose and scope for echidna ; Helps LLM/SLM agents understand what this repo IS and IS NOT. diff --git a/.machine_readable/MUST.contractile b/.machine_readable/MUST.contractile index 6830a6b7..32598cb7 100644 --- a/.machine_readable/MUST.contractile +++ b/.machine_readable/MUST.contractile @@ -1,4 +1,4 @@ -; SPDX-License-Identifier: MPL-2.0 +; SPDX-License-Identifier: AGPL-3.0-or-later ; MUST.contractile — Baseline invariants for echidna ; These constraints MUST NOT be violated. K9 validators enforce them. diff --git a/.machine_readable/ROADMAP.a2ml b/.machine_readable/ROADMAP.a2ml index 25f73840..037f6abc 100644 --- a/.machine_readable/ROADMAP.a2ml +++ b/.machine_readable/ROADMAP.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # ROADMAP.a2ml — 8-Stage Service Architecture for Echidna diff --git a/.machine_readable/TRUST.contractile b/.machine_readable/TRUST.contractile index 1ec8fa5b..4a0564fc 100644 --- a/.machine_readable/TRUST.contractile +++ b/.machine_readable/TRUST.contractile @@ -1,4 +1,4 @@ -; SPDX-License-Identifier: MPL-2.0 +; SPDX-License-Identifier: AGPL-3.0-or-later ; TRUST.contractile — Trust boundaries for echidna ; Defines what LLM/SLM agents are trusted to do without asking. diff --git a/.machine_readable/ai/AI.a2ml b/.machine_readable/ai/AI.a2ml index 7260b8cc..7740cd7e 100644 --- a/.machine_readable/ai/AI.a2ml +++ b/.machine_readable/ai/AI.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # ECHIDNA AI configuration (machine-readable) [metadata] diff --git a/.machine_readable/anchors/ANCHOR.a2ml b/.machine_readable/anchors/ANCHOR.a2ml index 3e25104f..a1c29054 100644 --- a/.machine_readable/anchors/ANCHOR.a2ml +++ b/.machine_readable/anchors/ANCHOR.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Canonical authority anchor for ECHIDNA [anchor] diff --git a/.machine_readable/bot_directives/coverage.a2ml b/.machine_readable/bot_directives/coverage.a2ml index 69796642..639dbae6 100644 --- a/.machine_readable/bot_directives/coverage.a2ml +++ b/.machine_readable/bot_directives/coverage.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # coverage.a2ml — Session coverage tracking diff --git a/.machine_readable/bot_directives/debt.a2ml b/.machine_readable/bot_directives/debt.a2ml index c0238c5d..784d7d6f 100644 --- a/.machine_readable/bot_directives/debt.a2ml +++ b/.machine_readable/bot_directives/debt.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # debt.a2ml — Meander debt list diff --git a/.machine_readable/bot_directives/echidnabot.a2ml b/.machine_readable/bot_directives/echidnabot.a2ml index eda6aa1a..f1dbbcdd 100644 --- a/.machine_readable/bot_directives/echidnabot.a2ml +++ b/.machine_readable/bot_directives/echidnabot.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # echidnabot directive for the echidna repo. diff --git a/.machine_readable/bot_directives/methodology.a2ml b/.machine_readable/bot_directives/methodology.a2ml index 5b74cdd7..eaa7c529 100644 --- a/.machine_readable/bot_directives/methodology.a2ml +++ b/.machine_readable/bot_directives/methodology.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # methodology.a2ml — AI agent methodology configuration diff --git a/.machine_readable/contractiles/INDEX.a2ml b/.machine_readable/contractiles/INDEX.a2ml index 36b9d6f3..cdedfbe4 100644 --- a/.machine_readable/contractiles/INDEX.a2ml +++ b/.machine_readable/contractiles/INDEX.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # INDEX.a2ml — Contractile Registry # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/README.adoc b/.machine_readable/contractiles/README.adoc index 2d78f425..07d79151 100644 --- a/.machine_readable/contractiles/README.adoc +++ b/.machine_readable/contractiles/README.adoc @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: CC-BY-SA-4.0 // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) = Echidna Contractiles Jonathan D.A. Jewell diff --git a/.machine_readable/contractiles/_base.ncl b/.machine_readable/contractiles/_base.ncl index 22306faf..a30c5548 100644 --- a/.machine_readable/contractiles/_base.ncl +++ b/.machine_readable/contractiles/_base.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) # # _base.ncl — Shared contractile base diff --git a/.machine_readable/contractiles/adjust/Adjustfile.a2ml b/.machine_readable/contractiles/adjust/Adjustfile.a2ml index 97204d6f..be275c56 100644 --- a/.machine_readable/contractiles/adjust/Adjustfile.a2ml +++ b/.machine_readable/contractiles/adjust/Adjustfile.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Adjustfile (A2ML Canonical) # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/.machine_readable/contractiles/adjust/adjust.k9.ncl b/.machine_readable/contractiles/adjust/adjust.k9.ncl index 4974ba7f..6b8ecded 100644 --- a/.machine_readable/contractiles/adjust/adjust.k9.ncl +++ b/.machine_readable/contractiles/adjust/adjust.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # adjust.k9.ncl — K9 trust-tier component of the adjust trident # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/adjust/adjust.manifest.a2ml b/.machine_readable/contractiles/adjust/adjust.manifest.a2ml index f28f94d0..e23d57bf 100644 --- a/.machine_readable/contractiles/adjust/adjust.manifest.a2ml +++ b/.machine_readable/contractiles/adjust/adjust.manifest.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # adjust.manifest.a2ml — Trident coherence manifest for the adjust verb. # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/adjust/adjust.ncl b/.machine_readable/contractiles/adjust/adjust.ncl index d6c24f0e..cdceb191 100644 --- a/.machine_readable/contractiles/adjust/adjust.ncl +++ b/.machine_readable/contractiles/adjust/adjust.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Adjust — accessibility runner # # Pairs with: Adjustfile.a2ml (same directory) diff --git a/.machine_readable/contractiles/bust/Bustfile.a2ml b/.machine_readable/contractiles/bust/Bustfile.a2ml index b356c5e9..cbf5f1ec 100644 --- a/.machine_readable/contractiles/bust/Bustfile.a2ml +++ b/.machine_readable/contractiles/bust/Bustfile.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Bustfile (A2ML Canonical) # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/.machine_readable/contractiles/bust/bust.k9.ncl b/.machine_readable/contractiles/bust/bust.k9.ncl index 0740076b..36f1ea63 100644 --- a/.machine_readable/contractiles/bust/bust.k9.ncl +++ b/.machine_readable/contractiles/bust/bust.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # bust.k9.ncl — K9 trust-tier component of the bust trident # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/bust/bust.manifest.a2ml b/.machine_readable/contractiles/bust/bust.manifest.a2ml index f8c8ac46..fa1d5eba 100644 --- a/.machine_readable/contractiles/bust/bust.manifest.a2ml +++ b/.machine_readable/contractiles/bust/bust.manifest.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # bust.manifest.a2ml — Trident coherence manifest for the bust verb. # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/bust/bust.ncl b/.machine_readable/contractiles/bust/bust.ncl index fc8cb8cd..8fc9106f 100644 --- a/.machine_readable/contractiles/bust/bust.ncl +++ b/.machine_readable/contractiles/bust/bust.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Bust — error-handling / failure-recovery runner # # Pairs with: Bustfile.a2ml (same directory) diff --git a/.machine_readable/contractiles/dust/Dustfile.a2ml b/.machine_readable/contractiles/dust/Dustfile.a2ml index 29609258..8d336653 100644 --- a/.machine_readable/contractiles/dust/Dustfile.a2ml +++ b/.machine_readable/contractiles/dust/Dustfile.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Dustfile (A2ML Canonical) # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/.machine_readable/contractiles/dust/dust.k9.ncl b/.machine_readable/contractiles/dust/dust.k9.ncl index 0e06cbd5..70298aab 100644 --- a/.machine_readable/contractiles/dust/dust.k9.ncl +++ b/.machine_readable/contractiles/dust/dust.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # dust.k9.ncl — K9 trust-tier component of the dust trident # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/dust/dust.manifest.a2ml b/.machine_readable/contractiles/dust/dust.manifest.a2ml index fd9c3efa..816b2c45 100644 --- a/.machine_readable/contractiles/dust/dust.manifest.a2ml +++ b/.machine_readable/contractiles/dust/dust.manifest.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # dust.manifest.a2ml — Trident coherence manifest for the dust verb. # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/dust/dust.ncl b/.machine_readable/contractiles/dust/dust.ncl index 204cb6b8..c37cacef 100644 --- a/.machine_readable/contractiles/dust/dust.ncl +++ b/.machine_readable/contractiles/dust/dust.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Dust — fine-grained recovery / broom-and-pan cleanup runner # # Pairs with: Dustfile.a2ml (same directory) diff --git a/.machine_readable/contractiles/intend/Intentfile.a2ml b/.machine_readable/contractiles/intend/Intentfile.a2ml index 142c083f..9f9903f5 100644 --- a/.machine_readable/contractiles/intend/Intentfile.a2ml +++ b/.machine_readable/contractiles/intend/Intentfile.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Intentfile (A2ML Canonical) # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/.machine_readable/contractiles/intend/intend.k9.ncl b/.machine_readable/contractiles/intend/intend.k9.ncl index 59c4d48e..83ad7b3c 100644 --- a/.machine_readable/contractiles/intend/intend.k9.ncl +++ b/.machine_readable/contractiles/intend/intend.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # intend.k9.ncl — K9 trust-tier component of the intend trident # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/intend/intend.manifest.a2ml b/.machine_readable/contractiles/intend/intend.manifest.a2ml index b9b07478..24c680d7 100644 --- a/.machine_readable/contractiles/intend/intend.manifest.a2ml +++ b/.machine_readable/contractiles/intend/intend.manifest.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # intend.manifest.a2ml — Trident coherence manifest for the intend verb. # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/intend/intend.ncl b/.machine_readable/contractiles/intend/intend.ncl index 2bace3be..c89592b2 100644 --- a/.machine_readable/contractiles/intend/intend.ncl +++ b/.machine_readable/contractiles/intend/intend.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Intend — north-star runner (verb is `intend`, file is `Intentfile.a2ml`) # # Pairs with: Intentfile.a2ml (same directory) diff --git a/.machine_readable/contractiles/must/Mustfile.a2ml b/.machine_readable/contractiles/must/Mustfile.a2ml index 527ff777..474eff82 100644 --- a/.machine_readable/contractiles/must/Mustfile.a2ml +++ b/.machine_readable/contractiles/must/Mustfile.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Mustfile (A2ML Canonical) # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/.machine_readable/contractiles/must/must.k9.ncl b/.machine_readable/contractiles/must/must.k9.ncl index 2a7224ac..6bdb3c23 100644 --- a/.machine_readable/contractiles/must/must.k9.ncl +++ b/.machine_readable/contractiles/must/must.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # must.k9.ncl — K9 trust-tier component of the must trident # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/must/must.manifest.a2ml b/.machine_readable/contractiles/must/must.manifest.a2ml index c4225ad4..49eee394 100644 --- a/.machine_readable/contractiles/must/must.manifest.a2ml +++ b/.machine_readable/contractiles/must/must.manifest.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # must.manifest.a2ml — Trident coherence manifest for the must verb. # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/must/must.ncl b/.machine_readable/contractiles/must/must.ncl index 416441c0..1a7b7f6e 100644 --- a/.machine_readable/contractiles/must/must.ncl +++ b/.machine_readable/contractiles/must/must.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Must — invariants runner # # Pairs with: Mustfile.a2ml (same directory) diff --git a/.machine_readable/contractiles/trust/Trustfile.a2ml b/.machine_readable/contractiles/trust/Trustfile.a2ml index 9ebf11d1..a0828f4b 100644 --- a/.machine_readable/contractiles/trust/Trustfile.a2ml +++ b/.machine_readable/contractiles/trust/Trustfile.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Trustfile (A2ML Canonical) # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/.machine_readable/contractiles/trust/trust.k9.ncl b/.machine_readable/contractiles/trust/trust.k9.ncl index fd0f5eb3..973fbc76 100644 --- a/.machine_readable/contractiles/trust/trust.k9.ncl +++ b/.machine_readable/contractiles/trust/trust.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # trust.k9.ncl — K9 trust-tier component of the trust trident # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/trust/trust.manifest.a2ml b/.machine_readable/contractiles/trust/trust.manifest.a2ml index 142e8528..7b659829 100644 --- a/.machine_readable/contractiles/trust/trust.manifest.a2ml +++ b/.machine_readable/contractiles/trust/trust.manifest.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # trust.manifest.a2ml — Trident coherence manifest for the trust verb. # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/trust/trust.ncl b/.machine_readable/contractiles/trust/trust.ncl index 5ff0e139..6404bc65 100644 --- a/.machine_readable/contractiles/trust/trust.ncl +++ b/.machine_readable/contractiles/trust/trust.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Trust — security + provenance + safe-hacking runner # # Pairs with: Trustfile.a2ml (same directory) diff --git a/.machine_readable/deployment.a2ml b/.machine_readable/deployment.a2ml index b72e237c..97890a12 100644 --- a/.machine_readable/deployment.a2ml +++ b/.machine_readable/deployment.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # deployment.a2ml — public hosting topology for ECHIDNA. diff --git a/.machine_readable/descriptiles/AGENTIC.a2ml b/.machine_readable/descriptiles/AGENTIC.a2ml index c855c1e3..17ba7cd1 100644 --- a/.machine_readable/descriptiles/AGENTIC.a2ml +++ b/.machine_readable/descriptiles/AGENTIC.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # AGENTIC.a2ml — AI agent operational gating and proof-solving dispatch diff --git a/.machine_readable/descriptiles/ANCHOR.a2ml b/.machine_readable/descriptiles/ANCHOR.a2ml index dec155a1..c3842d24 100644 --- a/.machine_readable/descriptiles/ANCHOR.a2ml +++ b/.machine_readable/descriptiles/ANCHOR.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # ⚓ ANCHOR: rsr-template-repo # Canonical authority and project recalibration trigger for rsr-template-repo. # Template from: https://github.com/hyperpolymath/standards diff --git a/.machine_readable/descriptiles/ECOSYSTEM.a2ml b/.machine_readable/descriptiles/ECOSYSTEM.a2ml index 9405b21f..7c3a7393 100644 --- a/.machine_readable/descriptiles/ECOSYSTEM.a2ml +++ b/.machine_readable/descriptiles/ECOSYSTEM.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # ECOSYSTEM.a2ml — Ecosystem position for echidna diff --git a/.machine_readable/descriptiles/META.a2ml b/.machine_readable/descriptiles/META.a2ml index 8a2759b4..2e4c2fed 100644 --- a/.machine_readable/descriptiles/META.a2ml +++ b/.machine_readable/descriptiles/META.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # META.a2ml — Project meta-information # Converted from META.scm on 2026-03-15 diff --git a/.machine_readable/descriptiles/NEUROSYM.a2ml b/.machine_readable/descriptiles/NEUROSYM.a2ml index 71813dd1..a22c0530 100644 --- a/.machine_readable/descriptiles/NEUROSYM.a2ml +++ b/.machine_readable/descriptiles/NEUROSYM.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # NEUROSYM.a2ml — Neurosymbolic semantics for proof-solving operations diff --git a/.machine_readable/descriptiles/PLAYBOOK.a2ml b/.machine_readable/descriptiles/PLAYBOOK.a2ml index e9b3b981..b4dbb664 100644 --- a/.machine_readable/descriptiles/PLAYBOOK.a2ml +++ b/.machine_readable/descriptiles/PLAYBOOK.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # PLAYBOOK.a2ml — Operational playbook diff --git a/.machine_readable/descriptiles/STATE.a2ml b/.machine_readable/descriptiles/STATE.a2ml index 7e6cda40..afdff1c4 100644 --- a/.machine_readable/descriptiles/STATE.a2ml +++ b/.machine_readable/descriptiles/STATE.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # STATE.a2ml — Project state checkpoint [manifest] diff --git a/.machine_readable/integrations/feedback-o-tron.a2ml b/.machine_readable/integrations/feedback-o-tron.a2ml index 5381604e..0a8bb783 100644 --- a/.machine_readable/integrations/feedback-o-tron.a2ml +++ b/.machine_readable/integrations/feedback-o-tron.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Feedback-o-Tron Integration — Autonomous Bug Reporting [integration] diff --git a/.machine_readable/integrations/proven.a2ml b/.machine_readable/integrations/proven.a2ml index 0f9138ce..2807f00d 100644 --- a/.machine_readable/integrations/proven.a2ml +++ b/.machine_readable/integrations/proven.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Proven Integration — Formally Verified Safety Library [integration] diff --git a/.machine_readable/integrations/verisim.a2ml b/.machine_readable/integrations/verisim.a2ml index 164c5229..141fa265 100644 --- a/.machine_readable/integrations/verisim.a2ml +++ b/.machine_readable/integrations/verisim.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # VeriSimDB Feed — Cross-Repo Analytics Data Store [integration] diff --git a/.machine_readable/integrations/vexometer.a2ml b/.machine_readable/integrations/vexometer.a2ml index 238b3d2c..e1081208 100644 --- a/.machine_readable/integrations/vexometer.a2ml +++ b/.machine_readable/integrations/vexometer.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Vexometer Integration — Irritation Surface Analysis [integration] diff --git a/.machine_readable/policies/MAINTENANCE-AXES.a2ml b/.machine_readable/policies/MAINTENANCE-AXES.a2ml index 1589ab77..c6ba2071 100644 --- a/.machine_readable/policies/MAINTENANCE-AXES.a2ml +++ b/.machine_readable/policies/MAINTENANCE-AXES.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # ECHIDNA Maintenance Axes [metadata] diff --git a/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml b/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml index bb35329b..15bcb9d7 100644 --- a/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml +++ b/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # ECHIDNA Maintenance Checklist (machine-readable pointer) [metadata] diff --git a/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml b/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml index 733b987a..3fc8ac02 100644 --- a/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml +++ b/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # ECHIDNA Software Development Approach (machine-readable pointer) [metadata] diff --git a/.machine_readable/provers.a2ml b/.machine_readable/provers.a2ml index 30abeb4a..b1ce0b61 100644 --- a/.machine_readable/provers.a2ml +++ b/.machine_readable/provers.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # provers.a2ml — Authoritative enumeration of ECHIDNA prover backends. diff --git a/.machine_readable/setup-prover-env.k9.ncl b/.machine_readable/setup-prover-env.k9.ncl index 4354ae8b..b1ae19e8 100644 --- a/.machine_readable/setup-prover-env.k9.ncl +++ b/.machine_readable/setup-prover-env.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # ECHIDNA Theorem Prover Environment Setup # # This K9 component automates the installation and configuration of ECHIDNA's diff --git a/.machine_readable/svc/k9/examples/ci-config.k9.ncl b/.machine_readable/svc/k9/examples/ci-config.k9.ncl index 485a9173..996ac0ab 100644 --- a/.machine_readable/svc/k9/examples/ci-config.k9.ncl +++ b/.machine_readable/svc/k9/examples/ci-config.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Example Yard-level K9 component: CI/CD configuration with validation # Security Level: Yard (Nickel evaluation, contract validation) # Signature recommended but not required diff --git a/.machine_readable/svc/k9/examples/project-metadata.k9.ncl b/.machine_readable/svc/k9/examples/project-metadata.k9.ncl index f5bec22b..32bf5db7 100644 --- a/.machine_readable/svc/k9/examples/project-metadata.k9.ncl +++ b/.machine_readable/svc/k9/examples/project-metadata.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Example Kennel-level K9 component: Project metadata # Security Level: Kennel (pure data, no execution) # No signature required diff --git a/.machine_readable/svc/k9/examples/setup-repo.k9.ncl b/.machine_readable/svc/k9/examples/setup-repo.k9.ncl index 45eef0e6..d1a10aea 100644 --- a/.machine_readable/svc/k9/examples/setup-repo.k9.ncl +++ b/.machine_readable/svc/k9/examples/setup-repo.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Example Hunt-level K9 component: Repository setup automation # Security Level: Hunt (full execution with Just recipes) # ⚠️ SIGNATURE REQUIRED - DO NOT RUN WITHOUT VERIFICATION diff --git a/.machine_readable/svc/k9/template-hunt.k9.ncl b/.machine_readable/svc/k9/template-hunt.k9.ncl index e12eabfe..77ce03a6 100644 --- a/.machine_readable/svc/k9/template-hunt.k9.ncl +++ b/.machine_readable/svc/k9/template-hunt.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # K9 Hunt-level template: Full execution with Just recipes # Security Level: Hunt (full system access) # ⚠️ SIGNATURE REQUIRED - Review carefully before use diff --git a/.machine_readable/svc/k9/template-kennel.k9.ncl b/.machine_readable/svc/k9/template-kennel.k9.ncl index 0c0f9364..0714d717 100644 --- a/.machine_readable/svc/k9/template-kennel.k9.ncl +++ b/.machine_readable/svc/k9/template-kennel.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # K9 Kennel-level template: Pure data configuration # Security Level: Kennel (kennel, no execution) # No signature required - safe for any use diff --git a/.machine_readable/svc/k9/template-yard.k9.ncl b/.machine_readable/svc/k9/template-yard.k9.ncl index ede10a8f..d95dbc50 100644 --- a/.machine_readable/svc/k9/template-yard.k9.ncl +++ b/.machine_readable/svc/k9/template-yard.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # K9 Yard-level template: Configuration with validation # Security Level: Yard (Nickel evaluation with contracts) # Signature recommended but not required diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9088b338..59d5bc80 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Pre-commit hooks for hyperpolymath RSR repos. # Install: pip install pre-commit && pre-commit install # Run manually: pre-commit run --all-files diff --git a/.reuse/dep5 b/.reuse/dep5 index 46d40f39..768d5492 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -1,74 +1,87 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: ECHIDNA -Upstream-Contact: ECHIDNA Project Team +Upstream-Contact: Jonathan D.A. Jewell Source: https://github.com/hyperpolymath/echidna -# Core source code - dual licensed -Files: src/* Cargo.toml Cargo.lock Justfile -Copyright: 2024-2025 ECHIDNA Project Contributors -License: PMPL-1.0 AND Palimpsest-0.6 +# ECHIDNA is licensed in three parts. See NOTICE for the rationale and for +# why the MPL-2.0 component is compatible with the AGPL umbrella +# (MPL-2.0 section 3.3, Secondary Licenses). +# +# Per-file SPDX-License-Identifier headers are authoritative. The stanzas +# below are the REUSE bulk fallback for files that carry no header. -# Rust source files -Files: src/rust/*.rs src/rust/**/*.rs -Copyright: 2024-2025 ECHIDNA Project Contributors -License: PMPL-1.0 AND Palimpsest-0.6 +# --------------------------------------------------------------------------- +# 1. Code — AGPL-3.0-or-later +# --------------------------------------------------------------------------- -# Julia source files -Files: src/julia/*.jl src/julia/**/*.jl Project.toml Manifest.toml -Copyright: 2024-2025 ECHIDNA Project Contributors -License: PMPL-1.0 AND Palimpsest-0.6 +Files: src/* + crates/* + ffi/* + proofs/* + spark/* + verification/* + scripts/* + hooks/* + .githooks/* + tests/* + meta-checker/* + HOL-o-extension/* + docs-site/* + generated/* + schemas/* + rules/* + training_data/* + deploy/* + container/* + .containerization/* + .clusterfuzzlite/* + .machine_readable/* + .github/* + .well-known/* + guix/* + guix-channel/* + manifests/* + Cargo.toml + Cargo.lock + Justfile + Mustfile + Containerfile + contractile.just + guix.scm + 0-AI-MANIFEST.a2ml +Copyright: 2024-2026 Jonathan D.A. Jewell and ECHIDNA Project Contributors +License: AGPL-3.0-or-later -# ReScript source files -Files: src/rescript/*.res src/rescript/**/*.res src/rescript/*.resi -Copyright: 2024-2025 ECHIDNA Project Contributors -License: PMPL-1.0 AND Palimpsest-0.6 +# --------------------------------------------------------------------------- +# 2. Documentation — CC-BY-SA-4.0 +# --------------------------------------------------------------------------- -# Mercury/Logtalk source files (if present) -Files: src/mercury/*.m src/mercury/**/*.m -Copyright: 2024-2025 ECHIDNA Project Contributors -License: PMPL-1.0 AND Palimpsest-0.6 +Files: docs/* + *.md + *.adoc +Copyright: 2024-2026 Jonathan D.A. Jewell and ECHIDNA Project Contributors +License: CC-BY-SA-4.0 -# Documentation files -Files: docs/* *.md README.md CONTRIBUTING.md CHANGELOG.md AUTHORS.md -Copyright: 2024-2025 ECHIDNA Project Contributors -License: PMPL-1.0 AND Palimpsest-0.6 +# --------------------------------------------------------------------------- +# 3. Coq-Jr playground — MPL-2.0, NOT relicensed +# +# Carries contributions from Coq-Jr Contributors rather than the ECHIDNA +# project. Sits under the AGPL umbrella via MPL-2.0 section 3.3 while +# remaining individually available under MPL-2.0. +# --------------------------------------------------------------------------- -# Configuration files -Files: .gitlab-ci.yml Containerfile .editorconfig rustfmt.toml codecov.yml .trivyignore -Copyright: 2024-2025 ECHIDNA Project Contributors -License: PMPL-1.0 AND Palimpsest-0.6 +Files: echidna-playground/* +Copyright: 2024-2026 Coq-Jr Contributors and Jonathan D.A. Jewell +License: MPL-2.0 -# GitLab templates -Files: .gitlab/* .gitlab/**/* -Copyright: 2024-2025 ECHIDNA Project Contributors -License: PMPL-1.0 AND Palimpsest-0.6 +# --------------------------------------------------------------------------- +# 4. Licence reference material — left as-is +# +# Licence texts and their exhibits are reference documents; their own +# headers are not rewritten by licensing sweeps. +# --------------------------------------------------------------------------- -# Test files -Files: tests/* tests/**/* -Copyright: 2024-2025 ECHIDNA Project Contributors -License: PMPL-1.0 AND Palimpsest-0.6 - -# Example files and proofs -Files: examples/* proofs/* proofs/**/* -Copyright: 2024-2025 ECHIDNA Project Contributors -License: PMPL-1.0 AND Palimpsest-0.6 - -# Scripts -Files: scripts/*.sh scripts/*.jl -Copyright: 2024-2025 ECHIDNA Project Contributors -License: PMPL-1.0 AND Palimpsest-0.6 - -# Build artifacts and generated files (excluded from licensing) -Files: target/* .cargo/* .julia/* *.lock -Copyright: 2024-2025 ECHIDNA Project Contributors -License: PMPL-1.0 AND Palimpsest-0.6 - -# Git and IDE configuration (public domain / CC0) -Files: .gitignore .gitattributes -Copyright: 2024-2025 ECHIDNA Project Contributors -License: CC0-1.0 - -# License files themselves Files: LICENSES/* -Copyright: Various (see individual license files) -License: PMPL-1.0 AND Palimpsest-0.6 + docs/legal/* +Copyright: 2024-2026 Jonathan D.A. Jewell +License: CC-BY-SA-4.0 diff --git a/.trivyignore b/.trivyignore index e9a06537..e76e857d 100644 --- a/.trivyignore +++ b/.trivyignore @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 AND Palimpsest-0.6 +# SPDX-License-Identifier: AGPL-3.0-or-later AND Palimpsest-0.6 # SPDX-FileCopyrightText: 2024-2025 ECHIDNA Project Contributors # # Trivy ignore file for ECHIDNA diff --git a/.well-known/ai.txt b/.well-known/ai.txt index a5248f3a..0104e7de 100644 --- a/.well-known/ai.txt +++ b/.well-known/ai.txt @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # ai.txt - AI agent instructions for ECHIDNA # See https://site.spawning.ai/ai-txt diff --git a/.well-known/humans.txt b/.well-known/humans.txt index bb38b6d6..0c8e87a4 100644 --- a/.well-known/humans.txt +++ b/.well-known/humans.txt @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # humans.txt - The humans behind ECHIDNA # See https://humanstxt.org/ diff --git a/.well-known/security.txt b/.well-known/security.txt index 2052d028..e8aab6b0 100644 --- a/.well-known/security.txt +++ b/.well-known/security.txt @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Security contact for ECHIDNA # See https://securitytxt.org/ diff --git a/0-AI-MANIFEST.a2ml b/0-AI-MANIFEST.a2ml index 5714e154..583422b4 100644 --- a/0-AI-MANIFEST.a2ml +++ b/0-AI-MANIFEST.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) # # 0-AI-MANIFEST.a2ml — Universal AI Agent Entry Point diff --git a/CLAUDE.md b/CLAUDE.md index ed37ebcc..7e0d89da 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,7 +8,9 @@ Guidelines and context for working with Claude Code on the ECHIDNA project. - **Repository**: https://github.com/hyperpolymath/echidna - **Version + release history**: [`CHANGELOG.md`](CHANGELOG.md) (single source of truth; do not duplicate version strings elsewhere) -- **License**: AGPL-3.0-or-later (owner decision 2026-07-07; per-file MPL-2.0 headers pending migration sweep) +- **License**: AGPL-3.0-or-later for code, CC-BY-SA-4.0 for documentation, + MPL-2.0 for `echidna-playground/` — see [`NOTICE`](NOTICE) for why the MPL + component is compatible (MPL §3.3 Secondary Licenses) - **Architecture overview**: [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) - **Canonical prover count + tier table**: [`docs/PROVER_COUNT.md`](docs/PROVER_COUNT.md) - **Known debt (licence, docs, code)**: [`docs/DEBT.md`](docs/DEBT.md) — read before @@ -207,7 +209,13 @@ in `.github/workflows/`: - **RSR / CCCP compliance** — see [`RSR_COMPLIANCE.adoc`](RSR_COMPLIANCE.adoc) for the full hard-rule list and out-of-template adaptations. - **Justfile primary** (RSR-H14) — Just is the build entry point; no Make. - **Podman not Docker** (RSR-H15) — always Podman; `Containerfile` (not `Dockerfile`); `.containerization/Containerfile.wave3` for per-prover images. -- **License**: project licence is AGPL-3.0-or-later (owner decision 2026-07-07, matching `Cargo.toml`); documentation surface keeps its MPL-2.0 headers (intentional doc stance; see [`feedback_echidna_license_docs_mpl_intentional`](https://github.com/hyperpolymath/echidna/issues?q=license) — per-file header drift is owner-managed and not reconciled in routine PRs). +- **License**: three parts, reconciled 2026-08 — **code** AGPL-3.0-or-later + (matching `LICENSE` and `Cargo.toml`), **documentation** CC-BY-SA-4.0, and + **`echidna-playground/`** MPL-2.0 (Coq-Jr contributions, deliberately not + relicensed; compatible under MPL §3.3). Per-file SPDX headers are + authoritative and now match this split. When adding a file, use the licence + of the part of the tree it sits in — do not copy a header from elsewhere. + Rationale and the compatibility argument: [`NOTICE`](NOTICE). - **Author**: Jonathan D.A. Jewell . --- diff --git a/Cargo.toml b/Cargo.toml index 103c9102..d113a867 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later [package] name = "echidna" diff --git a/Containerfile b/Containerfile index 10e7ad6c..1b0560d5 100644 --- a/Containerfile +++ b/Containerfile @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2024-2026 Jonathan D.A. Jewell # # ECHIDNA Minimal Container Image diff --git a/GOVERNANCE.adoc b/GOVERNANCE.adoc index 9cb1b9cd..f893c5ca 100644 --- a/GOVERNANCE.adoc +++ b/GOVERNANCE.adoc @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: CC-BY-SA-4.0 // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell = Governance Model :toc: preamble diff --git a/HOL-o-extension/.machine_readable/6a2/ECOSYSTEM.a2ml b/HOL-o-extension/.machine_readable/6a2/ECOSYSTEM.a2ml index dbc89993..5a833e7b 100644 --- a/HOL-o-extension/.machine_readable/6a2/ECOSYSTEM.a2ml +++ b/HOL-o-extension/.machine_readable/6a2/ECOSYSTEM.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # ECOSYSTEM.a2ml — HOL O Extension ecosystem position diff --git a/HOL-o-extension/.machine_readable/6a2/META.a2ml b/HOL-o-extension/.machine_readable/6a2/META.a2ml index 80c68d79..739999d3 100644 --- a/HOL-o-extension/.machine_readable/6a2/META.a2ml +++ b/HOL-o-extension/.machine_readable/6a2/META.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # META.a2ml — HOL O Extension meta-level information diff --git a/HOL-o-extension/.machine_readable/6a2/STATE.a2ml b/HOL-o-extension/.machine_readable/6a2/STATE.a2ml index 938b7b8a..0534e121 100644 --- a/HOL-o-extension/.machine_readable/6a2/STATE.a2ml +++ b/HOL-o-extension/.machine_readable/6a2/STATE.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # STATE.a2ml — HOL O Extension project state diff --git a/HOL-o-extension/0-AI-MANIFEST.a2ml b/HOL-o-extension/0-AI-MANIFEST.a2ml index f739ab73..4456de3c 100644 --- a/HOL-o-extension/0-AI-MANIFEST.a2ml +++ b/HOL-o-extension/0-AI-MANIFEST.a2ml @@ -1,4 +1,4 @@ -;; SPDX-License-Identifier: MPL-2.0 +;; SPDX-License-Identifier: AGPL-3.0-or-later ;; 0-AI-MANIFEST.a2ml — HOL-o-extension AI Manifest ;; ;; This is an o-extension (optional-extension) for the HOL Theorem Prover. diff --git a/HOL-o-extension/activate.sh b/HOL-o-extension/activate.sh index 0645078a..ef170322 100755 --- a/HOL-o-extension/activate.sh +++ b/HOL-o-extension/activate.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # activate.sh — Enable the HOL-o-extension overlay # diff --git a/HOL-o-extension/overlays/default.sml b/HOL-o-extension/overlays/default.sml index 743c0b8c..23af10f7 100644 --- a/HOL-o-extension/overlays/default.sml +++ b/HOL-o-extension/overlays/default.sml @@ -1,4 +1,4 @@ -(* SPDX-License-Identifier: MPL-2.0 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later *) (* default.sml — Base overlay configuration for HOL-o-extension * * This overlay is always applied when the o-extension is active. diff --git a/HOL-o-extension/overlays/security.sml b/HOL-o-extension/overlays/security.sml index 35514e67..295d665e 100644 --- a/HOL-o-extension/overlays/security.sml +++ b/HOL-o-extension/overlays/security.sml @@ -1,4 +1,4 @@ -(* SPDX-License-Identifier: MPL-2.0 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later *) (* security.sml — Security-focused overlay for HOL-o-extension * * Adds theories and tactics for security protocol verification, diff --git a/HOL-o-extension/tactics/neurosymbolicTac.sml b/HOL-o-extension/tactics/neurosymbolicTac.sml index 701838fe..2b02e140 100644 --- a/HOL-o-extension/tactics/neurosymbolicTac.sml +++ b/HOL-o-extension/tactics/neurosymbolicTac.sml @@ -1,4 +1,4 @@ -(* SPDX-License-Identifier: MPL-2.0 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later *) (* neurosymbolicTac.sml — Neurosymbolic tactics for ECHIDNA * * Provides HOL4 tactics that integrate with ECHIDNA's ML-guided diff --git a/HOL-o-extension/theories/echidnaTrustScript.sml b/HOL-o-extension/theories/echidnaTrustScript.sml index 384ede5e..cc574ec2 100644 --- a/HOL-o-extension/theories/echidnaTrustScript.sml +++ b/HOL-o-extension/theories/echidnaTrustScript.sml @@ -1,4 +1,4 @@ -(* SPDX-License-Identifier: MPL-2.0 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later *) (* echidnaTrustScript.sml — Trust level theory for ECHIDNA * * Formalises ECHIDNA's 5-level trust hierarchy in HOL4: diff --git a/LICENSE b/LICENSE index 78c37b74..be3f7b28 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,3 @@ -SPDX-License-Identifier: AGPL-3.0-or-later - GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 diff --git a/Mustfile b/Mustfile index 5f075413..afc11b5b 100644 --- a/Mustfile +++ b/Mustfile @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Mustfile - hyperpolymath mandatory checks # See: https://github.com/hyperpolymath/mustfile diff --git a/NOTICE b/NOTICE index 97322d90..7ddb3699 100644 --- a/NOTICE +++ b/NOTICE @@ -1,16 +1,61 @@ ECHIDNA - Extensible Cognitive Hybrid Intelligence for Deductive Neural Assistance Copyright (c) 2024-2026 Jonathan D.A. Jewell and ECHIDNA Project Contributors -This project is licensed under the Mozilla Public License, version 2.0 -(MPL-2.0). +LICENSING - Full text: LICENSE (also in LICENSES/MPL-2.0.txt) - SPDX-License-Identifier: MPL-2.0 +This project is licensed under the GNU Affero General Public License, +version 3 or later (AGPL-3.0-or-later). -The project migrated from a dual MIT/Palimpsest-0.6 licence to MPL-2.0 in -2026. Source files retain SPDX-License-Identifier: MPL-2.0 headers; the -historical licence texts under LICENSES/ are kept only for any archival -artefact that still bears an older SPDX tag. + Full text: LICENSE (also in LICENSES/AGPL-3.0-or-later.txt) + SPDX-License-Identifier: AGPL-3.0-or-later + +Three licences apply, to three distinct parts of the tree. This is deliberate, +not drift: + + 1. CODE AGPL-3.0-or-later + Everything under src/, crates/, ffi/, proofs/, spark/, verification/, + scripts/, hooks/, the build system, the CI workflows, and the + machine-readable metadata. This is the project's own code, and the + AGPL's network clause applies: if you run a modified ECHIDNA as a + network service, you must offer your users the modified source. + + 2. DOCUMENTATION CC-BY-SA-4.0 + Everything under docs/, plus the top-level Markdown and AsciiDoc + documents. Share-alike attribution terms, so the prose can be quoted, + translated and adapted independently of the code. + + 3. echidna-playground/ MPL-2.0 + The Coq-Jr playground sub-project, which carries contributions from + Coq-Jr Contributors rather than the ECHIDNA project. It remains under + the Mozilla Public License 2.0 and is NOT relicensed. + +WHY THE MPL COMPONENT IS COMPATIBLE + +MPL-2.0 section 3.3 designates the GNU licences - including +AGPL-3.0-or-later - as "Secondary Licenses". MPL-covered files may therefore +be combined into this AGPL-licensed work, and the combined work distributed +under the AGPL, while those files individually remain available under the +MPL. No file in this repository carries the MPL Exhibit B +"Incompatible With Secondary Licenses" notice, which would have prevented +this. + +In short: the whole distributed work is AGPL-3.0-or-later. If you extract +echidna-playground/ on its own, you may use it under MPL-2.0. + +A small number of files additionally offer Palimpsest-0.6 as an alternative +or additional grant (`AGPL-3.0-or-later OR Palimpsest-0.6`, or `... AND ...`). +Those grants are preserved as originally made. Note that the Palimpsest-0.6 +licence text is not currently distributed with this repository - see +docs/DEBT.md. + +LICENCE HISTORY + + dual MIT / Palimpsest-0.6 -> MPL-2.0 -> AGPL-3.0-or-later (2026) + +The AGPL decision was taken by the project owner in 2026; the per-file SPDX +headers were reconciled to match it in 2026-08. Documents predating that +reconciliation may describe the project as MPL-2.0; LICENSE and this file are +authoritative. ================================================================================ @@ -36,7 +81,10 @@ Theorem provers (integrated, not redistributed): PVS GPL-2.0 ACL2 BSD-3-Clause HOL4 BSD-3-Clause - (...and 93 other backends; see docs/SUPPORTED_PROVERS.md) + (...and the remaining backends; see docs/SUPPORTED_PROVERS.md) + +Provers are invoked as external binaries, not linked or redistributed, so +their licences do not propagate to this work. ================================================================================ @@ -44,12 +92,17 @@ REUSE COMPLIANCE This project follows the REUSE Software Licensing specification. - .reuse/dep5 bulk copyright declarations - per-file headers SPDX-License-Identifier: MPL-2.0 - LICENSES/MPL-2.0.txt full licence text + .reuse/dep5 bulk copyright declarations + per-file headers SPDX-License-Identifier, per the + three-part split described above + LICENSES/AGPL-3.0-or-later.txt code + LICENSES/CC-BY-SA-4.0.txt documentation + LICENSES/MPL-2.0.txt echidna-playground/ Verify locally: `reuse lint` +Known gaps are recorded in docs/DEBT.md rather than left silent. + ================================================================================ RSR / CCCP COMPLIANCE @@ -60,12 +113,14 @@ See RSR_COMPLIANCE.adoc at repo root. CONTRIBUTIONS -All contributions to this project are licensed under MPL-2.0 unless -explicitly stated otherwise. See CONTRIBUTING.md. +Contributions to the code are licensed under AGPL-3.0-or-later; contributions +to the documentation under CC-BY-SA-4.0; contributions to +echidna-playground/ under MPL-2.0. See CONTRIBUTING.adoc. By contributing, you certify that: 1. You have the right to submit the contribution. - 2. You agree to license it under MPL-2.0. + 2. You agree to license it under the licence governing that part of the + tree, as set out above. 3. You understand the contribution will be publicly available. ================================================================================ @@ -87,7 +142,7 @@ If you use this software in academic work, please cite: author = {Jonathan D.A. Jewell and ECHIDNA Project Contributors}, year = {2026}, url = {https://github.com/hyperpolymath/echidna}, - license = {MPL-2.0}, + license = {AGPL-3.0-or-later}, } See CITATION.cff for machine-readable metadata and docs/CITATIONS.adoc for @@ -103,5 +158,4 @@ Documentation: docs/ + RSR_COMPLIANCE.adoc + CLAUDE.md ================================================================================ -Last updated: 2026-05-25 -Version: see CHANGELOG.md +Version: see CHANGELOG.md diff --git a/Project.toml b/Project.toml index a70895f8..e9d19315 100644 --- a/Project.toml +++ b/Project.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2024-2025 ECHIDNA Project Contributors name = "ECHIDNA" diff --git a/TEST_CI_ECHIDNA.md b/TEST_CI_ECHIDNA.md index 84938930..19cc96a3 100644 --- a/TEST_CI_ECHIDNA.md +++ b/TEST_CI_ECHIDNA.md @@ -1,6 +1,6 @@ # CI Test for ECHIDNA -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: CC-BY-SA-4.0 // SPDX-License-Identifier: CC-BY-SA-4.0 This is a test file to trigger CI workflows for echidna. diff --git a/alloyiser.toml b/alloyiser.toml index 9de5eea7..fdf8e14d 100644 --- a/alloyiser.toml +++ b/alloyiser.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # alloyiser manifest for echidna # Echidna has REST, GraphQL, and gRPC interfaces under src/interfaces/ diff --git a/audits/assail-classifications.a2ml b/audits/assail-classifications.a2ml index a8357c9b..6901b39c 100644 --- a/audits/assail-classifications.a2ml +++ b/audits/assail-classifications.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # Classification registry for panic-attack assail findings that are confirmed diff --git a/benches/proof_benchmarks.rs b/benches/proof_benchmarks.rs index 38e35aa1..154bddd7 100644 --- a/benches/proof_benchmarks.rs +++ b/benches/proof_benchmarks.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025-2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Performance benchmarks for ECHIDNA proof operations //! diff --git a/benches/routing_benchmarks.rs b/benches/routing_benchmarks.rs index b7ada9d6..6263111e 100644 --- a/benches/routing_benchmarks.rs +++ b/benches/routing_benchmarks.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // //! Routing and dispatch latency benchmarks for ECHIDNA. diff --git a/build.rs b/build.rs index 03faad13..c55bf0d4 100644 --- a/build.rs +++ b/build.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Build script for ECHIDNA //! //! Chapel: Chapel (.chpl) → Zig bridge → Rust diff --git a/codecov.yml b/codecov.yml index 3e24506f..e9c57515 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2024-2025 ECHIDNA Project Contributors # # Codecov configuration for ECHIDNA diff --git a/config/config.ncl b/config/config.ncl index 54e72f6a..9be531bf 100644 --- a/config/config.ncl +++ b/config/config.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # Configuration generation diff --git a/config/solver-manifest.toml b/config/solver-manifest.toml index e064fd06..02071a6c 100644 --- a/config/solver-manifest.toml +++ b/config/solver-manifest.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Solver binary integrity manifest for ECHIDNA # SHAKE3-512 hashes of known-good solver binaries # Update hashes when upgrading solver versions diff --git a/container/.gatekeeper.yaml b/container/.gatekeeper.yaml index dc0b77cc..cb386cf8 100644 --- a/container/.gatekeeper.yaml +++ b/container/.gatekeeper.yaml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Svalinn gatekeeper policy for ECHIDNA diff --git a/container/Containerfile b/container/Containerfile index 16aa930a..07591e35 100644 --- a/container/Containerfile +++ b/container/Containerfile @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # ECHIDNA Container Image (Stapeln standard) # # Multi-stage Rust build using Chainguard Wolfi base images. diff --git a/container/compose.toml b/container/compose.toml index 4d3880ab..3b00f899 100644 --- a/container/compose.toml +++ b/container/compose.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # ECHIDNA selur-compose configuration # diff --git a/container/ct-build.sh b/container/ct-build.sh index fa6e497a..d31b0d41 100755 --- a/container/ct-build.sh +++ b/container/ct-build.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # ECHIDNA — Cerro Torre build, sign, and verify pipeline # diff --git a/container/deploy.k9.ncl b/container/deploy.k9.ncl index 3165f868..21090276 100644 --- a/container/deploy.k9.ncl +++ b/container/deploy.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # deploy.k9.ncl — ECHIDNA deployment component (Hunt level) let component_pedigree = { diff --git a/container/entrypoint.sh b/container/entrypoint.sh index 1ea43dd8..d22853f8 100755 --- a/container/entrypoint.sh +++ b/container/entrypoint.sh @@ -1,5 +1,5 @@ #!/bin/sh -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # ECHIDNA container entrypoint set -e diff --git a/container/manifest.toml b/container/manifest.toml index 2d09649e..060222c1 100644 --- a/container/manifest.toml +++ b/container/manifest.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Cerro Torre manifest for ECHIDNA .ctp bundle diff --git a/container/vordr.toml b/container/vordr.toml index d336e420..d2615084 100644 --- a/container/vordr.toml +++ b/container/vordr.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Vordr runtime monitoring configuration for ECHIDNA diff --git a/contractile.just b/contractile.just index 116b621e..6f117db6 100644 --- a/contractile.just +++ b/contractile.just @@ -2,7 +2,7 @@ # Source directory: .machine_readable/contractiles # Re-generate with: contractile gen-just --dir .machine_readable/contractiles # -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # HAND-AUGMENTED 2026-06-02: contractile binary not on PATH at time of # rewrite; this file was manually re-wired to match the expanded a2ml diff --git a/crates/echidna-core-spark/Cargo.toml b/crates/echidna-core-spark/Cargo.toml index 474eb546..bd0aeef6 100644 --- a/crates/echidna-core-spark/Cargo.toml +++ b/crates/echidna-core-spark/Cargo.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later [package] name = "echidna-core-spark" diff --git a/crates/echidna-core-spark/rust-toolchain.toml b/crates/echidna-core-spark/rust-toolchain.toml index 5f8b6d9d..97630bef 100644 --- a/crates/echidna-core-spark/rust-toolchain.toml +++ b/crates/echidna-core-spark/rust-toolchain.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Rust nightly toolchain for Creusot formal verification. # diff --git a/crates/echidna-core-spark/src/axiom_tracker.rs b/crates/echidna-core-spark/src/axiom_tracker.rs index 0e1e9b16..5c6b2a6f 100644 --- a/crates/echidna-core-spark/src/axiom_tracker.rs +++ b/crates/echidna-core-spark/src/axiom_tracker.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Axiom usage tracking with Creusot proof annotations. //! diff --git a/crates/echidna-core-spark/src/lib.rs b/crates/echidna-core-spark/src/lib.rs index eb0773c4..7d99c384 100644 --- a/crates/echidna-core-spark/src/lib.rs +++ b/crates/echidna-core-spark/src/lib.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! # echidna-core-spark //! diff --git a/crates/echidna-core-spark/src/pareto.rs b/crates/echidna-core-spark/src/pareto.rs index 6c47bced..50c86688 100644 --- a/crates/echidna-core-spark/src/pareto.rs +++ b/crates/echidna-core-spark/src/pareto.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Pareto frontier computation with Creusot proof annotations. //! diff --git a/crates/echidna-core/Cargo.toml b/crates/echidna-core/Cargo.toml index 752d7f72..eafc9c73 100644 --- a/crates/echidna-core/Cargo.toml +++ b/crates/echidna-core/Cargo.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later [package] name = "echidna-core" diff --git a/crates/echidna-core/src/core.rs b/crates/echidna-core/src/core.rs index d4104ba6..4963f5a3 100644 --- a/crates/echidna-core/src/core.rs +++ b/crates/echidna-core/src/core.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Core types and abstractions for ECHIDNA theorem proving diff --git a/crates/echidna-core/src/lib.rs b/crates/echidna-core/src/lib.rs index f6bafb83..66158816 100644 --- a/crates/echidna-core/src/lib.rs +++ b/crates/echidna-core/src/lib.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! ECHIDNA canonical type surface. //! diff --git a/crates/echidna-core/src/types.rs b/crates/echidna-core/src/types.rs index e09158b5..391b26d5 100644 --- a/crates/echidna-core/src/types.rs +++ b/crates/echidna-core/src/types.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Unified native type-system decorations. //! diff --git a/crates/echidna-mcp/Cargo.toml b/crates/echidna-mcp/Cargo.toml index 1309bf8d..ad1f69a5 100644 --- a/crates/echidna-mcp/Cargo.toml +++ b/crates/echidna-mcp/Cargo.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later [package] name = "echidna-mcp" diff --git a/crates/echidna-mcp/src/main.rs b/crates/echidna-mcp/src/main.rs index d6bf3074..607f2f55 100644 --- a/crates/echidna-mcp/src/main.rs +++ b/crates/echidna-mcp/src/main.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! ECHIDNA MCP Server — exposes the `echidna` CLI as Model Context Protocol //! tools so Claude Code / Claude API agents can call on the 105-prover diff --git a/crates/echidna-wire/Cargo.toml b/crates/echidna-wire/Cargo.toml index 2a86dbad..20000256 100644 --- a/crates/echidna-wire/Cargo.toml +++ b/crates/echidna-wire/Cargo.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later [package] name = "echidna-wire" diff --git a/crates/echidna-wire/build.rs b/crates/echidna-wire/build.rs index 9ee5990d..0d069191 100644 --- a/crates/echidna-wire/build.rs +++ b/crates/echidna-wire/build.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later fn main() { capnpc::CompilerCommand::new() diff --git a/crates/echidna-wire/schemas/verisim_er.capnp b/crates/echidna-wire/schemas/verisim_er.capnp index 5ebebdfe..eed7077c 100644 --- a/crates/echidna-wire/schemas/verisim_er.capnp +++ b/crates/echidna-wire/schemas/verisim_er.capnp @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # VeriSim ↔ ECHIDNA E-R schema (wire format). # Companion to docs/architecture/VERISIM-ER-SCHEMA.md. diff --git a/crates/echidna-wire/src/lib.rs b/crates/echidna-wire/src/lib.rs index d4b2eca5..9fe0218d 100644 --- a/crates/echidna-wire/src/lib.rs +++ b/crates/echidna-wire/src/lib.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! ECHIDNA L1 wire layer — Cap'n Proto schemas and generated bindings. //! diff --git a/crates/typed_wasm/Cargo.toml b/crates/typed_wasm/Cargo.toml index 30d0ef2d..71e2aa98 100644 --- a/crates/typed_wasm/Cargo.toml +++ b/crates/typed_wasm/Cargo.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later [package] name = "typed-wasm" diff --git a/crates/typed_wasm/src/lib.rs b/crates/typed_wasm/src/lib.rs index 0885e87f..22085da1 100644 --- a/crates/typed_wasm/src/lib.rs +++ b/crates/typed_wasm/src/lib.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! TypedWasm prover oracle engine — pure, no echidna-core dependencies. diff --git a/data/synonyms/_conceptnet_seed.toml b/data/synonyms/_conceptnet_seed.toml index 2a205c03..ca00f27c 100644 --- a/data/synonyms/_conceptnet_seed.toml +++ b/data/synonyms/_conceptnet_seed.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # ConceptNet 5.7 pre-fetched seeds for math/CS/proof vocabulary. # diff --git a/data/synonyms/_disciplines.toml b/data/synonyms/_disciplines.toml index 4d5f048a..7d1b56b7 100644 --- a/data/synonyms/_disciplines.toml +++ b/data/synonyms/_disciplines.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # TypeChecker disciplines cross-prover vocabulary index. # diff --git a/data/synonyms/_msc2020.toml b/data/synonyms/_msc2020.toml index a9288d0e..ecba6c36 100644 --- a/data/synonyms/_msc2020.toml +++ b/data/synonyms/_msc2020.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # MSC2020 (Mathematics Subject Classification, 2020 revision) cross-prover # dictionary. Maps MSC code prefixes to canonical math-topic names with diff --git a/data/synonyms/_wordnet_math.toml b/data/synonyms/_wordnet_math.toml index 0f1dc6bf..6f2cb3ce 100644 --- a/data/synonyms/_wordnet_math.toml +++ b/data/synonyms/_wordnet_math.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # WordNet math-vocabulary seeds. Hand-selected synset bridges drawn from # Princeton WordNet 3.1 noun + verb hierarchies for mathematical English. diff --git a/data/synonyms/acl2.toml b/data/synonyms/acl2.toml index a46f4eca..18012617 100644 --- a/data/synonyms/acl2.toml +++ b/data/synonyms/acl2.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # ACL2 (+ ACL2s) decl, hint, and theory synonyms. # Schema: see data/synonyms/README.adoc. diff --git a/data/synonyms/agda.toml b/data/synonyms/agda.toml index 1bd66620..4115281d 100644 --- a/data/synonyms/agda.toml +++ b/data/synonyms/agda.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Agda + agda-stdlib 2.0 tactic and lemma synonyms. # Schema: see data/synonyms/README.adoc. diff --git a/data/synonyms/coq.toml b/data/synonyms/coq.toml index 7f851481..8e24bbd0 100644 --- a/data/synonyms/coq.toml +++ b/data/synonyms/coq.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Coq / Rocq tactic and lemma synonyms. # Schema: see data/synonyms/README.adoc. diff --git a/data/synonyms/dafny.toml b/data/synonyms/dafny.toml index 620b7712..319c782f 100644 --- a/data/synonyms/dafny.toml +++ b/data/synonyms/dafny.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Dafny tactic, spec-clause, and hazard synonyms. # Schema: see data/synonyms/README.adoc. diff --git a/data/synonyms/fstar.toml b/data/synonyms/fstar.toml index 97f8ea88..e52017e7 100644 --- a/data/synonyms/fstar.toml +++ b/data/synonyms/fstar.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # F* tactic, effect, and decl synonyms. # Schema: see data/synonyms/README.adoc. diff --git a/data/synonyms/hol4.toml b/data/synonyms/hol4.toml index b8d80a99..d8708176 100644 --- a/data/synonyms/hol4.toml +++ b/data/synonyms/hol4.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # HOL4 tactic and term-builder synonyms. # Schema: see data/synonyms/README.adoc. diff --git a/data/synonyms/hol_light.toml b/data/synonyms/hol_light.toml index bb6ac686..d153eb36 100644 --- a/data/synonyms/hol_light.toml +++ b/data/synonyms/hol_light.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # HOL Light tactic and term-builder synonyms. # Schema: see data/synonyms/README.adoc. diff --git a/data/synonyms/idris2.toml b/data/synonyms/idris2.toml index 285d249e..528b1571 100644 --- a/data/synonyms/idris2.toml +++ b/data/synonyms/idris2.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Idris 2 + base / contrib library synonyms. # Schema: see data/synonyms/README.adoc. diff --git a/data/synonyms/isabelle.toml b/data/synonyms/isabelle.toml index a8d83817..20242b86 100644 --- a/data/synonyms/isabelle.toml +++ b/data/synonyms/isabelle.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Isabelle/HOL tactic and lemma synonyms. # Schema: see data/synonyms/README.adoc. diff --git a/data/synonyms/isabelle_afp.toml b/data/synonyms/isabelle_afp.toml index 7c7608b3..0f76329f 100644 --- a/data/synonyms/isabelle_afp.toml +++ b/data/synonyms/isabelle_afp.toml @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Isabelle/HOL AFP-specific synonyms. Companion to `isabelle.toml`. # Schema: see data/synonyms/README.adoc. diff --git a/data/synonyms/lean4.toml b/data/synonyms/lean4.toml index 275b4038..ad41fa07 100644 --- a/data/synonyms/lean4.toml +++ b/data/synonyms/lean4.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Lean 4 + mathlib4 tactic and lemma synonyms. # Schema: see data/synonyms/README.adoc. diff --git a/data/synonyms/metamath.toml b/data/synonyms/metamath.toml index fc5f7391..90bb9422 100644 --- a/data/synonyms/metamath.toml +++ b/data/synonyms/metamath.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # MetaMath set.mm tactic and lemma synonyms. # Schema: see data/synonyms/README.adoc. diff --git a/data/synonyms/mizar.toml b/data/synonyms/mizar.toml index 09acc8d2..ce7a997c 100644 --- a/data/synonyms/mizar.toml +++ b/data/synonyms/mizar.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Mizar / MML proof-step, structural, and definition keyword synonyms. # Schema: see data/synonyms/README.adoc. diff --git a/data/synonyms/why3.toml b/data/synonyms/why3.toml index de5571d5..7a6dfdcd 100644 --- a/data/synonyms/why3.toml +++ b/data/synonyms/why3.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Why3 declaration, spec, dispatch-backend, and transformation synonyms. # Schema: see data/synonyms/README.adoc. diff --git a/deploy/hetzner/Caddyfile b/deploy/hetzner/Caddyfile index 00a8ad92..b2eb9e67 100644 --- a/deploy/hetzner/Caddyfile +++ b/deploy/hetzner/Caddyfile @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # TLS-terminating reverse proxy for the public ECHIDNA API. diff --git a/deploy/hetzner/Containerfile.caddy b/deploy/hetzner/Containerfile.caddy index abe12acf..8d6fec4a 100644 --- a/deploy/hetzner/Containerfile.caddy +++ b/deploy/hetzner/Containerfile.caddy @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # Caddy with the mholt/caddy-ratelimit plugin (stock Caddy has no rate diff --git a/deploy/hetzner/README.adoc b/deploy/hetzner/README.adoc index 0609433d..35d99015 100644 --- a/deploy/hetzner/README.adoc +++ b/deploy/hetzner/README.adoc @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: CC-BY-SA-4.0 // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell = Deploying the ECHIDNA API to Hetzner (api.nesy-prover.dev) :toc: diff --git a/deploy/hetzner/caddy.container b/deploy/hetzner/caddy.container index 8dc3d62d..22d50ee9 100644 --- a/deploy/hetzner/caddy.container +++ b/deploy/hetzner/caddy.container @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # Quadlet unit for the Caddy TLS proxy fronting api.nesy-prover.dev. diff --git a/deploy/hetzner/echidna.container b/deploy/hetzner/echidna.container index 51e3e552..1705015a 100644 --- a/deploy/hetzner/echidna.container +++ b/deploy/hetzner/echidna.container @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # Quadlet unit for the ECHIDNA API server. diff --git a/deploy/hetzner/echidna.network b/deploy/hetzner/echidna.network index 5f89d806..15d273cf 100644 --- a/deploy/hetzner/echidna.network +++ b/deploy/hetzner/echidna.network @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # Shared podman network for the API + proxy pair. Referenced by name diff --git a/deploy/hetzner/env.example b/deploy/hetzner/env.example index c52415dd..1ac70be8 100644 --- a/deploy/hetzner/env.example +++ b/deploy/hetzner/env.example @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # Values that vary per deployment. Nothing here is secret by design — diff --git a/docs-site/config/policy.yml b/docs-site/config/policy.yml index 458a176a..848b9234 100644 --- a/docs-site/config/policy.yml +++ b/docs-site/config/policy.yml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Capability policy for ECHIDNA documentation site. # Used by http-capability-gateway for request governance. diff --git a/docs-site/lib/echidna_docs/application.ex b/docs-site/lib/echidna_docs/application.ex index 0cec0513..e9c797db 100644 --- a/docs-site/lib/echidna_docs/application.ex +++ b/docs-site/lib/echidna_docs/application.ex @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later defmodule EchidnaDocs.Application do @moduledoc """ diff --git a/docs-site/lib/echidna_docs/gateway_config.ex b/docs-site/lib/echidna_docs/gateway_config.ex index 5e4e3e9d..943c8a7e 100644 --- a/docs-site/lib/echidna_docs/gateway_config.ex +++ b/docs-site/lib/echidna_docs/gateway_config.ex @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later defmodule EchidnaDocs.Router do @moduledoc """ diff --git a/docs-site/mix.exs b/docs-site/mix.exs index ba23a01a..3dd94501 100644 --- a/docs-site/mix.exs +++ b/docs-site/mix.exs @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later defmodule EchidnaDocs.MixProject do use Mix.Project diff --git a/docs-site/src/api_explorer.ecl b/docs-site/src/api_explorer.ecl index 45095453..1814e0d9 100644 --- a/docs-site/src/api_explorer.ecl +++ b/docs-site/src/api_explorer.ecl @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2025 Jonathan D.A. Jewell //! Interactive API Explorer for ECHIDNA documentation. diff --git a/docs-site/src/app.ecl b/docs-site/src/app.ecl index 124ead97..3e6c13fb 100644 --- a/docs-site/src/app.ecl +++ b/docs-site/src/app.ecl @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2025 Jonathan D.A. Jewell //! ECHIDNA Documentation — TEA Application diff --git a/docs-site/src/routes.ecl b/docs-site/src/routes.ecl index d0e62da1..f856906f 100644 --- a/docs-site/src/routes.ecl +++ b/docs-site/src/routes.ecl @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2025 Jonathan D.A. Jewell //! Route definitions for the ECHIDNA documentation site. diff --git a/docs/academic/arcvix-neurosymbolic-theorem-proving.bib b/docs/academic/arcvix-neurosymbolic-theorem-proving.bib index 0e253269..8870c502 100644 --- a/docs/academic/arcvix-neurosymbolic-theorem-proving.bib +++ b/docs/academic/arcvix-neurosymbolic-theorem-proving.bib @@ -1,4 +1,4 @@ -% SPDX-License-Identifier: MPL-2.0 +% SPDX-License-Identifier: AGPL-3.0-or-later % Bibliography for "Neurosymbolic Theorem Proving" (ECHIDNA) % All references are real, verifiable publications. diff --git a/docs/academic/arcvix-neurosymbolic-theorem-proving.tex b/docs/academic/arcvix-neurosymbolic-theorem-proving.tex index c79be526..d53d1cfe 100644 --- a/docs/academic/arcvix-neurosymbolic-theorem-proving.tex +++ b/docs/academic/arcvix-neurosymbolic-theorem-proving.tex @@ -1,4 +1,4 @@ -% SPDX-License-Identifier: MPL-2.0 +% SPDX-License-Identifier: AGPL-3.0-or-later % % ECHIDNA: Neurosymbolic Theorem Proving via Neural Guidance % with Formal Verification Guarantees across 30 Prover Backends diff --git a/docs/reports/2026-06-06-hypatia-alert-classification.md b/docs/reports/2026-06-06-hypatia-alert-classification.md index 5cc2a3ef..31ade1d4 100644 --- a/docs/reports/2026-06-06-hypatia-alert-classification.md +++ b/docs/reports/2026-06-06-hypatia-alert-classification.md @@ -1,4 +1,4 @@ - + diff --git a/eclexiaiser.toml b/eclexiaiser.toml index b5b4757d..ce61c875 100644 --- a/eclexiaiser.toml +++ b/eclexiaiser.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # eclexiaiser manifest for echidna [project] diff --git a/examples/aspect_tagging_demo.rs b/examples/aspect_tagging_demo.rs index 9ce0f04e..56789b3f 100644 --- a/examples/aspect_tagging_demo.rs +++ b/examples/aspect_tagging_demo.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Example demonstrating aspect tagging system usage diff --git a/examples/simple_proof.v b/examples/simple_proof.v index 3f0c8109..bed7aa9e 100644 --- a/examples/simple_proof.v +++ b/examples/simple_proof.v @@ -1,4 +1,4 @@ -(* SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 *) (* Simple Coq proof demonstrating ECHIDNA capabilities *) (** * Simple Arithmetic Proof diff --git a/ffi/zig/build.zig b/ffi/zig/build.zig index cf61ab63..bee1a1a5 100644 --- a/ffi/zig/build.zig +++ b/ffi/zig/build.zig @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // // ECHIDNA FFI Build Configuration (Zig 0.15.2) // diff --git a/ffi/zig/src/boj.zig b/ffi/zig/src/boj.zig index 42d6f3ff..a48e0472 100644 --- a/ffi/zig/src/boj.zig +++ b/ffi/zig/src/boj.zig @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // // ECHIDNA BoJ Client FFI — Cartridge Management Interface // diff --git a/ffi/zig/src/capnp_bridge.zig b/ffi/zig/src/capnp_bridge.zig index 09a0d247..90b02e97 100644 --- a/ffi/zig/src/capnp_bridge.zig +++ b/ffi/zig/src/capnp_bridge.zig @@ -11,7 +11,7 @@ // - Detail: call echidna_capnp_status_message(code, buf, buflen) // - Thread-local storage makes this safe for concurrent Rust threads. // -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell const std = @import("std"); diff --git a/ffi/zig/src/main.zig b/ffi/zig/src/main.zig index 554b5a65..dff55f2c 100644 --- a/ffi/zig/src/main.zig +++ b/ffi/zig/src/main.zig @@ -3,7 +3,7 @@ // This module implements the C-compatible FFI declared in src/abi/Foreign.idr // All types and layouts must match the Idris2 ABI definitions. // -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later const std = @import("std"); diff --git a/ffi/zig/src/overlay.zig b/ffi/zig/src/overlay.zig index 5e01d2b8..78188e9a 100644 --- a/ffi/zig/src/overlay.zig +++ b/ffi/zig/src/overlay.zig @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // // ECHIDNA Overlay Network FFI — Tor, IPFS, Ethereum // diff --git a/ffi/zig/src/provers/atp.zig b/ffi/zig/src/provers/atp.zig index 07f857be..f76ffce1 100644 --- a/ffi/zig/src/provers/atp.zig +++ b/ffi/zig/src/provers/atp.zig @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell // // Per-Prover Zig FFI: First-Order Automated Theorem Provers diff --git a/ffi/zig/src/provers/autoactive.zig b/ffi/zig/src/provers/autoactive.zig index 3dad6f73..bd343d32 100644 --- a/ffi/zig/src/provers/autoactive.zig +++ b/ffi/zig/src/provers/autoactive.zig @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell // // Per-Prover Zig FFI: Auto-Active Verifiers diff --git a/ffi/zig/src/provers/constraint.zig b/ffi/zig/src/provers/constraint.zig index 9e00a068..c1a829ec 100644 --- a/ffi/zig/src/provers/constraint.zig +++ b/ffi/zig/src/provers/constraint.zig @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell // // Per-Prover Zig FFI: Constraint and Optimization Solvers diff --git a/ffi/zig/src/provers/declarative.zig b/ffi/zig/src/provers/declarative.zig index d9c11ea1..76fbb4cc 100644 --- a/ffi/zig/src/provers/declarative.zig +++ b/ffi/zig/src/provers/declarative.zig @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell // // Per-Prover Zig FFI: Declarative Provers diff --git a/ffi/zig/src/provers/interactive.zig b/ffi/zig/src/provers/interactive.zig index 70090921..eb3bcfe3 100644 --- a/ffi/zig/src/provers/interactive.zig +++ b/ffi/zig/src/provers/interactive.zig @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell // // Per-Prover Zig FFI: Interactive Proof Assistants diff --git a/ffi/zig/src/provers/smt.zig b/ffi/zig/src/provers/smt.zig index 5430ec1a..43b52e28 100644 --- a/ffi/zig/src/provers/smt.zig +++ b/ffi/zig/src/provers/smt.zig @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell // // Per-Prover Zig FFI: SMT Solvers diff --git a/ffi/zig/src/provers/vcl_ut.zig b/ffi/zig/src/provers/vcl_ut.zig index e4144fec..f6f438c9 100644 --- a/ffi/zig/src/provers/vcl_ut.zig +++ b/ffi/zig/src/provers/vcl_ut.zig @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell // // VQL-UT Zig FFI: Cross-Prover Query Execution Engine diff --git a/ffi/zig/src/tentacles.zig b/ffi/zig/src/tentacles.zig index 9f9bda30..4df11280 100644 --- a/ffi/zig/src/tentacles.zig +++ b/ffi/zig/src/tentacles.zig @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // // ECHIDNA Tentacles FFI — 7-Tentacles Compiler Agent Interface // diff --git a/ffi/zig/src/typell.zig b/ffi/zig/src/typell.zig index 14b0e76c..fdd6e9b7 100644 --- a/ffi/zig/src/typell.zig +++ b/ffi/zig/src/typell.zig @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // // ECHIDNA TypeLL Client FFI — Type-Level Computation Interface // diff --git a/ffi/zig/test/benchmark.zig b/ffi/zig/test/benchmark.zig index 7dfa818f..1a71c6b0 100644 --- a/ffi/zig/test/benchmark.zig +++ b/ffi/zig/test/benchmark.zig @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // // ECHIDNA Zig FFI — Benchmark Suite // diff --git a/ffi/zig/test/core_native_test.zig b/ffi/zig/test/core_native_test.zig index d53da23f..b784d254 100644 --- a/ffi/zig/test/core_native_test.zig +++ b/ffi/zig/test/core_native_test.zig @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // // ECHIDNA Core FFI — Pure Zig Native Tests // diff --git a/ffi/zig/test/integration_test.zig b/ffi/zig/test/integration_test.zig index 2cbf967d..27b32d50 100644 --- a/ffi/zig/test/integration_test.zig +++ b/ffi/zig/test/integration_test.zig @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // // ECHIDNA Zig FFI — Comprehensive Integration Tests // diff --git a/ffi/zig/test/overlay_benchmark.zig b/ffi/zig/test/overlay_benchmark.zig index 661f7a31..4a7d5af5 100644 --- a/ffi/zig/test/overlay_benchmark.zig +++ b/ffi/zig/test/overlay_benchmark.zig @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // // ECHIDNA Overlay FFI — Benchmark Suite // diff --git a/ffi/zig/test/overlay_integration_test.zig b/ffi/zig/test/overlay_integration_test.zig index 3bdf5068..0fe21054 100644 --- a/ffi/zig/test/overlay_integration_test.zig +++ b/ffi/zig/test/overlay_integration_test.zig @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // // ECHIDNA Overlay FFI — Comprehensive Integration Tests // diff --git a/ffi/zig/test/overlay_native_test.zig b/ffi/zig/test/overlay_native_test.zig index e05388c5..12f6d2a2 100644 --- a/ffi/zig/test/overlay_native_test.zig +++ b/ffi/zig/test/overlay_native_test.zig @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // // ECHIDNA Overlay FFI — Pure Zig Integration Tests (Native Module Import) // diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 2ebbb2ef..6415e6eb 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later [package] name = "echidna-fuzz" version = "0.0.0" diff --git a/fuzz/fuzz_targets/fuzz_axiom_tracker.rs b/fuzz/fuzz_targets/fuzz_axiom_tracker.rs index 5bd3e6a4..93cd9ccb 100644 --- a/fuzz/fuzz_targets/fuzz_axiom_tracker.rs +++ b/fuzz/fuzz_targets/fuzz_axiom_tracker.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! //! Fuzz target: `AxiomTracker::scan` — no panic on arbitrary UTF-8 input //! diff --git a/fuzz/fuzz_targets/fuzz_input.rs b/fuzz/fuzz_targets/fuzz_input.rs index aefae70e..22c3b645 100644 --- a/fuzz/fuzz_targets/fuzz_input.rs +++ b/fuzz/fuzz_targets/fuzz_input.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Generic fuzz target for arbitrary input processing #![no_main] diff --git a/fuzz/fuzz_targets/fuzz_proof_state.rs b/fuzz/fuzz_targets/fuzz_proof_state.rs index 8067ac0a..833dcf8f 100644 --- a/fuzz/fuzz_targets/fuzz_proof_state.rs +++ b/fuzz/fuzz_targets/fuzz_proof_state.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! //! Fuzz target: ProofState JSON deserialization //! diff --git a/fuzz/fuzz_targets/fuzz_trust_pipeline.rs b/fuzz/fuzz_targets/fuzz_trust_pipeline.rs index 5263669f..16773824 100644 --- a/fuzz/fuzz_targets/fuzz_trust_pipeline.rs +++ b/fuzz/fuzz_targets/fuzz_trust_pipeline.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! //! Fuzz target: `compute_trust_level` invariant //! diff --git a/generated/abi/echidna_boj.h b/generated/abi/echidna_boj.h index ae4023ed..b2df324c 100644 --- a/generated/abi/echidna_boj.h +++ b/generated/abi/echidna_boj.h @@ -1,4 +1,4 @@ -/* SPDX-License-Identifier: MPL-2.0 +/* SPDX-License-Identifier: AGPL-3.0-or-later * Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) * * ECHIDNA BoJ Client FFI — C Header (generated from Idris2 ABI / Zig FFI) diff --git a/generated/abi/echidna_ffi.h b/generated/abi/echidna_ffi.h index ea469951..16620607 100644 --- a/generated/abi/echidna_ffi.h +++ b/generated/abi/echidna_ffi.h @@ -1,4 +1,4 @@ -/* SPDX-License-Identifier: MPL-2.0 +/* SPDX-License-Identifier: AGPL-3.0-or-later * Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) * * ECHIDNA Core FFI — C Header (generated from Idris2 ABI / Zig FFI) diff --git a/generated/abi/echidna_overlay.h b/generated/abi/echidna_overlay.h index d4802dfd..1bd098fa 100644 --- a/generated/abi/echidna_overlay.h +++ b/generated/abi/echidna_overlay.h @@ -1,4 +1,4 @@ -/* SPDX-License-Identifier: MPL-2.0 +/* SPDX-License-Identifier: AGPL-3.0-or-later * Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) * * ECHIDNA Overlay Network FFI — C Header (generated from Idris2 ABI / Zig FFI) diff --git a/generated/abi/echidna_tentacles.h b/generated/abi/echidna_tentacles.h index c927a934..862159e3 100644 --- a/generated/abi/echidna_tentacles.h +++ b/generated/abi/echidna_tentacles.h @@ -1,4 +1,4 @@ -/* SPDX-License-Identifier: MPL-2.0 +/* SPDX-License-Identifier: AGPL-3.0-or-later * Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) * * ECHIDNA Tentacles FFI — C Header (generated from Idris2 ABI / Zig FFI) diff --git a/generated/abi/echidna_typell.h b/generated/abi/echidna_typell.h index 924e822f..3c0f964d 100644 --- a/generated/abi/echidna_typell.h +++ b/generated/abi/echidna_typell.h @@ -1,4 +1,4 @@ -/* SPDX-License-Identifier: MPL-2.0 +/* SPDX-License-Identifier: AGPL-3.0-or-later * Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) * * ECHIDNA TypeLL Client FFI — C Header (generated from Idris2 ABI / Zig FFI) diff --git a/generated/alloyiser/run-analysis.sh b/generated/alloyiser/run-analysis.sh index d3d322aa..9bf9007f 100644 --- a/generated/alloyiser/run-analysis.sh +++ b/generated/alloyiser/run-analysis.sh @@ -1,5 +1,5 @@ #!/bin/sh -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Generated by alloyiser — Alloy analysis script # Requires: java, alloy.jar diff --git a/guix-channel/echidna.scm b/guix-channel/echidna.scm index 5205ea2e..8095eb58 100644 --- a/guix-channel/echidna.scm +++ b/guix-channel/echidna.scm @@ -1,4 +1,4 @@ -;;; SPDX-License-Identifier: MPL-2.0 +;;; SPDX-License-Identifier: AGPL-3.0-or-later ;;; SPDX-FileCopyrightText: 2025 Jonathan D.A. Jewell ;;; ;;; GNU Guix channel for ECHIDNA packages. diff --git a/guix.scm b/guix.scm index 38320d6f..2441c397 100644 --- a/guix.scm +++ b/guix.scm @@ -1,4 +1,4 @@ -;; SPDX-License-Identifier: MPL-2.0 +;; SPDX-License-Identifier: AGPL-3.0-or-later ;; echidna - Guix Package Definition ;; Development: guix shell -D -f guix.scm ;; Build: guix build -f guix.scm diff --git a/guix/echidna/packages.scm b/guix/echidna/packages.scm index 714fd04d..03c5e791 100644 --- a/guix/echidna/packages.scm +++ b/guix/echidna/packages.scm @@ -1,4 +1,4 @@ -;; SPDX-License-Identifier: MPL-2.0 +;; SPDX-License-Identifier: AGPL-3.0-or-later ;; Guix channel module exporting the echidna package (define-module (echidna packages) #:use-module (guix packages) diff --git a/hooks/pre-commit b/hooks/pre-commit index db881a89..bc505093 100755 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # ECHIDNA pre-commit hook — satisfies the RSR hooks/ requirement diff --git a/hooks/pre-push b/hooks/pre-push index 5ca7b025..a92309e0 100755 --- a/hooks/pre-push +++ b/hooks/pre-push @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # ECHIDNA pre-push hook — RSR compliance gate (RSR-H12). diff --git a/k9iser.toml b/k9iser.toml index 1d1b33b9..53cd7283 100644 --- a/k9iser.toml +++ b/k9iser.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # k9iser manifest for echidna diff --git a/manifests/live-provers.scm b/manifests/live-provers.scm index e8a59d82..03b73c1e 100644 --- a/manifests/live-provers.scm +++ b/manifests/live-provers.scm @@ -1,4 +1,4 @@ -;; SPDX-License-Identifier: MPL-2.0 +;; SPDX-License-Identifier: AGPL-3.0-or-later ;; SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell ;; ;; ECHIDNA — Live-Prover CI Manifest (Guix, PRIMARY) diff --git a/meta-checker/echidna-meta.agda-lib b/meta-checker/echidna-meta.agda-lib index 283ffd07..f0977e0c 100644 --- a/meta-checker/echidna-meta.agda-lib +++ b/meta-checker/echidna-meta.agda-lib @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Agda library file for ECHIDNA meta-checker name: echidna-meta depend: standard-library diff --git a/meta-checker/src/Echidna/AxiomSafety.agda b/meta-checker/src/Echidna/AxiomSafety.agda index 153c0c73..016e915d 100644 --- a/meta-checker/src/Echidna/AxiomSafety.agda +++ b/meta-checker/src/Echidna/AxiomSafety.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- AxiomSafety.agda — Formal verification of ECHIDNA's axiom tracking system diff --git a/meta-checker/src/Echidna/AxiomTrackerCompleteness.agda b/meta-checker/src/Echidna/AxiomTrackerCompleteness.agda index 1191018c..aff6e2fb 100644 --- a/meta-checker/src/Echidna/AxiomTrackerCompleteness.agda +++ b/meta-checker/src/Echidna/AxiomTrackerCompleteness.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- AxiomTrackerCompleteness.agda — Formal proof that every registered axiom diff --git a/meta-checker/src/Echidna/Dispatch.agda b/meta-checker/src/Echidna/Dispatch.agda index 6b8ba124..7d3c7c46 100644 --- a/meta-checker/src/Echidna/Dispatch.agda +++ b/meta-checker/src/Echidna/Dispatch.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- Dispatch.agda — Formal verification of ECHIDNA's dispatch pipeline diff --git a/meta-checker/src/Echidna/MetaChecker.agda b/meta-checker/src/Echidna/MetaChecker.agda index c6eb3e72..567af8d8 100644 --- a/meta-checker/src/Echidna/MetaChecker.agda +++ b/meta-checker/src/Echidna/MetaChecker.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- MetaChecker.agda — Top-level module for ECHIDNA's formal meta-verification diff --git a/meta-checker/src/Echidna/Portfolio.agda b/meta-checker/src/Echidna/Portfolio.agda index 146a5357..d7776e36 100644 --- a/meta-checker/src/Echidna/Portfolio.agda +++ b/meta-checker/src/Echidna/Portfolio.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- Portfolio.agda — Formal verification of ECHIDNA's portfolio solving diff --git a/meta-checker/src/Echidna/TrustLevel.agda b/meta-checker/src/Echidna/TrustLevel.agda index b6e7942f..db7bc8f9 100644 --- a/meta-checker/src/Echidna/TrustLevel.agda +++ b/meta-checker/src/Echidna/TrustLevel.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- TrustLevel.agda — Formal verification of ECHIDNA's 5-level trust hierarchy diff --git a/metrics/MetricsSuite.jl b/metrics/MetricsSuite.jl index 7b2b76a9..034d7f50 100644 --- a/metrics/MetricsSuite.jl +++ b/metrics/MetricsSuite.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # MetricsSuite.jl — Umbrella module wiring every metric against a diff --git a/metrics/alignment_rate.jl b/metrics/alignment_rate.jl index a079bb73..a2187385 100644 --- a/metrics/alignment_rate.jl +++ b/metrics/alignment_rate.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # alignment_rate.jl — Fraction of theorems whose normalised name is diff --git a/metrics/corpus_loader.jl b/metrics/corpus_loader.jl index 81c8e503..fbefe37a 100644 --- a/metrics/corpus_loader.jl +++ b/metrics/corpus_loader.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # corpus_loader.jl — Single authoritative pass over per-prover JSONL. diff --git a/metrics/floor_progress.jl b/metrics/floor_progress.jl index 85488bd0..60dbca5f 100644 --- a/metrics/floor_progress.jl +++ b/metrics/floor_progress.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # floor_progress.jl — Append-only ledger of Phase-1 progress toward the diff --git a/metrics/heaps_beta.jl b/metrics/heaps_beta.jl index 8240cd72..6e37d2dc 100644 --- a/metrics/heaps_beta.jl +++ b/metrics/heaps_beta.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # heaps_beta.jl — Fit Heap's law V ≈ k · N^β on the flattened corpus. diff --git a/metrics/msc_taxonomy_coverage.jl b/metrics/msc_taxonomy_coverage.jl index 5ba101d1..962d4656 100644 --- a/metrics/msc_taxonomy_coverage.jl +++ b/metrics/msc_taxonomy_coverage.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # msc_taxonomy_coverage.jl — Approximate coverage of the MSC 2020 diff --git a/metrics/oov_rate.jl b/metrics/oov_rate.jl index 744a1c15..27f2496f 100644 --- a/metrics/oov_rate.jl +++ b/metrics/oov_rate.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # oov_rate.jl — Fraction of corpus tokens NOT in CANON seed. diff --git a/metrics/prover_floor.jl b/metrics/prover_floor.jl index e0f70f96..338d90b5 100644 --- a/metrics/prover_floor.jl +++ b/metrics/prover_floor.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # prover_floor.jl — Smallest per-prover proof count in the authoritative diff --git a/metrics/run_all.jl b/metrics/run_all.jl index 92501732..fe02438d 100644 --- a/metrics/run_all.jl +++ b/metrics/run_all.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # run_all.jl — Driver: load corpus, run all eight metrics, POST to diff --git a/metrics/tactic_cluster_purity.jl b/metrics/tactic_cluster_purity.jl index 36e1f332..3704d3ec 100644 --- a/metrics/tactic_cluster_purity.jl +++ b/metrics/tactic_cluster_purity.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # tactic_cluster_purity.jl — Per-prover distinctiveness of tactic diff --git a/metrics/triangulation_rate.jl b/metrics/triangulation_rate.jl index 4613572f..e9d7a838 100644 --- a/metrics/triangulation_rate.jl +++ b/metrics/triangulation_rate.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # triangulation_rate.jl — Fraction of theorems (by normalised name) that diff --git a/metrics/verisim_sink.jl b/metrics/verisim_sink.jl index 38a08d26..3efb01f9 100644 --- a/metrics/verisim_sink.jl +++ b/metrics/verisim_sink.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # verisim_sink.jl — Post metric rows to VeriSimDB. diff --git a/metrics/zipf_s.jl b/metrics/zipf_s.jl index 700ae724..278d88e6 100644 --- a/metrics/zipf_s.jl +++ b/metrics/zipf_s.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # zipf_s.jl — Fit a Zipf exponent to the theorem-name frequency diff --git a/proofs/acl2/associativity.lisp b/proofs/acl2/associativity.lisp index 4b60d509..36e48dc3 100644 --- a/proofs/acl2/associativity.lisp +++ b/proofs/acl2/associativity.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 +; SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 ;; Associativity of addition ;; Demonstrates ACL2's automated proof with induction diff --git a/proofs/acl2/binary_trees.lisp b/proofs/acl2/binary_trees.lisp index 30457274..148a9e99 100644 --- a/proofs/acl2/binary_trees.lisp +++ b/proofs/acl2/binary_trees.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 +; SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 ;; Binary tree operations ;; Demonstrates data structure reasoning diff --git a/proofs/acl2/factorial.lisp b/proofs/acl2/factorial.lisp index 4a1faa0c..67d7d009 100644 --- a/proofs/acl2/factorial.lisp +++ b/proofs/acl2/factorial.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 +; SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 ;; Factorial function with guards ;; Demonstrates ACL2's guard verification and executable specifications diff --git a/proofs/acl2/list_append.lisp b/proofs/acl2/list_append.lisp index b03594b3..5559e592 100644 --- a/proofs/acl2/list_append.lisp +++ b/proofs/acl2/list_append.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 +; SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 ;; List append properties ;; Demonstrates recursive definitions and list reasoning diff --git a/proofs/acl2/sorting.lisp b/proofs/acl2/sorting.lisp index 0dd4d53b..690fa98b 100644 --- a/proofs/acl2/sorting.lisp +++ b/proofs/acl2/sorting.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 +; SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 ;; Insertion sort correctness ;; Demonstrates algorithm verification diff --git a/proofs/agda/AxiomMonotonicity.agda b/proofs/agda/AxiomMonotonicity.agda index a7e7f8e3..ac13722a 100644 --- a/proofs/agda/AxiomMonotonicity.agda +++ b/proofs/agda/AxiomMonotonicity.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- AxiomMonotonicity.agda — danger-level order and monotonicity of maxDanger. -- -- Models ECHIDNA's 4-tier axiom-danger system (Safe < Noted < Warning < Reject) diff --git a/proofs/agda/Basic.agda b/proofs/agda/Basic.agda index 17574fbd..d1390184 100644 --- a/proofs/agda/Basic.agda +++ b/proofs/agda/Basic.agda @@ -1,5 +1,5 @@ -- SPDX-FileCopyrightText: 2025 ECHIDNA Project Team --- SPDX-License-Identifier: MPL-2.0 AND Palimpsest-0.6 +-- SPDX-License-Identifier: AGPL-3.0-or-later AND Palimpsest-0.6 -- -- Basic.agda - Simple proofs demonstrating fundamental logical principles -- diff --git a/proofs/agda/CertificateChain.agda b/proofs/agda/CertificateChain.agda index f917a681..f51b66c2 100644 --- a/proofs/agda/CertificateChain.agda +++ b/proofs/agda/CertificateChain.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- CertificateChain.agda — transitivity and vacuous validity of cert chains. -- -- Models a certificate chain as a List CertStep where each CertStep diff --git a/proofs/agda/DispatchOrdering.agda b/proofs/agda/DispatchOrdering.agda index ec6eafce..5cb1b0a4 100644 --- a/proofs/agda/DispatchOrdering.agda +++ b/proofs/agda/DispatchOrdering.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- DispatchOrdering.agda — strict total order on the 6-stage trust pipeline. -- -- Models ECHIDNA's dispatch pipeline stages (dispatch.rs) as a Fin 6 type and diff --git a/proofs/agda/IdentityLaws.agda b/proofs/agda/IdentityLaws.agda index 584e3b9f..3bcbda2b 100644 --- a/proofs/agda/IdentityLaws.agda +++ b/proofs/agda/IdentityLaws.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- IdentityLaws.agda — trivial proofs that compile cleanly against -- agda-stdlib v2.3. Exists to exercise the echidnabot agda runner -- with a known-good file alongside the pre-existing (broken) corpus. diff --git a/proofs/agda/List.agda b/proofs/agda/List.agda index 247a75bf..6bc0f613 100644 --- a/proofs/agda/List.agda +++ b/proofs/agda/List.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- List.agda — list-manipulation proofs over agda-stdlib. module List where diff --git a/proofs/agda/Nat.agda b/proofs/agda/Nat.agda index 8623b163..d3b6fa2f 100644 --- a/proofs/agda/Nat.agda +++ b/proofs/agda/Nat.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Nat.agda — natural number arithmetic proofs over agda-stdlib. module Nat where diff --git a/proofs/agda/ParallelSoundness.agda b/proofs/agda/ParallelSoundness.agda index 8fdf19b9..a15ccf77 100644 --- a/proofs/agda/ParallelSoundness.agda +++ b/proofs/agda/ParallelSoundness.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- ParallelSoundness.agda — Speculative parallel proof-search soundness. -- -- Models the Chapel `parallelProofSearchSpeculative` function diff --git a/proofs/agda/PortfolioConsistency.agda b/proofs/agda/PortfolioConsistency.agda index 2829719a..5eaf1637 100644 --- a/proofs/agda/PortfolioConsistency.agda +++ b/proofs/agda/PortfolioConsistency.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- PortfolioConsistency.agda — All-true implies Any-true for non-empty Vec Bool. -- -- Models an ECHIDNA portfolio of n independent prover results as a diff --git a/proofs/agda/ProofComposition.agda b/proofs/agda/ProofComposition.agda index 2cf2feaf..dbc52254 100644 --- a/proofs/agda/ProofComposition.agda +++ b/proofs/agda/ProofComposition.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- ProofComposition.agda — axiom-set consistency for composed proofs. -- -- Simplified version: proves that combining two consistent axiom diff --git a/proofs/agda/Propositional.agda b/proofs/agda/Propositional.agda index 3ef67478..65e237e6 100644 --- a/proofs/agda/Propositional.agda +++ b/proofs/agda/Propositional.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Propositional.agda — intuitionistic propositional-logic proofs. module Propositional where diff --git a/proofs/agda/SoundnessPreservation.agda b/proofs/agda/SoundnessPreservation.agda index 0cbc8ddb..90dd1c26 100644 --- a/proofs/agda/SoundnessPreservation.agda +++ b/proofs/agda/SoundnessPreservation.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- SoundnessPreservation.agda — composed proofs are sound when axiom sets -- are conflict-free. -- diff --git a/proofs/agda/TrustLattice.agda b/proofs/agda/TrustLattice.agda index 2552c593..ad9f98ed 100644 --- a/proofs/agda/TrustLattice.agda +++ b/proofs/agda/TrustLattice.agda @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- TrustLattice.agda — bounded poset on TrustLevel (5-element type). -- -- Models the ECHIDNA trust hierarchy as an ordered type and proves the diff --git a/proofs/agda/echidna-proofs.agda-lib b/proofs/agda/echidna-proofs.agda-lib index 7748106d..1cda55e6 100644 --- a/proofs/agda/echidna-proofs.agda-lib +++ b/proofs/agda/echidna-proofs.agda-lib @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Agda library file for ECHIDNA dogfood proofs name: echidna-proofs depend: standard-library diff --git a/proofs/coq/algebra/GroupTheory.v b/proofs/coq/algebra/GroupTheory.v index 111cfbb0..9f3646f0 100644 --- a/proofs/coq/algebra/GroupTheory.v +++ b/proofs/coq/algebra/GroupTheory.v @@ -1,4 +1,4 @@ -(* SPDX-License-Identifier: MPL-2.0 +(* SPDX-License-Identifier: AGPL-3.0-or-later Copyright (c) 2026 ECHIDNA Project Group Theory: self-contained abstract algebra for training corpus. diff --git a/proofs/dimacs/graph_3color.cnf b/proofs/dimacs/graph_3color.cnf index 45360ae6..fdc411cf 100644 --- a/proofs/dimacs/graph_3color.cnf +++ b/proofs/dimacs/graph_3color.cnf @@ -1,4 +1,4 @@ -c SPDX-License-Identifier: MPL-2.0 +c SPDX-License-Identifier: AGPL-3.0-or-later c 3-colouring of a triangle (K_3): vertices v1,v2,v3, colours r,g,b c Variables 1..9 indexed as (v-1)*3+c for v∈{1,2,3}, c∈{1=r,2=g,3=b} c Each vertex gets at least one colour: diff --git a/proofs/dimacs/pigeonhole_3_2.cnf b/proofs/dimacs/pigeonhole_3_2.cnf index b1688005..a7b93126 100644 --- a/proofs/dimacs/pigeonhole_3_2.cnf +++ b/proofs/dimacs/pigeonhole_3_2.cnf @@ -1,4 +1,4 @@ -c SPDX-License-Identifier: MPL-2.0 +c SPDX-License-Identifier: AGPL-3.0-or-later c Pigeonhole: 3 pigeons in 2 holes (UNSAT) c Variables: p_i_h means pigeon i in hole h; vars 1..6 for (1,1)(1,2)(2,1)(2,2)(3,1)(3,2) c Each pigeon in some hole: diff --git a/proofs/dimacs/satisfiable_basic.cnf b/proofs/dimacs/satisfiable_basic.cnf index 0d1f6580..03cdb944 100644 --- a/proofs/dimacs/satisfiable_basic.cnf +++ b/proofs/dimacs/satisfiable_basic.cnf @@ -1,4 +1,4 @@ -c SPDX-License-Identifier: MPL-2.0 +c SPDX-License-Identifier: AGPL-3.0-or-later c Basic satisfiable instance: (x1 OR x2) AND (NOT x1 OR x2) AND (x1 OR NOT x2) c Expected: SATISFIABLE (solution x1=T, x2=T) p cnf 2 3 diff --git a/proofs/dimacs/unsatisfiable_basic.cnf b/proofs/dimacs/unsatisfiable_basic.cnf index 9de996ca..9f81704b 100644 --- a/proofs/dimacs/unsatisfiable_basic.cnf +++ b/proofs/dimacs/unsatisfiable_basic.cnf @@ -1,4 +1,4 @@ -c SPDX-License-Identifier: MPL-2.0 +c SPDX-License-Identifier: AGPL-3.0-or-later c Contradiction: x1 AND NOT x1 c Expected: UNSATISFIABLE p cnf 1 2 diff --git a/proofs/dimacs/xor_chain.cnf b/proofs/dimacs/xor_chain.cnf index 1e1fd104..2765133f 100644 --- a/proofs/dimacs/xor_chain.cnf +++ b/proofs/dimacs/xor_chain.cnf @@ -1,4 +1,4 @@ -c SPDX-License-Identifier: MPL-2.0 +c SPDX-License-Identifier: AGPL-3.0-or-later c XOR chain: x1 ⊕ x2 = 1, x2 ⊕ x3 = 1, x3 ⊕ x4 = 1 (SATISFIABLE) c Encoded as CNF: for each XOR clause, two 2-clauses p cnf 4 6 diff --git a/proofs/hol4/arithmetic.sml b/proofs/hol4/arithmetic.sml index d5badb14..ce7bfae0 100644 --- a/proofs/hol4/arithmetic.sml +++ b/proofs/hol4/arithmetic.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 *) (* Arithmetic properties in HOL4 *) (* Demonstrates decision procedures and automation *) diff --git a/proofs/hol4/binary_tree.sml b/proofs/hol4/binary_tree.sml index 4de270de..2427671f 100644 --- a/proofs/hol4/binary_tree.sml +++ b/proofs/hol4/binary_tree.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 *) (* Binary tree operations in HOL4 *) (* Demonstrates datatype definitions and structural induction *) diff --git a/proofs/hol4/list_append.sml b/proofs/hol4/list_append.sml index 4f877161..2a2646d6 100644 --- a/proofs/hol4/list_append.sml +++ b/proofs/hol4/list_append.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 *) (* List append properties in HOL4 *) (* Demonstrates inductive proofs over lists *) diff --git a/proofs/hol4/set_theory.sml b/proofs/hol4/set_theory.sml index 2c8eede6..7f5b9baf 100644 --- a/proofs/hol4/set_theory.sml +++ b/proofs/hol4/set_theory.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 *) (* Set theory properties in HOL4 *) (* Demonstrates higher-order reasoning *) diff --git a/proofs/hol4/sorting.sml b/proofs/hol4/sorting.sml index a81ce2fd..5aa6cbc7 100644 --- a/proofs/hol4/sorting.sml +++ b/proofs/hol4/sorting.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 *) (* Sorting algorithm verification in HOL4 *) (* Demonstrates algorithm correctness proofs *) diff --git a/proofs/isabelle/ROOT b/proofs/isabelle/ROOT index d72693be..9d1cb23f 100644 --- a/proofs/isabelle/ROOT +++ b/proofs/isabelle/ROOT @@ -1,4 +1,4 @@ -(* SPDX-License-Identifier: MPL-2.0 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later *) (* ROOT - Isabelle session for the ECHIDNA self-proof corpus. diff --git a/proofs/isabelle/algebra/GroupTheory.thy b/proofs/isabelle/algebra/GroupTheory.thy index 59faef3d..b47df923 100644 --- a/proofs/isabelle/algebra/GroupTheory.thy +++ b/proofs/isabelle/algebra/GroupTheory.thy @@ -1,4 +1,4 @@ -(** SPDX-License-Identifier: MPL-2.0 +(** SPDX-License-Identifier: AGPL-3.0-or-later Copyright (c) 2026 ECHIDNA Project Group Theory Examples for ML Training Corpus *) diff --git a/proofs/lean/Basic.lean b/proofs/lean/Basic.lean index c9337b75..9a863590 100644 --- a/proofs/lean/Basic.lean +++ b/proofs/lean/Basic.lean @@ -1,6 +1,6 @@ /- SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -SPDX-License-Identifier: MPL-2.0 +SPDX-License-Identifier: AGPL-3.0-or-later Basic Lean 4 Proofs - Foundation Level diff --git a/proofs/lean/ECHIDNA.lean b/proofs/lean/ECHIDNA.lean index 348a6850..9841f765 100644 --- a/proofs/lean/ECHIDNA.lean +++ b/proofs/lean/ECHIDNA.lean @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2025 ECHIDNA Project Team -- ECHIDNA proof library root module — umbrella import of the whole corpus. import Basic diff --git a/proofs/lean/List.lean b/proofs/lean/List.lean index e286d96e..cab65307 100644 --- a/proofs/lean/List.lean +++ b/proofs/lean/List.lean @@ -1,6 +1,6 @@ /- SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -SPDX-License-Identifier: MPL-2.0 +SPDX-License-Identifier: AGPL-3.0-or-later List Proofs in Lean 4 diff --git a/proofs/lean/Nat.lean b/proofs/lean/Nat.lean index 660ffd97..9a65db96 100644 --- a/proofs/lean/Nat.lean +++ b/proofs/lean/Nat.lean @@ -1,6 +1,6 @@ /- SPDX-FileCopyrightText: 2025 Jonathan D.A. Jewell -SPDX-License-Identifier: MPL-2.0 +SPDX-License-Identifier: AGPL-3.0-or-later Natural Number Proofs in Lean 4 diff --git a/proofs/lean/Propositional.lean b/proofs/lean/Propositional.lean index a6d85fff..88083fae 100644 --- a/proofs/lean/Propositional.lean +++ b/proofs/lean/Propositional.lean @@ -1,6 +1,6 @@ /- SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -SPDX-License-Identifier: MPL-2.0 +SPDX-License-Identifier: AGPL-3.0-or-later Propositional Logic Proofs in Lean 4 diff --git a/proofs/lean/algebra/GroupTheory.lean b/proofs/lean/algebra/GroupTheory.lean index 5b819cb5..fcce0ac8 100644 --- a/proofs/lean/algebra/GroupTheory.lean +++ b/proofs/lean/algebra/GroupTheory.lean @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 ECHIDNA Project -- Group Theory: self-contained abstract algebra for training corpus. -- diff --git a/proofs/metamath/broken.mm b/proofs/metamath/broken.mm index 8c2659fc..48d34bf8 100644 --- a/proofs/metamath/broken.mm +++ b/proofs/metamath/broken.mm @@ -1,4 +1,4 @@ -$( SPDX-License-Identifier: MPL-2.0 $) +$( SPDX-License-Identifier: AGPL-3.0-or-later $) $c wff |- $. $v P $. wp $f wff P $. diff --git a/proofs/metamath/tiny.mm b/proofs/metamath/tiny.mm index 3a466f18..19675501 100644 --- a/proofs/metamath/tiny.mm +++ b/proofs/metamath/tiny.mm @@ -1,4 +1,4 @@ -$( SPDX-License-Identifier: MPL-2.0 $) +$( SPDX-License-Identifier: AGPL-3.0-or-later $) $( tiny.mm -- a very small self-contained Metamath proof $) $( Constants and variables $) diff --git a/proofs/pvs/arithmetic.pvs b/proofs/pvs/arithmetic.pvs index 339885c9..668f2554 100644 --- a/proofs/pvs/arithmetic.pvs +++ b/proofs/pvs/arithmetic.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 +% SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 % Arithmetic properties % Demonstrates PVS's powerful decision procedures diff --git a/proofs/pvs/binary_search.pvs b/proofs/pvs/binary_search.pvs index 0cfdfca1..b3c80269 100644 --- a/proofs/pvs/binary_search.pvs +++ b/proofs/pvs/binary_search.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 +% SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 % Binary search on sorted arrays % Demonstrates PVS's specification and verification capabilities diff --git a/proofs/pvs/list_theory.pvs b/proofs/pvs/list_theory.pvs index 9bc21488..730be82a 100644 --- a/proofs/pvs/list_theory.pvs +++ b/proofs/pvs/list_theory.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 +% SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 % List theory with append and length % Demonstrates PVS's dependent types and TCCs diff --git a/proofs/pvs/set_theory.pvs b/proofs/pvs/set_theory.pvs index 5bffbebf..38b0a226 100644 --- a/proofs/pvs/set_theory.pvs +++ b/proofs/pvs/set_theory.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 +% SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 % Set operations and properties % Demonstrates higher-order reasoning in PVS diff --git a/proofs/pvs/sorting.pvs b/proofs/pvs/sorting.pvs index f7b58488..e4930c7d 100644 --- a/proofs/pvs/sorting.pvs +++ b/proofs/pvs/sorting.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 +% SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 % Insertion sort specification and verification % Demonstrates algorithm correctness in PVS diff --git a/proofs/tptp/contradiction.p b/proofs/tptp/contradiction.p index 124461a7..fbedb94d 100644 --- a/proofs/tptp/contradiction.p +++ b/proofs/tptp/contradiction.p @@ -1,5 +1,5 @@ %----------------------------------------------------------------------------- -% SPDX-License-Identifier: MPL-2.0 +% SPDX-License-Identifier: AGPL-3.0-or-later % File : contradiction.p % Status : CounterSatisfiable % Claim : Deliberately unprovable: asserting P and ¬P. diff --git a/proofs/tptp/disjunction_elim.p b/proofs/tptp/disjunction_elim.p index 21bed830..b238bcc7 100644 --- a/proofs/tptp/disjunction_elim.p +++ b/proofs/tptp/disjunction_elim.p @@ -1,5 +1,5 @@ %----------------------------------------------------------------------------- -% SPDX-License-Identifier: MPL-2.0 +% SPDX-License-Identifier: AGPL-3.0-or-later % File : disjunction_elim.p % Status : Theorem % Claim : Disjunction elimination — from P∨Q, P→R, Q→R, conclude R. diff --git a/proofs/tptp/double_negation.p b/proofs/tptp/double_negation.p index 5bf4aced..64beb66c 100644 --- a/proofs/tptp/double_negation.p +++ b/proofs/tptp/double_negation.p @@ -1,5 +1,5 @@ %----------------------------------------------------------------------------- -% SPDX-License-Identifier: MPL-2.0 +% SPDX-License-Identifier: AGPL-3.0-or-later % File : double_negation.p % Status : Theorem % Claim : ¬¬P → P (classical double-negation elimination). diff --git a/proofs/tptp/group_left_identity.p b/proofs/tptp/group_left_identity.p index 3a71fb84..b80c5081 100644 --- a/proofs/tptp/group_left_identity.p +++ b/proofs/tptp/group_left_identity.p @@ -1,5 +1,5 @@ %----------------------------------------------------------------------------- -% SPDX-License-Identifier: MPL-2.0 +% SPDX-License-Identifier: AGPL-3.0-or-later % File : group_left_identity.p % Status : Theorem % Claim : In a group, e is also a right identity (proved from left-identity diff --git a/proofs/tptp/modus_ponens.p b/proofs/tptp/modus_ponens.p index 3673a62f..2b766294 100644 --- a/proofs/tptp/modus_ponens.p +++ b/proofs/tptp/modus_ponens.p @@ -1,5 +1,5 @@ %----------------------------------------------------------------------------- -% SPDX-License-Identifier: MPL-2.0 +% SPDX-License-Identifier: AGPL-3.0-or-later % File : modus_ponens.p % Syntax : TPTP FOF (First-Order Form) % Status : Theorem diff --git a/proofs/tptp/socrates.p b/proofs/tptp/socrates.p index 1b7e6e74..c5d2880b 100644 --- a/proofs/tptp/socrates.p +++ b/proofs/tptp/socrates.p @@ -1,5 +1,5 @@ %----------------------------------------------------------------------------- -% SPDX-License-Identifier: MPL-2.0 +% SPDX-License-Identifier: AGPL-3.0-or-later % File : socrates.p % Status : Theorem % Claim : Classical syllogism: all humans are mortal; Socrates is human; diff --git a/proofs/tptp/symmetry_eq.p b/proofs/tptp/symmetry_eq.p index d90554d6..5f73eb47 100644 --- a/proofs/tptp/symmetry_eq.p +++ b/proofs/tptp/symmetry_eq.p @@ -1,5 +1,5 @@ %----------------------------------------------------------------------------- -% SPDX-License-Identifier: MPL-2.0 +% SPDX-License-Identifier: AGPL-3.0-or-later % File : symmetry_eq.p % Status : Theorem % Claim : Equality is symmetric: a=b → b=a (follows from equality axioms). diff --git a/proofs/tptp/transitivity.p b/proofs/tptp/transitivity.p index 4ab52149..a856cf50 100644 --- a/proofs/tptp/transitivity.p +++ b/proofs/tptp/transitivity.p @@ -1,5 +1,5 @@ %----------------------------------------------------------------------------- -% SPDX-License-Identifier: MPL-2.0 +% SPDX-License-Identifier: AGPL-3.0-or-later % File : transitivity.p % Status : Theorem % Claim : Less-than is transitive: a # # ECHIDNA canonical Cap'n Proto wire schemas (L1 IPC) diff --git a/scripts/a2ml_emit.jl b/scripts/a2ml_emit.jl index 988267a1..0b8d0984 100644 --- a/scripts/a2ml_emit.jl +++ b/scripts/a2ml_emit.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # A2ML emitter for training-corpus records. @@ -130,7 +130,7 @@ function write_records_file( header::Union{AbstractString,Nothing}=nothing, ) open(path, "w") do io - println(io, "# SPDX-License-Identifier: MPL-2.0") + println(io, "# SPDX-License-Identifier: AGPL-3.0-or-later") println(io, "# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath)") if header !== nothing for line in split(header, '\n') diff --git a/scripts/align_premises.jl b/scripts/align_premises.jl index 64b50250..706b537d 100755 --- a/scripts/align_premises.jl +++ b/scripts/align_premises.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) # # align_premises.jl — rebuild training_data/premises_COMPLETE.jsonl with proof_ids diff --git a/scripts/balance_corpus.jl b/scripts/balance_corpus.jl index 78c090b2..1f2df7f1 100644 --- a/scripts/balance_corpus.jl +++ b/scripts/balance_corpus.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Balanced corpus extraction - ensure minimum proofs from each prover. diff --git a/scripts/ban-npm.sh b/scripts/ban-npm.sh index 4bc8a679..81516682 100755 --- a/scripts/ban-npm.sh +++ b/scripts/ban-npm.sh @@ -3,7 +3,7 @@ # ECHIDNA NPM Ban Enforcement Script # This script checks for and blocks npm/node usage # -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later set -euo pipefail diff --git a/scripts/build-production.sh b/scripts/build-production.sh index 970c8266..d36d1947 100755 --- a/scripts/build-production.sh +++ b/scripts/build-production.sh @@ -1,5 +1,5 @@ #!/bin/bash -# SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 +# SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 # Production build script for ECHIDNA set -e diff --git a/scripts/collect-field-signal.sh b/scripts/collect-field-signal.sh index f229edec..1b1eaf2b 100755 --- a/scripts/collect-field-signal.sh +++ b/scripts/collect-field-signal.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Collect field signal data for STATE.a2ml [field-signal] section # Runs weekly to track: cold-start latency, corpus growth, vulnerability count, test coverage diff --git a/scripts/demo-proof.sh b/scripts/demo-proof.sh index cbc2cdab..4acf1f6d 100755 --- a/scripts/demo-proof.sh +++ b/scripts/demo-proof.sh @@ -1,5 +1,5 @@ #!/bin/bash -# SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 +# SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 # ECHIDNA Interactive Demo - Proof of Commutativity set -e diff --git a/scripts/expand_training_data.sh b/scripts/expand_training_data.sh index ae70788f..65a407b6 100755 --- a/scripts/expand_training_data.sh +++ b/scripts/expand_training_data.sh @@ -1,5 +1,5 @@ #!/bin/bash -# SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 +# SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 # Quick training data expansion script for ECHIDNA set -e diff --git a/scripts/extract_abc.jl b/scripts/extract_abc.jl index 0f9803ea..acddc9d6 100644 --- a/scripts/extract_abc.jl +++ b/scripts/extract_abc.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract ABC hardware-verification problems (AIGER / BLIF). # Vendor: git clone https://github.com/berkeley-abc/abc external_corpora/abc using JSON3, Dates diff --git a/scripts/extract_abella.jl b/scripts/extract_abella.jl index 79df7500..79027c3b 100644 --- a/scripts/extract_abella.jl +++ b/scripts/extract_abella.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) # # Extract proofs from the Abella examples corpus. Abella is the canonical diff --git a/scripts/extract_acl2.jl b/scripts/extract_acl2.jl index 52e4ae9d..60f9cf86 100644 --- a/scripts/extract_acl2.jl +++ b/scripts/extract_acl2.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # Extract proofs from ACL2 community books and convert to ECHIDNA training format. diff --git a/scripts/extract_acl2s.jl b/scripts/extract_acl2s.jl index 130aba0e..37712d18 100644 --- a/scripts/extract_acl2s.jl +++ b/scripts/extract_acl2s.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) # # Extract proofs from ACL2s examples. diff --git a/scripts/extract_afp.jl b/scripts/extract_afp.jl index 1c52f4d8..2aad31bb 100644 --- a/scripts/extract_afp.jl +++ b/scripts/extract_afp.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # extract_afp.jl — Mine the Archive of Formal Proofs (Isabelle/HOL) diff --git a/scripts/extract_agda.jl b/scripts/extract_agda.jl index b21bd05f..918a4dc2 100644 --- a/scripts/extract_agda.jl +++ b/scripts/extract_agda.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # extract_agda.jl — Mine the locally-vendored Agda standard library diff --git a/scripts/extract_all.sh b/scripts/extract_all.sh index c647df16..45e8cded 100755 --- a/scripts/extract_all.sh +++ b/scripts/extract_all.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # ECHIDNA — run every scripts/extract_*.jl once, non-interactively. diff --git a/scripts/extract_alloy.jl b/scripts/extract_alloy.jl index d738e66a..cbf72e0d 100644 --- a/scripts/extract_alloy.jl +++ b/scripts/extract_alloy.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract Alloy relational-model-finder constraints from alloytools examples. # Vendor: git clone https://github.com/AlloyTools/models external_corpora/alloy using JSON3, Dates diff --git a/scripts/extract_arend.jl b/scripts/extract_arend.jl index 2fa3aa7c..61b30d0d 100644 --- a/scripts/extract_arend.jl +++ b/scripts/extract_arend.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract proofs / declarations / .ard files from Arend. # Vendor location: external_corpora/arend/ using JSON3, Dates diff --git a/scripts/extract_athena.jl b/scripts/extract_athena.jl index 60c3289a..cbb7f8c8 100644 --- a/scripts/extract_athena.jl +++ b/scripts/extract_athena.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract proofs / declarations / .ath files from Athena. # Vendor location: external_corpora/athena/ using JSON3, Dates diff --git a/scripts/extract_boogie.jl b/scripts/extract_boogie.jl index 9be83251..c7c94aae 100644 --- a/scripts/extract_boogie.jl +++ b/scripts/extract_boogie.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) # # Extract verification conditions from Boogie .bpl files. diff --git a/scripts/extract_cameleer.jl b/scripts/extract_cameleer.jl index 1e748413..feb88b7a 100644 --- a/scripts/extract_cameleer.jl +++ b/scripts/extract_cameleer.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) # # Extract proofs from Cameleer examples (OCaml with GOSPEL contracts). diff --git a/scripts/extract_cbmc.jl b/scripts/extract_cbmc.jl index 9977f5ab..1af0cf77 100644 --- a/scripts/extract_cbmc.jl +++ b/scripts/extract_cbmc.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract CBMC bounded-model-check problems from diffblue/cbmc regression tests. # Vendor: git clone https://github.com/diffblue/cbmc external_corpora/cbmc using JSON3, Dates diff --git a/scripts/extract_coqgym.jl b/scripts/extract_coqgym.jl index a422bea6..fcfbdb25 100644 --- a/scripts/extract_coqgym.jl +++ b/scripts/extract_coqgym.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Extract proofs from the CoqGym corpus and convert to ECHIDNA training diff --git a/scripts/extract_dafny.jl b/scripts/extract_dafny.jl index e17f1592..d7d3fe7c 100644 --- a/scripts/extract_dafny.jl +++ b/scripts/extract_dafny.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # Extract proofs from Dafny test suite and convert to ECHIDNA training format. diff --git a/scripts/extract_dedukti.jl b/scripts/extract_dedukti.jl index b0244d65..396ed0c2 100644 --- a/scripts/extract_dedukti.jl +++ b/scripts/extract_dedukti.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) # # Extract proofs from Dedukti / Lambdapi corpora. Dedukti is the universal diff --git a/scripts/extract_dreal.jl b/scripts/extract_dreal.jl index 30767081..82c02283 100644 --- a/scripts/extract_dreal.jl +++ b/scripts/extract_dreal.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract dReal delta-complete SMT-LIB problems (NRA / nonlinear real arithmetic). # Vendor: git clone https://github.com/dreal/dreal4 external_corpora/dreal4 using JSON3, Dates diff --git a/scripts/extract_framac.jl b/scripts/extract_framac.jl index a4747d1a..0c20ed9e 100644 --- a/scripts/extract_framac.jl +++ b/scripts/extract_framac.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract Frama-C / ACSL proof obligations from the Frama-C tests + WP tutorials. # Vendor: git clone https://git.frama-c.com/pub/frama-c external_corpora/frama-c using JSON3, Dates diff --git a/scripts/extract_fstar.jl b/scripts/extract_fstar.jl index 21b9ebf3..780704cf 100644 --- a/scripts/extract_fstar.jl +++ b/scripts/extract_fstar.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # Extract proofs from F* (Project Everest) and convert to ECHIDNA training format. diff --git a/scripts/extract_hol4.jl b/scripts/extract_hol4.jl index b233f38e..f4e41382 100644 --- a/scripts/extract_hol4.jl +++ b/scripts/extract_hol4.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Extract proofs from HOL4 corpus and convert to ECHIDNA training format. diff --git a/scripts/extract_hol_light.jl b/scripts/extract_hol_light.jl index ce155272..cb4f9a8f 100644 --- a/scripts/extract_hol_light.jl +++ b/scripts/extract_hol_light.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Extract proofs from HOL Light corpus and convert to ECHIDNA training format. diff --git a/scripts/extract_idris2.jl b/scripts/extract_idris2.jl index ae96f4a7..5b80297f 100644 --- a/scripts/extract_idris2.jl +++ b/scripts/extract_idris2.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # Extract proofs from Idris2 stdlib and tests, convert to ECHIDNA training format. diff --git a/scripts/extract_isabelle_tropical.jl b/scripts/extract_isabelle_tropical.jl index 53755066..2dfef894 100644 --- a/scripts/extract_isabelle_tropical.jl +++ b/scripts/extract_isabelle_tropical.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # extract_isabelle_tropical.jl diff --git a/scripts/extract_isabelle_zf.jl b/scripts/extract_isabelle_zf.jl index d50ecc04..eccda18b 100644 --- a/scripts/extract_isabelle_zf.jl +++ b/scripts/extract_isabelle_zf.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) # # Extract proofs from Isabelle/ZF (Zermelo-Fraenkel set-theory object logic). diff --git a/scripts/extract_key.jl b/scripts/extract_key.jl index 9b6a49e3..0ed8a5a4 100644 --- a/scripts/extract_key.jl +++ b/scripts/extract_key.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract KeY proof problems (Java + JML). Vendor: key-project/key examples. using JSON3, Dates const DIR = "external_corpora/key/examples"; const OUT = "training_data"; const START_ID = 1_400_000 diff --git a/scripts/extract_lambda_prolog.jl b/scripts/extract_lambda_prolog.jl index b6fdabcc..24bf6cf4 100644 --- a/scripts/extract_lambda_prolog.jl +++ b/scripts/extract_lambda_prolog.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract proofs / declarations / λProlog .mod files from λProlog. # Vendor location: external_corpora/lambda_prolog/ using JSON3, Dates diff --git a/scripts/extract_lean3.jl b/scripts/extract_lean3.jl index 07230c40..ed3f833d 100644 --- a/scripts/extract_lean3.jl +++ b/scripts/extract_lean3.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) # # Extract proofs from mathlib3 (Lean 3) corpus and convert to ECHIDNA training diff --git a/scripts/extract_mathcomp.jl b/scripts/extract_mathcomp.jl index 051e9141..8d657d3d 100644 --- a/scripts/extract_mathcomp.jl +++ b/scripts/extract_mathcomp.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # Mathematical Components (mathcomp) extractor for ECHIDNA training data. @@ -212,7 +212,7 @@ function save_results(proof_states, tactics, premises, stats; output_dir="traini end end open(joinpath(output_dir, "stats_mathcomp.a2ml"), "w") do fh - println(fh, "# SPDX-License-Identifier: MPL-2.0") + println(fh, "# SPDX-License-Identifier: AGPL-3.0-or-later") println(fh, "# mathcomp extraction statistics"); println(fh) A2MLEmit.write_metadata_table(fh, stats) end diff --git a/scripts/extract_mathlib4.jl b/scripts/extract_mathlib4.jl index 2992d2ad..c234dfe2 100644 --- a/scripts/extract_mathlib4.jl +++ b/scripts/extract_mathlib4.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Extract proofs from Lean mathlib4 corpus and convert to ECHIDNA training format. diff --git a/scripts/extract_matita.jl b/scripts/extract_matita.jl index a7dfc665..d436ad3d 100644 --- a/scripts/extract_matita.jl +++ b/scripts/extract_matita.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract proofs / declarations / .ma files from Matita. # Vendor location: external_corpora/matita/ using JSON3, Dates diff --git a/scripts/extract_mercury.jl b/scripts/extract_mercury.jl index 9fe7ef6a..9e0c324c 100644 --- a/scripts/extract_mercury.jl +++ b/scripts/extract_mercury.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract proofs / declarations / Mercury .m files from Mercury. # Vendor location: external_corpora/mercury/ using JSON3, Dates diff --git a/scripts/extract_metamath.jl b/scripts/extract_metamath.jl index 4e79da27..38d4de15 100644 --- a/scripts/extract_metamath.jl +++ b/scripts/extract_metamath.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Metamath proof extractor. diff --git a/scripts/extract_minizinc.jl b/scripts/extract_minizinc.jl index bd52848e..d6e70a50 100644 --- a/scripts/extract_minizinc.jl +++ b/scripts/extract_minizinc.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Extract constraint models from MiniZinc benchmarks and generate training data diff --git a/scripts/extract_mizar.jl b/scripts/extract_mizar.jl index e710b7b0..0328db6e 100644 --- a/scripts/extract_mizar.jl +++ b/scripts/extract_mizar.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Extract proofs from Mizar Mathematical Library (MML) and convert to ECHIDNA diff --git a/scripts/extract_naproche.jl b/scripts/extract_naproche.jl index 38e5a8d8..2033c53c 100644 --- a/scripts/extract_naproche.jl +++ b/scripts/extract_naproche.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract proofs / declarations / ForTheL files from Naproche (ForTheL). # Vendor location: external_corpora/naproche/ using JSON3, Dates diff --git a/scripts/extract_nitpick.jl b/scripts/extract_nitpick.jl index 983b4646..627976a4 100644 --- a/scripts/extract_nitpick.jl +++ b/scripts/extract_nitpick.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract proofs / declarations / Isabelle .thy with nitpick calls from Nitpick (refutation finder). # Vendor location: external_corpora/nitpick/ using JSON3, Dates diff --git a/scripts/extract_nunchaku.jl b/scripts/extract_nunchaku.jl index e846c78f..3480fe72 100644 --- a/scripts/extract_nunchaku.jl +++ b/scripts/extract_nunchaku.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract proofs / declarations / .nun files from Nunchaku (refutation finder). # Vendor location: external_corpora/nunchaku/ using JSON3, Dates diff --git a/scripts/extract_nusmv.jl b/scripts/extract_nusmv.jl index 731bc740..8c21b1c7 100644 --- a/scripts/extract_nusmv.jl +++ b/scripts/extract_nusmv.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract NuSMV / nuXmv model-checker CTL/LTL properties. # Vendor: https://nusmv.fbk.eu/distrib/ (examples ship with distribution). using JSON3, Dates diff --git a/scripts/extract_opentheory.jl b/scripts/extract_opentheory.jl index 1dee2206..bef14924 100644 --- a/scripts/extract_opentheory.jl +++ b/scripts/extract_opentheory.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # Extract theorem packages from OpenTheory (https://opentheory.gilith.com/). diff --git a/scripts/extract_prism.jl b/scripts/extract_prism.jl index 2783c056..ecb71f76 100644 --- a/scripts/extract_prism.jl +++ b/scripts/extract_prism.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract PRISM probabilistic model-checker properties. # Vendor: git clone https://github.com/prismmodelchecker/prism-examples external_corpora/prism using JSON3, Dates diff --git a/scripts/extract_proverif.jl b/scripts/extract_proverif.jl index 30ff8054..6208bf18 100644 --- a/scripts/extract_proverif.jl +++ b/scripts/extract_proverif.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract ProVerif queries from inria/proverif-examples. # Vendor: git clone https://gitlab.inria.fr/bblanche/proverif external_corpora/proverif using JSON3, Dates diff --git a/scripts/extract_pvs.jl b/scripts/extract_pvs.jl index 9c224a60..d21ec84b 100644 --- a/scripts/extract_pvs.jl +++ b/scripts/extract_pvs.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # Extract proofs from NASA PVS library and convert to ECHIDNA training format. diff --git a/scripts/extract_sat_benchmarks.jl b/scripts/extract_sat_benchmarks.jl index 14c6859a..39b49508 100644 --- a/scripts/extract_sat_benchmarks.jl +++ b/scripts/extract_sat_benchmarks.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # Shared extractor for the SAT-solver fleet (CaDiCaL, Kissat, MiniSat). # All three consume DIMACS CNF, so one extractor builds the corpus and diff --git a/scripts/extract_seahorn.jl b/scripts/extract_seahorn.jl index 9d24c573..742a8e0d 100644 --- a/scripts/extract_seahorn.jl +++ b/scripts/extract_seahorn.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract SeaHorn LLVM-based verification problems (CHC-encoded). # Vendor: git clone https://github.com/seahorn/seahorn external_corpora/seahorn using JSON3, Dates diff --git a/scripts/extract_smtlib.jl b/scripts/extract_smtlib.jl index c52ce25d..ea8b6e8c 100644 --- a/scripts/extract_smtlib.jl +++ b/scripts/extract_smtlib.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # SMT-LIB benchmark extractor for ECHIDNA training data. @@ -396,7 +396,7 @@ function save_results(proof_states, tactics, premises, stats; output_dir="traini ) open(joinpath(output_dir, "stats_smtlib.a2ml"), "w") do fh - println(fh, "# SPDX-License-Identifier: MPL-2.0") + println(fh, "# SPDX-License-Identifier: AGPL-3.0-or-later") println(fh, "# SMT-LIB extraction statistics") println(fh) A2MLEmit.write_metadata_table(fh, stats) diff --git a/scripts/extract_spin.jl b/scripts/extract_spin.jl index 95aeada2..093f28fd 100644 --- a/scripts/extract_spin.jl +++ b/scripts/extract_spin.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract SPIN model-checker LTL properties from Promela models. # Vendor: https://spinroot.com/spin/Examples or nimble-code/Spin using JSON3, Dates diff --git a/scripts/extract_tamarin.jl b/scripts/extract_tamarin.jl index e562393e..27906445 100644 --- a/scripts/extract_tamarin.jl +++ b/scripts/extract_tamarin.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract Tamarin security-protocol theories from tamarin-prover examples. # Vendor: git clone https://github.com/tamarin-prover/tamarin-prover external_corpora/tamarin using JSON3, Dates diff --git a/scripts/extract_tlaps.jl b/scripts/extract_tlaps.jl index ca505284..c7139b0a 100644 --- a/scripts/extract_tlaps.jl +++ b/scripts/extract_tlaps.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract TLA+ proofs from the TLAPS examples + tlaplus/examples repo. # Vendor: git clone https://github.com/tlaplus/Examples external_corpora/tlaplus_examples using JSON3, Dates diff --git a/scripts/extract_tlc.jl b/scripts/extract_tlc.jl index 969e0336..435902b0 100644 --- a/scripts/extract_tlc.jl +++ b/scripts/extract_tlc.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract TLC model-checker inputs from tlaplus/examples (same repo as TLAPS). # TLC checks specifications rather than proves theorems; records capture # spec+invariant pairs as proof-state analogues. diff --git a/scripts/extract_tptp.jl b/scripts/extract_tptp.jl index dd8efc6f..c9b85c3f 100644 --- a/scripts/extract_tptp.jl +++ b/scripts/extract_tptp.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # TPTP Problem Library extractor for ECHIDNA training data. @@ -289,7 +289,7 @@ function save_results(proof_states, tactics, premises, stats; output_dir::String # Stats as a standalone metadata-only A2ML file open(joinpath(output_dir, "stats_tptp.a2ml"), "w") do fh - println(fh, "# SPDX-License-Identifier: MPL-2.0") + println(fh, "# SPDX-License-Identifier: AGPL-3.0-or-later") println(fh, "# TPTP extraction statistics") println(fh) A2MLEmit.write_metadata_table(fh, stats) diff --git a/scripts/extract_typechecker_ecosystem.jl b/scripts/extract_typechecker_ecosystem.jl index 891b3c7a..1e167fc0 100644 --- a/scripts/extract_typechecker_ecosystem.jl +++ b/scripts/extract_typechecker_ecosystem.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # extract_typechecker_ecosystem.jl diff --git a/scripts/extract_typed_wasm.jl b/scripts/extract_typed_wasm.jl index f7a85c13..c4ed35da 100644 --- a/scripts/extract_typed_wasm.jl +++ b/scripts/extract_typed_wasm.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # Extract TypedWasm proof problems from ECHIDNA's own test fixtures and diff --git a/scripts/extract_uppaal.jl b/scripts/extract_uppaal.jl index 55634921..848e062f 100644 --- a/scripts/extract_uppaal.jl +++ b/scripts/extract_uppaal.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract UPPAAL timed-automata reachability / TCTL queries. # Vendor: https://uppaal.org/documentation/ (examples ship with distribution). using JSON3, Dates diff --git a/scripts/extract_viper.jl b/scripts/extract_viper.jl index 968f85f1..77b10ae7 100644 --- a/scripts/extract_viper.jl +++ b/scripts/extract_viper.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Extract Viper (Silver) separation-logic verification problems. # Vendor: git clone https://github.com/viperproject/silver external_corpora/viper using JSON3, Dates diff --git a/scripts/extract_why3.jl b/scripts/extract_why3.jl index 141eaf49..390977a8 100644 --- a/scripts/extract_why3.jl +++ b/scripts/extract_why3.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Extract proofs from Why3 examples and convert to ECHIDNA training format. diff --git a/scripts/extractor_save_common.jl b/scripts/extractor_save_common.jl index 379ada98..1d9204c7 100644 --- a/scripts/extractor_save_common.jl +++ b/scripts/extractor_save_common.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Shared helper used by the backend-only-prover extractors to serialise # proof-states / tactics / premises to the standard training_data layout. using JSON3, Dates diff --git a/scripts/final_complete_merge.jl b/scripts/final_complete_merge.jl index 67b3b667..ee2252d0 100644 --- a/scripts/final_complete_merge.jl +++ b/scripts/final_complete_merge.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Final complete merge - ensure ALL data is included. diff --git a/scripts/final_normalization.jl b/scripts/final_normalization.jl index caa8bf5f..c02ce631 100644 --- a/scripts/final_normalization.jl +++ b/scripts/final_normalization.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Final normalization - ensure consistent prover names and verify completeness. diff --git a/scripts/gen-provers-a2ml.sh b/scripts/gen-provers-a2ml.sh index 319fb8c7..87389e4d 100755 --- a/scripts/gen-provers-a2ml.sh +++ b/scripts/gen-provers-a2ml.sh @@ -18,7 +18,7 @@ if [ -z "$VARIANT_LIST" ] || [ ! -r "$VARIANT_LIST" ]; then fi cat << 'HEADER' -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # provers.a2ml — Authoritative enumeration of ECHIDNA prover backends. diff --git a/scripts/generate_synthetic_dafny_scale.jl b/scripts/generate_synthetic_dafny_scale.jl index fe5d58f8..ea7c176c 100644 --- a/scripts/generate_synthetic_dafny_scale.jl +++ b/scripts/generate_synthetic_dafny_scale.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell # # Scale-synthesis for Dafny. diff --git a/scripts/generate_synthetic_provers.jl b/scripts/generate_synthetic_provers.jl index 0c9e6018..2361089d 100644 --- a/scripts/generate_synthetic_provers.jl +++ b/scripts/generate_synthetic_provers.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Generate high-quality synthetic proofs for provers with tiny communities diff --git a/scripts/generate_synthetic_tail_scale.jl b/scripts/generate_synthetic_tail_scale.jl index 79b0e59d..d1f905b7 100644 --- a/scripts/generate_synthetic_tail_scale.jl +++ b/scripts/generate_synthetic_tail_scale.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # Scale synthetic corpora for the source-gated provers so each crosses diff --git a/scripts/install-proof-toolchains.sh b/scripts/install-proof-toolchains.sh index c24d626e..947874c7 100755 --- a/scripts/install-proof-toolchains.sh +++ b/scripts/install-proof-toolchains.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # install-proof-toolchains.sh — self-provision the formal-proof toolchains that # ECHIDNA's proof corpus is checked with: Idris2, Agda (+stdlib), Coq, Lean 4. diff --git a/scripts/max_extract_coqgym.jl b/scripts/max_extract_coqgym.jl index 1ccc8fde..249ca38d 100644 --- a/scripts/max_extract_coqgym.jl +++ b/scripts/max_extract_coqgym.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # MAXIMUM CoqGym Extraction - Extract ALL available proofs. diff --git a/scripts/max_extract_mathlib4.jl b/scripts/max_extract_mathlib4.jl index 8fe0c7e8..d38a6325 100644 --- a/scripts/max_extract_mathlib4.jl +++ b/scripts/max_extract_mathlib4.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # MAXIMUM mathlib4 Extraction - Extract ALL available Lean proofs. diff --git a/scripts/merge_all_corpora.jl b/scripts/merge_all_corpora.jl index 9ae442c8..b3fa7934 100644 --- a/scripts/merge_all_corpora.jl +++ b/scripts/merge_all_corpora.jl @@ -1,6 +1,6 @@ #!/usr/bin/env julia # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ Comprehensive corpus merger for ECHIDNA v2.0 diff --git a/scripts/merge_corpus.jl b/scripts/merge_corpus.jl index ac123feb..99ab0318 100644 --- a/scripts/merge_corpus.jl +++ b/scripts/merge_corpus.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # merge_corpus.jl -- Merge all ECHIDNA corpus extraction results into a unified diff --git a/scripts/merge_training_data.jl b/scripts/merge_training_data.jl index c28fd22b..0ff475f3 100644 --- a/scripts/merge_training_data.jl +++ b/scripts/merge_training_data.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Merge training data files for ECHIDNA corpus expansion using JSON3 diff --git a/scripts/metamath_extract_working.jl b/scripts/metamath_extract_working.jl index 3cafff80..0c36e004 100644 --- a/scripts/metamath_extract_working.jl +++ b/scripts/metamath_extract_working.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Working Metamath proof extractor using JSON3 diff --git a/scripts/metamath_final.jl b/scripts/metamath_final.jl index 92e25566..ea6223f0 100644 --- a/scripts/metamath_final.jl +++ b/scripts/metamath_final.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Final Metamath proof extractor - simplified and robust. diff --git a/scripts/mvp-functional.sh b/scripts/mvp-functional.sh index dfbffa44..c62b05da 100755 --- a/scripts/mvp-functional.sh +++ b/scripts/mvp-functional.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell set -euo pipefail diff --git a/scripts/provision_corpora.sh b/scripts/provision_corpora.sh index ec7ea2d4..fe543eb2 100755 --- a/scripts/provision_corpora.sh +++ b/scripts/provision_corpora.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # ECHIDNA — Non-interactive upstream corpus provisioning. diff --git a/scripts/simple_merge.jl b/scripts/simple_merge.jl index 881fe9a9..d825cbc1 100644 --- a/scripts/simple_merge.jl +++ b/scripts/simple_merge.jl @@ -1,6 +1,6 @@ #!/usr/bin/env julia # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ Simple corpus merger using manual JSON parsing (like original scripts). diff --git a/scripts/simple_metamath_extract.jl b/scripts/simple_metamath_extract.jl index 1621904d..643e98cc 100644 --- a/scripts/simple_metamath_extract.jl +++ b/scripts/simple_metamath_extract.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Simple Metamath proof extractor using JSON3 diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index 0d9dc180..01b664d5 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -1,6 +1,6 @@ #!/bin/bash # SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 OR Palimpsest-0.6 +# SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 # Integration test runner for Rust↔Julia communication # Starts Julia test server, runs Rust integration tests, then stops server diff --git a/scripts/test-proofs.sh b/scripts/test-proofs.sh index 28b2bc36..f083a525 100755 --- a/scripts/test-proofs.sh +++ b/scripts/test-proofs.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # SPDX-FileCopyrightText: 2025 Jonathan D.A. Jewell -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later set -euo pipefail diff --git a/scripts/test_integration.sh b/scripts/test_integration.sh index beb9611f..700dc3d2 100755 --- a/scripts/test_integration.sh +++ b/scripts/test_integration.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # ECHIDNA v1.2 Integration Test Script diff --git a/scripts/ultimate_expansion.jl b/scripts/ultimate_expansion.jl index e4f58a87..7477c31b 100644 --- a/scripts/ultimate_expansion.jl +++ b/scripts/ultimate_expansion.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # ULTIMATE CORPUS EXPANSION - Maximum vocabulary and prover coverage diff --git a/scripts/vocabulary_5x_expansion.jl b/scripts/vocabulary_5x_expansion.jl index f152f44f..7db6f476 100644 --- a/scripts/vocabulary_5x_expansion.jl +++ b/scripts/vocabulary_5x_expansion.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # vocabulary_5x_expansion.jl — Expand ECHIDNA vocabulary 5× (6,555 → 33,000+) diff --git a/scripts/vocabulary_canonicalize.jl b/scripts/vocabulary_canonicalize.jl index 77d988f7..d53ac699 100644 --- a/scripts/vocabulary_canonicalize.jl +++ b/scripts/vocabulary_canonicalize.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # vocabulary_canonicalize.jl — Produce a clean canonical seed vocabulary. diff --git a/scripts/vocabulary_expansion.jl b/scripts/vocabulary_expansion.jl index c24eb1bf..ca1e58a6 100644 --- a/scripts/vocabulary_expansion.jl +++ b/scripts/vocabulary_expansion.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Comprehensive vocabulary expansion - reach 1000+ words. diff --git a/scripts/vocabulary_final.jl b/scripts/vocabulary_final.jl index 339e42e5..3d4fd1b6 100644 --- a/scripts/vocabulary_final.jl +++ b/scripts/vocabulary_final.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team # # Final vocabulary expansion - simple and robust approach. diff --git a/scripts/vocabulary_mine_corpus.jl b/scripts/vocabulary_mine_corpus.jl index 2e076215..13ac4ec3 100644 --- a/scripts/vocabulary_mine_corpus.jl +++ b/scripts/vocabulary_mine_corpus.jl @@ -1,5 +1,5 @@ #!/usr/bin/env julia -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # vocabulary_mine_corpus.jl — Mine proof corpora for a frequency-filtered diff --git a/selur-compose.toml b/selur-compose.toml index 4afcb9d3..503955d4 100644 --- a/selur-compose.toml +++ b/selur-compose.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # ECHIDNA — Stapeln/Selur service definition. diff --git a/setup.sh b/setup.sh index d14a6fab..13ac2e8b 100755 --- a/setup.sh +++ b/setup.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # Echidna — Universal Setup Script diff --git a/spark/axiom_tracker/axiom_tracker.adb b/spark/axiom_tracker/axiom_tracker.adb index 2ac9c7c8..46ff8e36 100644 --- a/spark/axiom_tracker/axiom_tracker.adb +++ b/spark/axiom_tracker/axiom_tracker.adb @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- -- SPARK companion body for axiom_tracker.ads -- diff --git a/spark/axiom_tracker/axiom_tracker.ads b/spark/axiom_tracker/axiom_tracker.ads index e4bd74c6..18a5e393 100644 --- a/spark/axiom_tracker/axiom_tracker.ads +++ b/spark/axiom_tracker/axiom_tracker.ads @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- -- SPARK companion spec for src/rust/verification/axiom_tracker.rs -- diff --git a/spark/axiom_tracker/axiom_tracker_proof.adb b/spark/axiom_tracker/axiom_tracker_proof.adb index 91e8c770..3bfd6ee8 100644 --- a/spark/axiom_tracker/axiom_tracker_proof.adb +++ b/spark/axiom_tracker/axiom_tracker_proof.adb @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- -- Proof obligations and gnatprove discharge notes for axiom_tracker. -- This file compiles to a no-op; all content is documentary. diff --git a/spark/certificates/certificates.adb b/spark/certificates/certificates.adb index af775150..b21eaf7e 100644 --- a/spark/certificates/certificates.adb +++ b/spark/certificates/certificates.adb @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- -- SPARK companion body for certificates.ads -- diff --git a/spark/certificates/certificates.ads b/spark/certificates/certificates.ads index c1ddf94b..ee7d34de 100644 --- a/spark/certificates/certificates.ads +++ b/spark/certificates/certificates.ads @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- -- SPARK companion spec for src/rust/verification/certificates.rs -- diff --git a/spark/certificates/certificates_proof.adb b/spark/certificates/certificates_proof.adb index 215ddb8a..de16c10e 100644 --- a/spark/certificates/certificates_proof.adb +++ b/spark/certificates/certificates_proof.adb @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- -- Proof obligations and gnatprove discharge notes for certificates. -- This file compiles to a no-op; all content is documentary. diff --git a/spark/solver_integrity/solver_integrity.adb b/spark/solver_integrity/solver_integrity.adb index 952094b4..2a8d029a 100644 --- a/spark/solver_integrity/solver_integrity.adb +++ b/spark/solver_integrity/solver_integrity.adb @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- -- SPARK companion body for solver_integrity.ads -- diff --git a/spark/solver_integrity/solver_integrity.ads b/spark/solver_integrity/solver_integrity.ads index 62268c05..9565de94 100644 --- a/spark/solver_integrity/solver_integrity.ads +++ b/spark/solver_integrity/solver_integrity.ads @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- -- SPARK companion spec for src/rust/integrity/solver_integrity.rs -- diff --git a/spark/solver_integrity/solver_integrity_proof.adb b/spark/solver_integrity/solver_integrity_proof.adb index 8bff51be..e9a92f69 100644 --- a/spark/solver_integrity/solver_integrity_proof.adb +++ b/spark/solver_integrity/solver_integrity_proof.adb @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- -- Proof obligations and gnatprove discharge notes for solver_integrity. -- This file compiles to a no-op; all content is documentary. diff --git a/src/abi/Boj/Foreign.idr b/src/abi/Boj/Foreign.idr index 6ce38ca0..0914dd19 100644 --- a/src/abi/Boj/Foreign.idr +++ b/src/abi/Boj/Foreign.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- ECHIDNA BoJ Client ABI Foreign Function Declarations diff --git a/src/abi/BojForeign.idr b/src/abi/BojForeign.idr index 6ce38ca0..0914dd19 100644 --- a/src/abi/BojForeign.idr +++ b/src/abi/BojForeign.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- ECHIDNA BoJ Client ABI Foreign Function Declarations diff --git a/src/abi/CoprocessorForeign.idr b/src/abi/CoprocessorForeign.idr index 9d8ee2a6..66d3bd2d 100644 --- a/src/abi/CoprocessorForeign.idr +++ b/src/abi/CoprocessorForeign.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- ECHIDNA Coprocessor ABI — foreign declarations + trust-tier invariants. diff --git a/src/abi/EchidnaABI/AxiomTracker.idr b/src/abi/EchidnaABI/AxiomTracker.idr index 93be129c..37c68298 100644 --- a/src/abi/EchidnaABI/AxiomTracker.idr +++ b/src/abi/EchidnaABI/AxiomTracker.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell -- -- EchidnaABI.AxiomTracker diff --git a/src/abi/EchidnaABI/CapnSchemas.idr b/src/abi/EchidnaABI/CapnSchemas.idr index 784abf0a..b58c4f9d 100644 --- a/src/abi/EchidnaABI/CapnSchemas.idr +++ b/src/abi/EchidnaABI/CapnSchemas.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| ECHIDNA ABI — Cap'n Proto Schema Mirror diff --git a/src/abi/EchidnaABI/Foreign.idr b/src/abi/EchidnaABI/Foreign.idr index c773586a..4f13a3ee 100644 --- a/src/abi/EchidnaABI/Foreign.idr +++ b/src/abi/EchidnaABI/Foreign.idr @@ -1,4 +1,4 @@ -||| SPDX-License-Identifier: MPL-2.0 +||| SPDX-License-Identifier: AGPL-3.0-or-later ||| Foreign Function Interface Declarations for ECHIDNA ||| ||| This module declares all C-compatible functions that will be diff --git a/src/abi/EchidnaABI/Gnn.idr b/src/abi/EchidnaABI/Gnn.idr index e6175c98..66d26859 100644 --- a/src/abi/EchidnaABI/Gnn.idr +++ b/src/abi/EchidnaABI/Gnn.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| ECHIDNA ABI — Graph Neural Network Properties diff --git a/src/abi/EchidnaABI/Layout.idr b/src/abi/EchidnaABI/Layout.idr index 08f7771b..b94df73c 100644 --- a/src/abi/EchidnaABI/Layout.idr +++ b/src/abi/EchidnaABI/Layout.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| ECHIDNA ABI Memory Layout Proofs diff --git a/src/abi/EchidnaABI/Provers.idr b/src/abi/EchidnaABI/Provers.idr index d6ae37eb..40965ca1 100644 --- a/src/abi/EchidnaABI/Provers.idr +++ b/src/abi/EchidnaABI/Provers.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| Per-Prover ABI: Top-Level Module diff --git a/src/abi/EchidnaABI/Provers/AutoActive.idr b/src/abi/EchidnaABI/Provers/AutoActive.idr index ad9e7b27..2c783751 100644 --- a/src/abi/EchidnaABI/Provers/AutoActive.idr +++ b/src/abi/EchidnaABI/Provers/AutoActive.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| Per-Prover ABI: Auto-Active Verifiers diff --git a/src/abi/EchidnaABI/Provers/ConstraintSolvers.idr b/src/abi/EchidnaABI/Provers/ConstraintSolvers.idr index 9c706e44..4085dddc 100644 --- a/src/abi/EchidnaABI/Provers/ConstraintSolvers.idr +++ b/src/abi/EchidnaABI/Provers/ConstraintSolvers.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| Per-Prover ABI: Constraint and Optimization Solvers diff --git a/src/abi/EchidnaABI/Provers/DeclarativeProvers.idr b/src/abi/EchidnaABI/Provers/DeclarativeProvers.idr index d958b591..3024e427 100644 --- a/src/abi/EchidnaABI/Provers/DeclarativeProvers.idr +++ b/src/abi/EchidnaABI/Provers/DeclarativeProvers.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| Per-Prover ABI: Declarative Provers diff --git a/src/abi/EchidnaABI/Provers/FirstOrderAtp.idr b/src/abi/EchidnaABI/Provers/FirstOrderAtp.idr index 78489088..780f2813 100644 --- a/src/abi/EchidnaABI/Provers/FirstOrderAtp.idr +++ b/src/abi/EchidnaABI/Provers/FirstOrderAtp.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| Per-Prover ABI: First-Order Automated Theorem Provers diff --git a/src/abi/EchidnaABI/Provers/InteractiveAssistants.idr b/src/abi/EchidnaABI/Provers/InteractiveAssistants.idr index aec3b08d..6a357997 100644 --- a/src/abi/EchidnaABI/Provers/InteractiveAssistants.idr +++ b/src/abi/EchidnaABI/Provers/InteractiveAssistants.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| Per-Prover ABI: Interactive Proof Assistants diff --git a/src/abi/EchidnaABI/Provers/SmtSolvers.idr b/src/abi/EchidnaABI/Provers/SmtSolvers.idr index 84434698..2d4d3535 100644 --- a/src/abi/EchidnaABI/Provers/SmtSolvers.idr +++ b/src/abi/EchidnaABI/Provers/SmtSolvers.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| Per-Prover ABI: SMT Solvers diff --git a/src/abi/EchidnaABI/TacticRecord.idr b/src/abi/EchidnaABI/TacticRecord.idr index 12ed4d14..a13117bd 100644 --- a/src/abi/EchidnaABI/TacticRecord.idr +++ b/src/abi/EchidnaABI/TacticRecord.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| ECHIDNA ABI — Tactic Record (GNN → Chapel cross-FFI contract) diff --git a/src/abi/EchidnaABI/Types.idr b/src/abi/EchidnaABI/Types.idr index 605deae1..b7d560f9 100644 --- a/src/abi/EchidnaABI/Types.idr +++ b/src/abi/EchidnaABI/Types.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| ECHIDNA ABI Type Definitions diff --git a/src/abi/EchidnaABI/VqlUt.idr b/src/abi/EchidnaABI/VqlUt.idr index 3790d397..d94ec713 100644 --- a/src/abi/EchidnaABI/VqlUt.idr +++ b/src/abi/EchidnaABI/VqlUt.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| VQL-UT ABI: 10-Level Type-Safe Cross-Prover Query Language diff --git a/src/abi/Foreign.idr b/src/abi/Foreign.idr index 76b9dba5..1609e809 100644 --- a/src/abi/Foreign.idr +++ b/src/abi/Foreign.idr @@ -1,4 +1,4 @@ -||| SPDX-License-Identifier: MPL-2.0 +||| SPDX-License-Identifier: AGPL-3.0-or-later ||| Foreign Function Interface Declarations for ECHIDNA ||| ||| This module declares all C-compatible functions that will be diff --git a/src/abi/Layout.idr b/src/abi/Layout.idr index 08f7771b..b94df73c 100644 --- a/src/abi/Layout.idr +++ b/src/abi/Layout.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| ECHIDNA ABI Memory Layout Proofs diff --git a/src/abi/NeSyAssistTesting.idr b/src/abi/NeSyAssistTesting.idr index 53fd9983..d3167af6 100644 --- a/src/abi/NeSyAssistTesting.idr +++ b/src/abi/NeSyAssistTesting.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- NeSy Assist Testing: Formal contract between neural ranker and symbolic verifier module NeSyAssistTesting diff --git a/src/abi/Overlay.idr b/src/abi/Overlay.idr index afb8b2fe..d92d0839 100644 --- a/src/abi/Overlay.idr +++ b/src/abi/Overlay.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- ECHIDNA Overlay Network ABI — Tor, IPFS, Ethereum diff --git a/src/abi/Overlay/Foreign.idr b/src/abi/Overlay/Foreign.idr index 613f12f8..eb249045 100644 --- a/src/abi/Overlay/Foreign.idr +++ b/src/abi/Overlay/Foreign.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- ECHIDNA Overlay ABI Foreign Function Declarations diff --git a/src/abi/OverlayForeign.idr b/src/abi/OverlayForeign.idr index 613f12f8..eb249045 100644 --- a/src/abi/OverlayForeign.idr +++ b/src/abi/OverlayForeign.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- ECHIDNA Overlay ABI Foreign Function Declarations diff --git a/src/abi/Tentacles/Foreign.idr b/src/abi/Tentacles/Foreign.idr index df5bf6a2..8426f398 100644 --- a/src/abi/Tentacles/Foreign.idr +++ b/src/abi/Tentacles/Foreign.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- ECHIDNA Tentacles ABI Foreign Function Declarations diff --git a/src/abi/TentaclesForeign.idr b/src/abi/TentaclesForeign.idr index df5bf6a2..8426f398 100644 --- a/src/abi/TentaclesForeign.idr +++ b/src/abi/TentaclesForeign.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- ECHIDNA Tentacles ABI Foreign Function Declarations diff --git a/src/abi/TypeLL/Foreign.idr b/src/abi/TypeLL/Foreign.idr index ffc025bc..25be9a0b 100644 --- a/src/abi/TypeLL/Foreign.idr +++ b/src/abi/TypeLL/Foreign.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- ECHIDNA TypeLL Client ABI Foreign Function Declarations diff --git a/src/abi/TypeLLForeign.idr b/src/abi/TypeLLForeign.idr index ffc025bc..25be9a0b 100644 --- a/src/abi/TypeLLForeign.idr +++ b/src/abi/TypeLLForeign.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- ECHIDNA TypeLL Client ABI Foreign Function Declarations diff --git a/src/abi/Types.idr b/src/abi/Types.idr index 605deae1..b7d560f9 100644 --- a/src/abi/Types.idr +++ b/src/abi/Types.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell ||| ECHIDNA ABI Type Definitions diff --git a/src/abi/echidnaabi.ipkg b/src/abi/echidnaabi.ipkg index 2b0ec6da..5a9d99b8 100644 --- a/src/abi/echidnaabi.ipkg +++ b/src/abi/echidnaabi.ipkg @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- ECHIDNA ABI package — Idris2 formal ABI definitions with dependent type proofs. diff --git a/src/ada/spark/axiom_c_bridge.adb b/src/ada/spark/axiom_c_bridge.adb index e2a01447..5b4c88ed 100644 --- a/src/ada/spark/axiom_c_bridge.adb +++ b/src/ada/spark/axiom_c_bridge.adb @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) -- -- Axiom_C_Bridge body — unmarshals C arrays and calls the SPARK functions. diff --git a/src/ada/spark/axiom_c_bridge.ads b/src/ada/spark/axiom_c_bridge.ads index 2998ffd5..67781d94 100644 --- a/src/ada/spark/axiom_c_bridge.ads +++ b/src/ada/spark/axiom_c_bridge.ads @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) -- -- Axiom_C_Bridge — C-callable wrapper around the SPARK Enforce function. diff --git a/src/ada/spark/axiom_policy.adb b/src/ada/spark/axiom_policy.adb index 643e75e1..8a38a19b 100644 --- a/src/ada/spark/axiom_policy.adb +++ b/src/ada/spark/axiom_policy.adb @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) -- -- Axiom_Policy body — pure SPARK implementation of enforce_policy. diff --git a/src/ada/spark/axiom_policy.ads b/src/ada/spark/axiom_policy.ads index 3c351ca6..78c4b42a 100644 --- a/src/ada/spark/axiom_policy.ads +++ b/src/ada/spark/axiom_policy.ads @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) -- -- Axiom_Policy — SPARK-verified policy enforcement for echidna axiom scanning. diff --git a/src/ada/spark/axiom_types.ads b/src/ada/spark/axiom_types.ads index cc9da443..fae9d7eb 100644 --- a/src/ada/spark/axiom_types.ads +++ b/src/ada/spark/axiom_types.ads @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) -- -- Axiom_Types — shared type definitions for the SPARK axiom-policy layer. diff --git a/src/ada/spark/coprocessor_safety.adb b/src/ada/spark/coprocessor_safety.adb index 936fd13b..9abada4b 100644 --- a/src/ada/spark/coprocessor_safety.adb +++ b/src/ada/spark/coprocessor_safety.adb @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) -- -- Coprocessor_Safety body — implementations whose post-conditions are diff --git a/src/ada/spark/coprocessor_safety.ads b/src/ada/spark/coprocessor_safety.ads index d919d801..943871c1 100644 --- a/src/ada/spark/coprocessor_safety.ads +++ b/src/ada/spark/coprocessor_safety.ads @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) -- -- Coprocessor_Safety — SPARK-verified invariants on coprocessor trust-tier diff --git a/src/ada/spark/echidna_spark.gpr b/src/ada/spark/echidna_spark.gpr index 3109f945..37a52391 100644 --- a/src/ada/spark/echidna_spark.gpr +++ b/src/ada/spark/echidna_spark.gpr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) -- -- GPRbuild project for ECHIDNA SPARK layer. diff --git a/src/chapel/bench_mrr.chpl b/src/chapel/bench_mrr.chpl index b9a7a254..1413b47b 100644 --- a/src/chapel/bench_mrr.chpl +++ b/src/chapel/bench_mrr.chpl @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // // Chapel speedup baseline — runs sequentialProofSearch, diff --git a/src/chapel/chapel_ffi_exports.chpl b/src/chapel/chapel_ffi_exports.chpl index 5d044869..6bd67ea1 100644 --- a/src/chapel/chapel_ffi_exports.chpl +++ b/src/chapel/chapel_ffi_exports.chpl @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // // Chapel FFI Exports for ECHIDNA — C-compatible interface for Zig FFI layer. diff --git a/src/chapel/parallel_proof_search.chpl b/src/chapel/parallel_proof_search.chpl index d53199d5..53057a85 100644 --- a/src/chapel/parallel_proof_search.chpl +++ b/src/chapel/parallel_proof_search.chpl @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // // ECHIDNA Chapel Metalayer — Parallel Proof Search diff --git a/src/chapel/smoke.chpl b/src/chapel/smoke.chpl index 95832434..ca09487b 100644 --- a/src/chapel/smoke.chpl +++ b/src/chapel/smoke.chpl @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // // Hello-Chapel smoke target. diff --git a/src/idris/ProofTerm.idr b/src/idris/ProofTerm.idr index a63bf6a2..77c00d9e 100644 --- a/src/idris/ProofTerm.idr +++ b/src/idris/ProofTerm.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- ProofTerm.idr - Dependent-typed representation of proof terms module ProofTerm diff --git a/src/idris/Validator.idr b/src/idris/Validator.idr index 11f42b44..a0732975 100644 --- a/src/idris/Validator.idr +++ b/src/idris/Validator.idr @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- Validator.idr - Type checker for proof terms with soundness guarantees module Validator diff --git a/src/idris/echidna-validator.ipkg b/src/idris/echidna-validator.ipkg index d40f5a00..ec23801e 100644 --- a/src/idris/echidna-validator.ipkg +++ b/src/idris/echidna-validator.ipkg @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later package echidna-validator version = 0.1.0 diff --git a/src/interfaces/ffi_integration_test.rs b/src/interfaces/ffi_integration_test.rs index ec777be7..f1c7bcff 100644 --- a/src/interfaces/ffi_integration_test.rs +++ b/src/interfaces/ffi_integration_test.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // FFI Integration Test - Tests that all 3 interfaces can use the FFI layer #[cfg(test)] diff --git a/src/interfaces/graphql/Cargo.toml b/src/interfaces/graphql/Cargo.toml index c2cfd36d..00c0e505 100644 --- a/src/interfaces/graphql/Cargo.toml +++ b/src/interfaces/graphql/Cargo.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later [package] name = "echidna-graphql" diff --git a/src/interfaces/graphql/ffi_wrapper.rs b/src/interfaces/graphql/ffi_wrapper.rs index ed9eb01b..914722eb 100644 --- a/src/interfaces/graphql/ffi_wrapper.rs +++ b/src/interfaces/graphql/ffi_wrapper.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // GraphQL FFI Wrapper - Connects GraphQL interface to ECHIDNA Rust core via Zig FFI use anyhow::{anyhow, Result}; diff --git a/src/interfaces/graphql/main.rs b/src/interfaces/graphql/main.rs index 975f3a2b..276569d1 100644 --- a/src/interfaces/graphql/main.rs +++ b/src/interfaces/graphql/main.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // ECHIDNA GraphQL Interface - Main server use async_graphql::{EmptySubscription, Schema}; diff --git a/src/interfaces/graphql/resolvers.rs b/src/interfaces/graphql/resolvers.rs index 5b667129..addd5345 100644 --- a/src/interfaces/graphql/resolvers.rs +++ b/src/interfaces/graphql/resolvers.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // GraphQL resolvers - wired to ECHIDNA core use echidna::core::{ diff --git a/src/interfaces/graphql/schema.rs b/src/interfaces/graphql/schema.rs index 1607d417..e12d9f5d 100644 --- a/src/interfaces/graphql/schema.rs +++ b/src/interfaces/graphql/schema.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // GraphQL schema definitions - wired to ECHIDNA core use async_graphql::{Context, Enum, Object, Result, SimpleObject}; diff --git a/src/interfaces/grpc/Cargo.toml b/src/interfaces/grpc/Cargo.toml index 41b7adf7..7c79190e 100644 --- a/src/interfaces/grpc/Cargo.toml +++ b/src/interfaces/grpc/Cargo.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later [package] name = "echidna-grpc" diff --git a/src/interfaces/grpc/build.rs b/src/interfaces/grpc/build.rs index 6864fcbb..690926d4 100644 --- a/src/interfaces/grpc/build.rs +++ b/src/interfaces/grpc/build.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later fn main() -> Result<(), Box> { tonic_prost_build::compile_protos("proto/echidna.proto")?; diff --git a/src/interfaces/grpc/ffi_wrapper.rs b/src/interfaces/grpc/ffi_wrapper.rs index 7c030faa..8ad7b22e 100644 --- a/src/interfaces/grpc/ffi_wrapper.rs +++ b/src/interfaces/grpc/ffi_wrapper.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // gRPC FFI Wrapper - Connects gRPC interface to ECHIDNA Rust core via Zig FFI use anyhow::{anyhow, Result}; diff --git a/src/interfaces/grpc/main.rs b/src/interfaces/grpc/main.rs index ac2fdde9..87850fb4 100644 --- a/src/interfaces/grpc/main.rs +++ b/src/interfaces/grpc/main.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // ECHIDNA gRPC Server - wired to core use echidna::core::{Tactic as CoreTactic, TacticResult, Term}; diff --git a/src/interfaces/grpc/proto/echidna.proto b/src/interfaces/grpc/proto/echidna.proto index 6d018f66..c79cdb0f 100644 --- a/src/interfaces/grpc/proto/echidna.proto +++ b/src/interfaces/grpc/proto/echidna.proto @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // ECHIDNA gRPC Protocol syntax = "proto3"; diff --git a/src/interfaces/rest/Cargo.toml b/src/interfaces/rest/Cargo.toml index 61ef2e92..df07ba53 100644 --- a/src/interfaces/rest/Cargo.toml +++ b/src/interfaces/rest/Cargo.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later [package] name = "echidna-rest" diff --git a/src/interfaces/rest/ffi_wrapper.rs b/src/interfaces/rest/ffi_wrapper.rs index 9f201ee5..834bc337 100644 --- a/src/interfaces/rest/ffi_wrapper.rs +++ b/src/interfaces/rest/ffi_wrapper.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // REST FFI Wrapper - Connects REST interface to ECHIDNA Rust core via Zig FFI. // // The wrapper is scaffolding for the REST handlers — most entry points are diff --git a/src/interfaces/rest/handlers.rs b/src/interfaces/rest/handlers.rs index 200c8207..ba2d61ba 100644 --- a/src/interfaces/rest/handlers.rs +++ b/src/interfaces/rest/handlers.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // REST API request handlers - wired to ECHIDNA core use axum::{ diff --git a/src/interfaces/rest/main.rs b/src/interfaces/rest/main.rs index f4cd532f..6a61e7c5 100644 --- a/src/interfaces/rest/main.rs +++ b/src/interfaces/rest/main.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // ECHIDNA REST API Server use axum::{ diff --git a/src/interfaces/rest/models.rs b/src/interfaces/rest/models.rs index e03894de..bd83302f 100644 --- a/src/interfaces/rest/models.rs +++ b/src/interfaces/rest/models.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // REST API data models use serde::{Deserialize, Serialize}; diff --git a/src/julia/EchidnaBuddy.jl b/src/julia/EchidnaBuddy.jl index 1cb823d6..ceb03045 100644 --- a/src/julia/EchidnaBuddy.jl +++ b/src/julia/EchidnaBuddy.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # EchidnaBuddy.jl — Stochastic Meta-Prover Buddy diff --git a/src/julia/EchidnaML.jl b/src/julia/EchidnaML.jl index a2c26a41..6ac38b2e 100644 --- a/src/julia/EchidnaML.jl +++ b/src/julia/EchidnaML.jl @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ EchidnaML diff --git a/src/julia/api/gnn_endpoint.jl b/src/julia/api/gnn_endpoint.jl index 2a31ab6b..e8fc07ee 100644 --- a/src/julia/api/gnn_endpoint.jl +++ b/src/julia/api/gnn_endpoint.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell """ diff --git a/src/julia/api/server.jl b/src/julia/api/server.jl index 1e5ddb1b..07ef3aa9 100644 --- a/src/julia/api/server.jl +++ b/src/julia/api/server.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # api/server.jl — HTTP API server for neural premise selection. diff --git a/src/julia/api_server.jl b/src/julia/api_server.jl index 4c7ed34f..f7e31efb 100644 --- a/src/julia/api_server.jl +++ b/src/julia/api_server.jl @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ Julia ML API Server for ECHIDNA v1.3 diff --git a/src/julia/archive/train_advanced_models.jl b/src/julia/archive/train_advanced_models.jl index d0b2b5a9..fa32d9f6 100644 --- a/src/julia/archive/train_advanced_models.jl +++ b/src/julia/archive/train_advanced_models.jl @@ -1,7 +1,7 @@ #!/usr/bin/env julia # ARCHIVED 2026-05-24 — superseded by src/julia/run_training.jl. Kept for history only; do not invoke. # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ Advanced Neural Model Training for ECHIDNA v2.0 diff --git a/src/julia/archive/train_and_evaluate.jl b/src/julia/archive/train_and_evaluate.jl index 3e927201..449ddce7 100755 --- a/src/julia/archive/train_and_evaluate.jl +++ b/src/julia/archive/train_and_evaluate.jl @@ -1,6 +1,6 @@ #!/usr/bin/env julia # ARCHIVED 2026-05-24 — superseded by src/julia/run_training.jl. Kept for history only; do not invoke. -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Train GNN model and evaluate on validation set, outputting metrics for health monitoring using JSON3 diff --git a/src/julia/archive/train_complete_final.jl b/src/julia/archive/train_complete_final.jl index 824d7169..7a18038e 100644 --- a/src/julia/archive/train_complete_final.jl +++ b/src/julia/archive/train_complete_final.jl @@ -1,7 +1,7 @@ #!/usr/bin/env julia # ARCHIVED 2026-05-24 — superseded by src/julia/run_training.jl. Kept for history only; do not invoke. # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ COMPLETE FINAL Model Training - Standalone version with all dependencies diff --git a/src/julia/archive/train_final_models.jl b/src/julia/archive/train_final_models.jl index d3ce9b46..c27aee22 100644 --- a/src/julia/archive/train_final_models.jl +++ b/src/julia/archive/train_final_models.jl @@ -1,7 +1,7 @@ #!/usr/bin/env julia # ARCHIVED 2026-05-24 — superseded by src/julia/run_training.jl. Kept for history only; do not invoke. # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ FINAL Model Training on COMPLETE Corpus diff --git a/src/julia/archive/train_models.jl b/src/julia/archive/train_models.jl index 42f98c9e..32aec78c 100644 --- a/src/julia/archive/train_models.jl +++ b/src/julia/archive/train_models.jl @@ -1,6 +1,6 @@ # ARCHIVED 2026-05-24 — superseded by src/julia/run_training.jl. Kept for history only; do not invoke. # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ Neural Model Training for ECHIDNA v1.3 diff --git a/src/julia/coprocessor.jl b/src/julia/coprocessor.jl index 3e3e27e0..1244ed79 100644 --- a/src/julia/coprocessor.jl +++ b/src/julia/coprocessor.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # src/julia/coprocessor.jl diff --git a/src/julia/corpus_loader.jl b/src/julia/corpus_loader.jl index c6c59187..a90aa53f 100644 --- a/src/julia/corpus_loader.jl +++ b/src/julia/corpus_loader.jl @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # corpus_loader.jl # diff --git a/src/julia/eval_held_out.jl b/src/julia/eval_held_out.jl index 64cae8fe..1d36d445 100644 --- a/src/julia/eval_held_out.jl +++ b/src/julia/eval_held_out.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # eval_held_out.jl — Evaluate a trained GNN model on the held-out validation split. diff --git a/src/julia/extract_all_proofs.jl b/src/julia/extract_all_proofs.jl index 667a8a44..f8fb1df8 100644 --- a/src/julia/extract_all_proofs.jl +++ b/src/julia/extract_all_proofs.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Enhanced proof extraction for all 12 provers using Dates diff --git a/src/julia/extract_training_data.jl b/src/julia/extract_training_data.jl index a82c48a4..a3f26e13 100644 --- a/src/julia/extract_training_data.jl +++ b/src/julia/extract_training_data.jl @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ Training Data Extraction for ECHIDNA v1.3 diff --git a/src/julia/inference/predict.jl b/src/julia/inference/predict.jl index e9b957e7..ed509607 100644 --- a/src/julia/inference/predict.jl +++ b/src/julia/inference/predict.jl @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ inference/predict.jl diff --git a/src/julia/ipc.jl b/src/julia/ipc.jl index 5423752f..b954eb25 100644 --- a/src/julia/ipc.jl +++ b/src/julia/ipc.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # src/julia/ipc.jl diff --git a/src/julia/models/encoder.jl b/src/julia/models/encoder.jl index 9f69c668..0bde4388 100644 --- a/src/julia/models/encoder.jl +++ b/src/julia/models/encoder.jl @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ models/encoder.jl diff --git a/src/julia/models/neural_solver.jl b/src/julia/models/neural_solver.jl index 7c3defe0..df5bedc9 100644 --- a/src/julia/models/neural_solver.jl +++ b/src/julia/models/neural_solver.jl @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ models/neural_solver.jl diff --git a/src/julia/probabilistic/gen_reasoning.jl b/src/julia/probabilistic/gen_reasoning.jl index ed3cd8a3..59366a3e 100644 --- a/src/julia/probabilistic/gen_reasoning.jl +++ b/src/julia/probabilistic/gen_reasoning.jl @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 ECHIDNA Project Contributors -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ Probabilistic Reasoning with Gen.jl diff --git a/src/julia/retrain_from_verisim.jl b/src/julia/retrain_from_verisim.jl index 1e3903d3..3aade27d 100644 --- a/src/julia/retrain_from_verisim.jl +++ b/src/julia/retrain_from_verisim.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) # # retrain_from_verisim.jl — Retrain ECHIDNA's logistic-regression premise diff --git a/src/julia/rl/training.jl b/src/julia/rl/training.jl index 84feb9ac..cc665fbf 100644 --- a/src/julia/rl/training.jl +++ b/src/julia/rl/training.jl @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 ECHIDNA Project Contributors -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ Reinforcement Learning Training Loop for ECHIDNA diff --git a/src/julia/run_server.jl b/src/julia/run_server.jl index a0c99cfd..cde7a684 100644 --- a/src/julia/run_server.jl +++ b/src/julia/run_server.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # run_server.jl — Start the ECHIDNA neural premise selection API server. diff --git a/src/julia/run_training.jl b/src/julia/run_training.jl index 4e670f47..bc5c3428 100644 --- a/src/julia/run_training.jl +++ b/src/julia/run_training.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # run_training.jl — Main entry point for training the ECHIDNA neural solver. diff --git a/src/julia/run_training_cpu.jl b/src/julia/run_training_cpu.jl index 50ae0745..a82b89d5 100644 --- a/src/julia/run_training_cpu.jl +++ b/src/julia/run_training_cpu.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # run_training_cpu.jl — CPU-pinned, capped training entry point for the diff --git a/src/julia/saturation_synonyms.jl b/src/julia/saturation_synonyms.jl index 0cc05bf5..431e1d64 100644 --- a/src/julia/saturation_synonyms.jl +++ b/src/julia/saturation_synonyms.jl @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # # saturation_synonyms.jl # diff --git a/src/julia/test_server.jl b/src/julia/test_server.jl index 4f160844..601b4627 100644 --- a/src/julia/test_server.jl +++ b/src/julia/test_server.jl @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 AND Palimpsest-0.6 +# SPDX-License-Identifier: AGPL-3.0-or-later AND Palimpsest-0.6 """ test_server.jl diff --git a/src/julia/training/dataloader.jl b/src/julia/training/dataloader.jl index 2af59aa2..ddb9026b 100644 --- a/src/julia/training/dataloader.jl +++ b/src/julia/training/dataloader.jl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # training/dataloader.jl diff --git a/src/julia/training/train.jl b/src/julia/training/train.jl index 17b195e0..55904d99 100644 --- a/src/julia/training/train.jl +++ b/src/julia/training/train.jl @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -# SPDX-License-Identifier: MPL-2.0 +# SPDX-License-Identifier: AGPL-3.0-or-later """ training/train.jl diff --git a/src/provers/Mod.res b/src/provers/Mod.res index be00792d..154162c6 100644 --- a/src/provers/Mod.res +++ b/src/provers/Mod.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) /** diff --git a/src/provers/clients/LeanTool.res b/src/provers/clients/LeanTool.res index 811d0641..e9846993 100644 --- a/src/provers/clients/LeanTool.res +++ b/src/provers/clients/LeanTool.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) /** diff --git a/src/provers/clients/Metamath.res b/src/provers/clients/Metamath.res index 4b96a75b..963ac652 100644 --- a/src/provers/clients/Metamath.res +++ b/src/provers/clients/Metamath.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) /** diff --git a/src/provers/clients/SystemOnTptp.res b/src/provers/clients/SystemOnTptp.res index 646c9655..d9c79d88 100644 --- a/src/provers/clients/SystemOnTptp.res +++ b/src/provers/clients/SystemOnTptp.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) /** diff --git a/src/provers/clients/Unified.res b/src/provers/clients/Unified.res index 6634bd0c..1a5c4b3f 100644 --- a/src/provers/clients/Unified.res +++ b/src/provers/clients/Unified.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) /** diff --git a/src/provers/clients/UnifiedTest.res b/src/provers/clients/UnifiedTest.res index 873b69bb..57df1bdc 100644 --- a/src/provers/clients/UnifiedTest.res +++ b/src/provers/clients/UnifiedTest.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) /** diff --git a/src/provers/clients/Wolfram.res b/src/provers/clients/Wolfram.res index 6cc21cf5..19e3cc95 100644 --- a/src/provers/clients/Wolfram.res +++ b/src/provers/clients/Wolfram.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) /** diff --git a/src/provers/clients/Z3Wasm.res b/src/provers/clients/Z3Wasm.res index 2daa472a..e1d3181b 100644 --- a/src/provers/clients/Z3Wasm.res +++ b/src/provers/clients/Z3Wasm.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) /** diff --git a/src/provers/runners/Cli.res b/src/provers/runners/Cli.res index 37f4a312..7eea354b 100644 --- a/src/provers/runners/Cli.res +++ b/src/provers/runners/Cli.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) /** diff --git a/src/provers/runners/Daemon.res b/src/provers/runners/Daemon.res index af4f7eef..9c251c9e 100644 --- a/src/provers/runners/Daemon.res +++ b/src/provers/runners/Daemon.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) /** diff --git a/src/provers/types/Prover.res b/src/provers/types/Prover.res index 12beebe1..530d00b7 100644 --- a/src/provers/types/Prover.res +++ b/src/provers/types/Prover.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) /** diff --git a/src/provers/types/ProverTest.res b/src/provers/types/ProverTest.res index da8f10fd..8d991395 100644 --- a/src/provers/types/ProverTest.res +++ b/src/provers/types/ProverTest.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) /** diff --git a/src/provers/utils/Http.res b/src/provers/utils/Http.res index f89fa2ef..e551a0be 100644 --- a/src/provers/utils/Http.res +++ b/src/provers/utils/Http.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) /** diff --git a/src/rescript/src/Main.res b/src/rescript/src/Main.res index cd56c09b..856e2f2d 100644 --- a/src/rescript/src/Main.res +++ b/src/rescript/src/Main.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team /** diff --git a/src/rescript/src/Server.res b/src/rescript/src/Server.res index 95bec478..a26b95a2 100644 --- a/src/rescript/src/Server.res +++ b/src/rescript/src/Server.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) /** diff --git a/src/rescript/src/api/Client.res b/src/rescript/src/api/Client.res index 276e649a..9b3fb5df 100644 --- a/src/rescript/src/api/Client.res +++ b/src/rescript/src/api/Client.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team /** diff --git a/src/rescript/src/components/GoalList.res b/src/rescript/src/components/GoalList.res index b57f31cc..f65f1861 100644 --- a/src/rescript/src/components/GoalList.res +++ b/src/rescript/src/components/GoalList.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team /** diff --git a/src/rescript/src/components/ProofTree.res b/src/rescript/src/components/ProofTree.res index fab7d278..6f938739 100644 --- a/src/rescript/src/components/ProofTree.res +++ b/src/rescript/src/components/ProofTree.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team /** diff --git a/src/rescript/src/components/ProofViewer.res b/src/rescript/src/components/ProofViewer.res index ecdfa5b0..3c571e14 100644 --- a/src/rescript/src/components/ProofViewer.res +++ b/src/rescript/src/components/ProofViewer.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team /** diff --git a/src/rescript/src/components/ProverSelector.res b/src/rescript/src/components/ProverSelector.res index a7436514..1b577743 100644 --- a/src/rescript/src/components/ProverSelector.res +++ b/src/rescript/src/components/ProverSelector.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team /** diff --git a/src/rescript/src/components/TacticSuggester.res b/src/rescript/src/components/TacticSuggester.res index c8535c1e..509c80fd 100644 --- a/src/rescript/src/components/TacticSuggester.res +++ b/src/rescript/src/components/TacticSuggester.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team /** diff --git a/src/rescript/src/components/TheoremSearch.res b/src/rescript/src/components/TheoremSearch.res index 03fca7df..c13e9fcd 100644 --- a/src/rescript/src/components/TheoremSearch.res +++ b/src/rescript/src/components/TheoremSearch.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team /** diff --git a/src/rescript/src/state/Store.res b/src/rescript/src/state/Store.res index 3fd3cac9..658eaac3 100644 --- a/src/rescript/src/state/Store.res +++ b/src/rescript/src/state/Store.res @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team // Types for theorem provers diff --git a/src/rescript/test-ui.js b/src/rescript/test-ui.js index de992e76..adfa5aa6 100644 --- a/src/rescript/test-ui.js +++ b/src/rescript/test-ui.js @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Quick test of UI API connectivity const apiBase = 'http://127.0.0.1:8081/api'; diff --git a/src/rust/agent/actors.rs b/src/rust/agent/actors.rs index df3de680..5950219d 100644 --- a/src/rust/agent/actors.rs +++ b/src/rust/agent/actors.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Contributors -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] #![allow(unexpected_cfgs)] diff --git a/src/rust/agent/explanations.rs b/src/rust/agent/explanations.rs index f71213d8..ca5d1ce8 100644 --- a/src/rust/agent/explanations.rs +++ b/src/rust/agent/explanations.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Contributors -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/agent/memory.rs b/src/rust/agent/memory.rs index ae5d21e7..6c105622 100644 --- a/src/rust/agent/memory.rs +++ b/src/rust/agent/memory.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Contributors -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/agent/meta_controller.rs b/src/rust/agent/meta_controller.rs index 6838109d..3f2e6bbd 100644 --- a/src/rust/agent/meta_controller.rs +++ b/src/rust/agent/meta_controller.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! MetaController — coordinates prover backends with coprocessor backends. diff --git a/src/rust/agent/mod.rs b/src/rust/agent/mod.rs index 13354693..3db453d7 100644 --- a/src/rust/agent/mod.rs +++ b/src/rust/agent/mod.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Contributors -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/agent/planner.rs b/src/rust/agent/planner.rs index cf0c35ec..363bcc83 100644 --- a/src/rust/agent/planner.rs +++ b/src/rust/agent/planner.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Contributors -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/agent/router.rs b/src/rust/agent/router.rs index 80906c52..3784588d 100644 --- a/src/rust/agent/router.rs +++ b/src/rust/agent/router.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Contributors -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/agent/swarm.rs b/src/rust/agent/swarm.rs index 48a12c28..708cb082 100644 --- a/src/rust/agent/swarm.rs +++ b/src/rust/agent/swarm.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! 007-style swarm dispatcher over a `DesignProblem`. //! diff --git a/src/rust/anomaly_detection.rs b/src/rust/anomaly_detection.rs index d63110af..21c6ba41 100644 --- a/src/rust/anomaly_detection.rs +++ b/src/rust/anomaly_detection.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Anomaly detection for proof validation use serde::{Deserialize, Serialize}; diff --git a/src/rust/aspect.rs b/src/rust/aspect.rs index 25fc2699..87322a62 100644 --- a/src/rust/aspect.rs +++ b/src/rust/aspect.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Aspect tagging system for classifying theorems by domain/topic //! diff --git a/src/rust/coprocessor/audio.rs b/src/rust/coprocessor/audio.rs index b6e4dbbe..4b0c0126 100644 --- a/src/rust/coprocessor/audio.rs +++ b/src/rust/coprocessor/audio.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) // hypatia: allow code_safety/unwrap_without_check diff --git a/src/rust/coprocessor/crypto.rs b/src/rust/coprocessor/crypto.rs index bbefb785..0b5bb88d 100644 --- a/src/rust/coprocessor/crypto.rs +++ b/src/rust/coprocessor/crypto.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! Crypto coprocessor — computational cryptographic primitives. diff --git a/src/rust/coprocessor/dsp.rs b/src/rust/coprocessor/dsp.rs index e2d35a4b..d525ed62 100644 --- a/src/rust/coprocessor/dsp.rs +++ b/src/rust/coprocessor/dsp.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! DSP coprocessor — FFT / IFFT / window functions via `rustfft`. diff --git a/src/rust/coprocessor/flint.rs b/src/rust/coprocessor/flint.rs index 8384cc27..0d1a2a78 100644 --- a/src/rust/coprocessor/flint.rs +++ b/src/rust/coprocessor/flint.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! FLINT coprocessor backend — integer and polynomial algebra via C FFI. diff --git a/src/rust/coprocessor/fpga.rs b/src/rust/coprocessor/fpga.rs index b3763f5b..a31baa36 100644 --- a/src/rust/coprocessor/fpga.rs +++ b/src/rust/coprocessor/fpga.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! FPGA / hardware-synthesis coprocessor — subprocess to yosys. diff --git a/src/rust/coprocessor/gap.rs b/src/rust/coprocessor/gap.rs index 0efe3016..b5070e2d 100644 --- a/src/rust/coprocessor/gap.rs +++ b/src/rust/coprocessor/gap.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! GAP group-theory coprocessor — subprocess to `gap`. diff --git a/src/rust/coprocessor/graphics.rs b/src/rust/coprocessor/graphics.rs index a745eb80..877e1a05 100644 --- a/src/rust/coprocessor/graphics.rs +++ b/src/rust/coprocessor/graphics.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! Graphics coprocessor — 2-D SVG rendering, no GPU dependency. diff --git a/src/rust/coprocessor/io.rs b/src/rust/coprocessor/io.rs index bcff7653..c2d359b4 100644 --- a/src/rust/coprocessor/io.rs +++ b/src/rust/coprocessor/io.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! IO coprocessor — file / stream operations via `tokio::fs`. diff --git a/src/rust/coprocessor/julia_bridge.rs b/src/rust/coprocessor/julia_bridge.rs index 71a4dfa9..b73e4072 100644 --- a/src/rust/coprocessor/julia_bridge.rs +++ b/src/rust/coprocessor/julia_bridge.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! Rust ↔ Julia coprocessor bridge. diff --git a/src/rust/coprocessor/macaulay2.rs b/src/rust/coprocessor/macaulay2.rs index 49c997e5..d7276e0f 100644 --- a/src/rust/coprocessor/macaulay2.rs +++ b/src/rust/coprocessor/macaulay2.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! Macaulay2 algebraic-geometry coprocessor — subprocess to `M2`. diff --git a/src/rust/coprocessor/math.rs b/src/rust/coprocessor/math.rs index ab38f526..c0bcf799 100644 --- a/src/rust/coprocessor/math.rs +++ b/src/rust/coprocessor/math.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! Math coprocessor — exact arithmetic + number theory. diff --git a/src/rust/coprocessor/maxima.rs b/src/rust/coprocessor/maxima.rs index 774ac8f0..c064bb6b 100644 --- a/src/rust/coprocessor/maxima.rs +++ b/src/rust/coprocessor/maxima.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! Maxima symbolic-algebra coprocessor — subprocess to `maxima`. diff --git a/src/rust/coprocessor/mod.rs b/src/rust/coprocessor/mod.rs index 485f6df1..3e168196 100644 --- a/src/rust/coprocessor/mod.rs +++ b/src/rust/coprocessor/mod.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! Coprocessor abstraction. diff --git a/src/rust/coprocessor/parigp.rs b/src/rust/coprocessor/parigp.rs index 86ed07e6..48554ec9 100644 --- a/src/rust/coprocessor/parigp.rs +++ b/src/rust/coprocessor/parigp.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! PARI/GP number-theory coprocessor — subprocess to `gp`. diff --git a/src/rust/coprocessor/physics.rs b/src/rust/coprocessor/physics.rs index b8b4fec9..5d0383f4 100644 --- a/src/rust/coprocessor/physics.rs +++ b/src/rust/coprocessor/physics.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! Physics coprocessor — numerical ODE integration + invariant oracles. diff --git a/src/rust/coprocessor/singular.rs b/src/rust/coprocessor/singular.rs index f894e0c3..2647df0f 100644 --- a/src/rust/coprocessor/singular.rs +++ b/src/rust/coprocessor/singular.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! Singular polynomial-algebra coprocessor — subprocess to `Singular`. diff --git a/src/rust/coprocessor/tensor.rs b/src/rust/coprocessor/tensor.rs index 1a65dde4..a86e0cf0 100644 --- a/src/rust/coprocessor/tensor.rs +++ b/src/rust/coprocessor/tensor.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! Tensor coprocessor — dense linear algebra via `nalgebra`. diff --git a/src/rust/coprocessor/trust.rs b/src/rust/coprocessor/trust.rs index 5bd725d2..1aa8f9df 100644 --- a/src/rust/coprocessor/trust.rs +++ b/src/rust/coprocessor/trust.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! Coprocessor trust-tier classification. diff --git a/src/rust/coprocessor/types.rs b/src/rust/coprocessor/types.rs index 777dca24..fbf4507e 100644 --- a/src/rust/coprocessor/types.rs +++ b/src/rust/coprocessor/types.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! Coprocessor type surface. diff --git a/src/rust/coprocessor/vector.rs b/src/rust/coprocessor/vector.rs index dc3495f5..7779b03a 100644 --- a/src/rust/coprocessor/vector.rs +++ b/src/rust/coprocessor/vector.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) //! Vector coprocessor — dense f64 arithmetic. diff --git a/src/rust/corpus/acl2_books.rs b/src/rust/corpus/acl2_books.rs index 3c0ec0a1..984f505a 100644 --- a/src/rust/corpus/acl2_books.rs +++ b/src/rust/corpus/acl2_books.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! ACL2 community-books adapter for the corpus indexer. //! diff --git a/src/rust/corpus/agda.rs b/src/rust/corpus/agda.rs index 8e82fecf..25c65a51 100644 --- a/src/rust/corpus/agda.rs +++ b/src/rust/corpus/agda.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Agda adapter for the corpus indexer. //! diff --git a/src/rust/corpus/coq.rs b/src/rust/corpus/coq.rs index 1b998a91..55bde97f 100644 --- a/src/rust/corpus/coq.rs +++ b/src/rust/corpus/coq.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Coq adapter for the corpus indexer — Step 2 of the N-dim plan. //! diff --git a/src/rust/corpus/dafny.rs b/src/rust/corpus/dafny.rs index 80de4953..9ace5928 100644 --- a/src/rust/corpus/dafny.rs +++ b/src/rust/corpus/dafny.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Dafny adapter for the corpus indexer. //! diff --git a/src/rust/corpus/embed.rs b/src/rust/corpus/embed.rs index 4a8d1a7c..0b929929 100644 --- a/src/rust/corpus/embed.rs +++ b/src/rust/corpus/embed.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Vector-octad embeddings for the corpus — Step 5 of the N-dim //! VeriSim plan. diff --git a/src/rust/corpus/fstar.rs b/src/rust/corpus/fstar.rs index 9ce767b6..8c48ccf2 100644 --- a/src/rust/corpus/fstar.rs +++ b/src/rust/corpus/fstar.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! F* adapter for the corpus indexer. //! diff --git a/src/rust/corpus/hol4.rs b/src/rust/corpus/hol4.rs index 50b9304f..affc20cc 100644 --- a/src/rust/corpus/hol4.rs +++ b/src/rust/corpus/hol4.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! HOL4 adapter for the corpus indexer. //! diff --git a/src/rust/corpus/hol_light.rs b/src/rust/corpus/hol_light.rs index b0c19d80..910b26d2 100644 --- a/src/rust/corpus/hol_light.rs +++ b/src/rust/corpus/hol_light.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! HOL Light adapter for the corpus indexer. //! diff --git a/src/rust/corpus/idris2.rs b/src/rust/corpus/idris2.rs index baa0ecfe..822101fa 100644 --- a/src/rust/corpus/idris2.rs +++ b/src/rust/corpus/idris2.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Idris 2 adapter for the corpus indexer — Step 2 of the N-dim plan. //! diff --git a/src/rust/corpus/isabelle.rs b/src/rust/corpus/isabelle.rs index caa88ef2..2a0ac122 100644 --- a/src/rust/corpus/isabelle.rs +++ b/src/rust/corpus/isabelle.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Isabelle/HOL AFP adapter for the corpus indexer. //! diff --git a/src/rust/corpus/lean.rs b/src/rust/corpus/lean.rs index 75de54eb..962f19f5 100644 --- a/src/rust/corpus/lean.rs +++ b/src/rust/corpus/lean.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Lean 4 adapter for the corpus indexer — Step 2 of the N-dim plan. //! diff --git a/src/rust/corpus/metamath.rs b/src/rust/corpus/metamath.rs index dcd07851..bf37bfed 100644 --- a/src/rust/corpus/metamath.rs +++ b/src/rust/corpus/metamath.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! MetaMath adapter for the corpus indexer. //! diff --git a/src/rust/corpus/metrics.rs b/src/rust/corpus/metrics.rs index c7b82c80..2652a4d3 100644 --- a/src/rust/corpus/metrics.rs +++ b/src/rust/corpus/metrics.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Per-entry metrics tensor — Step 4 of the N-dim VeriSim plan. //! diff --git a/src/rust/corpus/minif2f.rs b/src/rust/corpus/minif2f.rs index 7d9fbc11..294b86fe 100644 --- a/src/rust/corpus/minif2f.rs +++ b/src/rust/corpus/minif2f.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! MiniF2F adapter for the corpus indexer. //! diff --git a/src/rust/corpus/mizar.rs b/src/rust/corpus/mizar.rs index ffde21a3..82129e38 100644 --- a/src/rust/corpus/mizar.rs +++ b/src/rust/corpus/mizar.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Mizar adapter for the corpus indexer. //! diff --git a/src/rust/corpus/mod.rs b/src/rust/corpus/mod.rs index 9fc0d91c..cd035a44 100644 --- a/src/rust/corpus/mod.rs +++ b/src/rust/corpus/mod.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Project-corpus indexer. //! diff --git a/src/rust/corpus/octad.rs b/src/rust/corpus/octad.rs index 3bed3eff..92f8bf10 100644 --- a/src/rust/corpus/octad.rs +++ b/src/rust/corpus/octad.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! 8-modality octad emission for the corpus — Step 3 of the N-dim //! VeriSim plan. diff --git a/src/rust/corpus/proofnet.rs b/src/rust/corpus/proofnet.rs index 2d5e37d4..eda3fbca 100644 --- a/src/rust/corpus/proofnet.rs +++ b/src/rust/corpus/proofnet.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! ProofNet adapter for the corpus indexer. //! diff --git a/src/rust/corpus/query.rs b/src/rust/corpus/query.rs index 01e40f2e..c030b581 100644 --- a/src/rust/corpus/query.rs +++ b/src/rust/corpus/query.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Multi-axis query DSL — capstone of the N-dim VeriSim plan. //! diff --git a/src/rust/corpus/smtlib.rs b/src/rust/corpus/smtlib.rs index bc0a8bf9..32e31ae2 100644 --- a/src/rust/corpus/smtlib.rs +++ b/src/rust/corpus/smtlib.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! SMT-LIB v2 adapter for the corpus indexer. //! diff --git a/src/rust/corpus/tptp.rs b/src/rust/corpus/tptp.rs index fa51322d..b81d5821 100644 --- a/src/rust/corpus/tptp.rs +++ b/src/rust/corpus/tptp.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! TPTP (Thousands of Problems for Theorem Provers) adapter for the //! corpus indexer. diff --git a/src/rust/corpus/why3.rs b/src/rust/corpus/why3.rs index 0294c5a7..f06c6ce0 100644 --- a/src/rust/corpus/why3.rs +++ b/src/rust/corpus/why3.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Why3 adapter for the corpus indexer. //! diff --git a/src/rust/diagnostics/corpus_monitor.rs b/src/rust/diagnostics/corpus_monitor.rs index 10c40138..c6577352 100644 --- a/src/rust/diagnostics/corpus_monitor.rs +++ b/src/rust/diagnostics/corpus_monitor.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Monitor corpus health: proofs, premises, size metrics use chrono::{DateTime, Utc}; diff --git a/src/rust/diagnostics/fallback_monitor.rs b/src/rust/diagnostics/fallback_monitor.rs index da090578..b100b1f3 100644 --- a/src/rust/diagnostics/fallback_monitor.rs +++ b/src/rust/diagnostics/fallback_monitor.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Cosine fallback SLA monitoring and cache health tracking use serde::{Deserialize, Serialize}; diff --git a/src/rust/diagnostics/gnn_training.rs b/src/rust/diagnostics/gnn_training.rs index 2b800fa8..7349eeb9 100644 --- a/src/rust/diagnostics/gnn_training.rs +++ b/src/rust/diagnostics/gnn_training.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // GNN model training integration with health monitoring use chrono::{DateTime, Utc}; diff --git a/src/rust/diagnostics/health.rs b/src/rust/diagnostics/health.rs index 0a109b46..79035347 100644 --- a/src/rust/diagnostics/health.rs +++ b/src/rust/diagnostics/health.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Health status monitoring for echidna services use chrono::{DateTime, Utc}; diff --git a/src/rust/diagnostics/mod.rs b/src/rust/diagnostics/mod.rs index 26b352db..1ec2d5c1 100644 --- a/src/rust/diagnostics/mod.rs +++ b/src/rust/diagnostics/mod.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Health diagnostics and monitoring for echidna pub mod corpus_monitor; diff --git a/src/rust/diagnostics/nesy_validation.rs b/src/rust/diagnostics/nesy_validation.rs index 95aa2581..14cb6ca2 100644 --- a/src/rust/diagnostics/nesy_validation.rs +++ b/src/rust/diagnostics/nesy_validation.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // NeSy (Neurosymbolic) agreement validation between GNN and symbolic solvers use serde::{Deserialize, Serialize}; diff --git a/src/rust/diagnostics/proof_failure.rs b/src/rust/diagnostics/proof_failure.rs index 4a68824a..3bbec30f 100644 --- a/src/rust/diagnostics/proof_failure.rs +++ b/src/rust/diagnostics/proof_failure.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Proof failure diagnostics. //! diff --git a/src/rust/disciplines/detector.rs b/src/rust/disciplines/detector.rs index d15e1d49..2e437593 100644 --- a/src/rust/disciplines/detector.rs +++ b/src/rust/disciplines/detector.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Discipline detector — extracts type-discipline tags from corpus //! entry text by scoring [`super::registry::MarkerRegistry`] markers. diff --git a/src/rust/disciplines/mod.rs b/src/rust/disciplines/mod.rs index 5e1febc5..b3a64c11 100644 --- a/src/rust/disciplines/mod.rs +++ b/src/rust/disciplines/mod.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/src/rust/disciplines/registry.rs b/src/rust/disciplines/registry.rs index 2ceca02e..4b66e792 100644 --- a/src/rust/disciplines/registry.rs +++ b/src/rust/disciplines/registry.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Discipline marker registry for the corpus-side detector. //! diff --git a/src/rust/dispatch.rs b/src/rust/dispatch.rs index 4008a731..8665c45b 100644 --- a/src/rust/dispatch.rs +++ b/src/rust/dispatch.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Prover dispatch module //! diff --git a/src/rust/exchange/dedukti.rs b/src/rust/exchange/dedukti.rs index abd6ab0c..fa674b75 100644 --- a/src/rust/exchange/dedukti.rs +++ b/src/rust/exchange/dedukti.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Dedukti/Lambdapi proof exchange format //! diff --git a/src/rust/exchange/lambdapi.rs b/src/rust/exchange/lambdapi.rs index 2f59209a..733cc554 100644 --- a/src/rust/exchange/lambdapi.rs +++ b/src/rust/exchange/lambdapi.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell //! Lambdapi proof exchange format. diff --git a/src/rust/exchange/mod.rs b/src/rust/exchange/mod.rs index 0711e1b1..f8090fa8 100644 --- a/src/rust/exchange/mod.rs +++ b/src/rust/exchange/mod.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell //! Cross-prover proof exchange module diff --git a/src/rust/exchange/opentheory.rs b/src/rust/exchange/opentheory.rs index 1acfd4ee..8b61561e 100644 --- a/src/rust/exchange/opentheory.rs +++ b/src/rust/exchange/opentheory.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! OpenTheory proof exchange format //! diff --git a/src/rust/exchange/smtcoq.rs b/src/rust/exchange/smtcoq.rs index 38314d6f..8b346a10 100644 --- a/src/rust/exchange/smtcoq.rs +++ b/src/rust/exchange/smtcoq.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell //! SMTCoq bridge — STUB BRIDGE (parse-and-skeleton only). diff --git a/src/rust/exchange/smtlib.rs b/src/rust/exchange/smtlib.rs index 3539e814..fa41ca35 100644 --- a/src/rust/exchange/smtlib.rs +++ b/src/rust/exchange/smtlib.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell //! SMT-LIB v2 exchange and cross-solver normalisation. diff --git a/src/rust/exchange/tptp.rs b/src/rust/exchange/tptp.rs index 8211fc13..6be625e2 100644 --- a/src/rust/exchange/tptp.rs +++ b/src/rust/exchange/tptp.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell //! TPTP (Thousands of Problems for Theorem Provers) exchange format diff --git a/src/rust/executor/bounded.rs b/src/rust/executor/bounded.rs index d8a82443..7e910f88 100644 --- a/src/rust/executor/bounded.rs +++ b/src/rust/executor/bounded.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // // executor/bounded.rs — Output-capped command execution. diff --git a/src/rust/executor/mod.rs b/src/rust/executor/mod.rs index fb736fdf..23360773 100644 --- a/src/rust/executor/mod.rs +++ b/src/rust/executor/mod.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Solver execution and sandboxing module //! diff --git a/src/rust/executor/sandbox.rs b/src/rust/executor/sandbox.rs index 41f5cbdb..f3c6e13e 100644 --- a/src/rust/executor/sandbox.rs +++ b/src/rust/executor/sandbox.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Solver sandboxing for process isolation //! diff --git a/src/rust/fault_tolerance/mod.rs b/src/rust/fault_tolerance/mod.rs index 78a5bae5..f0c1a2b4 100644 --- a/src/rust/fault_tolerance/mod.rs +++ b/src/rust/fault_tolerance/mod.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Fault-tolerance primitives for echidna prover backends // Includes circuit breakers, retry policies, bulkheads diff --git a/src/rust/fault_tolerance/resilience.rs b/src/rust/fault_tolerance/resilience.rs index 2d5700e4..8b92c69b 100644 --- a/src/rust/fault_tolerance/resilience.rs +++ b/src/rust/fault_tolerance/resilience.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Circuit breaker, retry policy, bulkhead isolation for fault tolerance use std::fmt; diff --git a/src/rust/ffi/mod.rs b/src/rust/ffi/mod.rs index 0a06ef2e..495d407a 100644 --- a/src/rust/ffi/mod.rs +++ b/src/rust/ffi/mod.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! FFI bindings for ECHIDNA //! diff --git a/src/rust/ffi/spark_axiom.rs b/src/rust/ffi/spark_axiom.rs index 339ca418..54c9df1b 100644 --- a/src/rust/ffi/spark_axiom.rs +++ b/src/rust/ffi/spark_axiom.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) // //! Rust bindings to the SPARK-verified axiom-policy layer. diff --git a/src/rust/gnn/client.rs b/src/rust/gnn/client.rs index e637ba00..4108fbd6 100644 --- a/src/rust/gnn/client.rs +++ b/src/rust/gnn/client.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell #![forbid(unsafe_code)] diff --git a/src/rust/gnn/embeddings.rs b/src/rust/gnn/embeddings.rs index ddb29dfb..1e2ae379 100644 --- a/src/rust/gnn/embeddings.rs +++ b/src/rust/gnn/embeddings.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell #![forbid(unsafe_code)] diff --git a/src/rust/gnn/fallback_monitor.rs b/src/rust/gnn/fallback_monitor.rs index bb802f1f..36bab5d6 100644 --- a/src/rust/gnn/fallback_monitor.rs +++ b/src/rust/gnn/fallback_monitor.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Monitor cosine similarity fallback performance and SLA compliance use serde::{Deserialize, Serialize}; diff --git a/src/rust/gnn/graph.rs b/src/rust/gnn/graph.rs index 213376a9..2c3efbfc 100644 --- a/src/rust/gnn/graph.rs +++ b/src/rust/gnn/graph.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell #![forbid(unsafe_code)] diff --git a/src/rust/gnn/guided_search.rs b/src/rust/gnn/guided_search.rs index cda739b5..a5291f0b 100644 --- a/src/rust/gnn/guided_search.rs +++ b/src/rust/gnn/guided_search.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell #![forbid(unsafe_code)] diff --git a/src/rust/gnn/mod.rs b/src/rust/gnn/mod.rs index cfa11079..5f9510d6 100644 --- a/src/rust/gnn/mod.rs +++ b/src/rust/gnn/mod.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell #![forbid(unsafe_code)] diff --git a/src/rust/groove.rs b/src/rust/groove.rs index f0fb465a..2079e70f 100644 --- a/src/rust/groove.rs +++ b/src/rust/groove.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // //! Gossamer Groove endpoint for ECHIDNA. diff --git a/src/rust/integration.rs b/src/rust/integration.rs index 658a8ef6..7ec80ba1 100644 --- a/src/rust/integration.rs +++ b/src/rust/integration.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Integration layer connecting Rust backend ↔ Julia ML ↔ ReScript UI //! diff --git a/src/rust/integrations/conceptnet.rs b/src/rust/integrations/conceptnet.rs index 6e4ff546..1c70b02f 100644 --- a/src/rust/integrations/conceptnet.rs +++ b/src/rust/integrations/conceptnet.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Contributors -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! ConceptNet Integration - Common-sense knowledge augmentation //! diff --git a/src/rust/integrity/io.rs b/src/rust/integrity/io.rs index 381b984d..957bde75 100644 --- a/src/rust/integrity/io.rs +++ b/src/rust/integrity/io.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Sync bounded read for operator-controlled config files. diff --git a/src/rust/integrity/mod.rs b/src/rust/integrity/mod.rs index 9775ff64..e277874d 100644 --- a/src/rust/integrity/mod.rs +++ b/src/rust/integrity/mod.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Solver binary integrity verification module //! diff --git a/src/rust/integrity/solver_integrity.rs b/src/rust/integrity/solver_integrity.rs index 4c17b61e..a9ee7f98 100644 --- a/src/rust/integrity/solver_integrity.rs +++ b/src/rust/integrity/solver_integrity.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Solver binary integrity verification using SHAKE3-512 and BLAKE3 //! diff --git a/src/rust/ipc/mod.rs b/src/rust/ipc/mod.rs index 42ada5f3..1c309d23 100644 --- a/src/rust/ipc/mod.rs +++ b/src/rust/ipc/mod.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell //! L1 IPC transport layer — Cap'n Proto over Unix domain sockets. diff --git a/src/rust/learning/buchholz_rank.rs b/src/rust/learning/buchholz_rank.rs index 714a2e54..9eab9101 100644 --- a/src/rust/learning/buchholz_rank.rs +++ b/src/rust/learning/buchholz_rank.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Rank-function search for unbudgeted `wf-<ᵇʳᶠ_`. //! diff --git a/src/rust/learning/curriculum.rs b/src/rust/learning/curriculum.rs index 66f97201..d26d87ab 100644 --- a/src/rust/learning/curriculum.rs +++ b/src/rust/learning/curriculum.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Curriculum scheduler. diff --git a/src/rust/learning/daemon.rs b/src/rust/learning/daemon.rs index e40e9d6f..a081b2a5 100644 --- a/src/rust/learning/daemon.rs +++ b/src/rust/learning/daemon.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Continuous self-learning daemon. diff --git a/src/rust/learning/design_search.rs b/src/rust/learning/design_search.rs index 743dfbdf..095623c6 100644 --- a/src/rust/learning/design_search.rs +++ b/src/rust/learning/design_search.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Simulated annealing over **proof-design space** (not tactic space). //! diff --git a/src/rust/learning/mcts.rs b/src/rust/learning/mcts.rs index a55252c2..8641ee3c 100644 --- a/src/rust/learning/mcts.rs +++ b/src/rust/learning/mcts.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Monte Carlo Tree Search over tactic space. diff --git a/src/rust/learning/mod.rs b/src/rust/learning/mod.rs index 1c200f51..a3923882 100644 --- a/src/rust/learning/mod.rs +++ b/src/rust/learning/mod.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Continuous self-learning loop for ECHIDNA. diff --git a/src/rust/learning/self_play.rs b/src/rust/learning/self_play.rs index fb1a4a1d..14febc91 100644 --- a/src/rust/learning/self_play.rs +++ b/src/rust/learning/self_play.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Self-play corpus generator. diff --git a/src/rust/lib.rs b/src/rust/lib.rs index c927b4f5..6eb1932f 100644 --- a/src/rust/lib.rs +++ b/src/rust/lib.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! ECHIDNA: Extensible Cognitive Hybrid Intelligence for Deductive Neural Assistance //! diff --git a/src/rust/llm.rs b/src/rust/llm.rs index 859560f2..c5b9d462 100644 --- a/src/rust/llm.rs +++ b/src/rust/llm.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Frontier LLM integration for ECHIDNA //! //! Connects to frontier language models (Claude, GPT-4, etc.) via BoJ Server diff --git a/src/rust/main.rs b/src/rust/main.rs index b6674d6d..2ac819bd 100644 --- a/src/rust/main.rs +++ b/src/rust/main.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! ECHIDNA CLI - Main binary entry point //! diff --git a/src/rust/neural.rs b/src/rust/neural.rs index a0aa93eb..b11f0374 100644 --- a/src/rust/neural.rs +++ b/src/rust/neural.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Neural premise selection and tactic suggestion //! diff --git a/src/rust/output.rs b/src/rust/output.rs index b897b387..232a30e6 100644 --- a/src/rust/output.rs +++ b/src/rust/output.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Output formatting module for CLI //! diff --git a/src/rust/parsers/mod.rs b/src/rust/parsers/mod.rs index 3de3c2ad..8f266062 100644 --- a/src/rust/parsers/mod.rs +++ b/src/rust/parsers/mod.rs @@ -1,4 +1,4 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Parser utilities for various theorem prover formats diff --git a/src/rust/proof_encoding.rs b/src/rust/proof_encoding.rs index 87440458..a871a5ae 100644 --- a/src/rust/proof_encoding.rs +++ b/src/rust/proof_encoding.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Proof Encoding — CBOR serialisation and identity hashing for VeriSimDB octads. //! diff --git a/src/rust/proof_search.rs b/src/rust/proof_search.rs index de39515c..d9621f3c 100644 --- a/src/rust/proof_search.rs +++ b/src/rust/proof_search.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Proof search strategies for ECHIDNA //! //! This module implements pluggable proof search strategies following the diff --git a/src/rust/provers/abc.rs b/src/rust/provers/abc.rs index f8b4de55..c898ef29 100644 --- a/src/rust/provers/abc.rs +++ b/src/rust/provers/abc.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! ABC Logic Synthesis and Formal Verification Backend diff --git a/src/rust/provers/abella.rs b/src/rust/provers/abella.rs index b51a0c10..5f9781ee 100644 --- a/src/rust/provers/abella.rs +++ b/src/rust/provers/abella.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Abella — classical Axis-1 prover for nominal logic / HOAS / λ-tree syntax. diff --git a/src/rust/provers/acl2.rs b/src/rust/provers/acl2.rs index 666e6356..0fe83690 100644 --- a/src/rust/provers/acl2.rs +++ b/src/rust/provers/acl2.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/provers/acl2s.rs b/src/rust/provers/acl2s.rs index cfab3217..c6c34fe9 100644 --- a/src/rust/provers/acl2s.rs +++ b/src/rust/provers/acl2s.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! ACL2s — sibling dialect to ACL2 with richer type annotations and diff --git a/src/rust/provers/agda.rs b/src/rust/provers/agda.rs index aaefc3ef..3d6106a3 100644 --- a/src/rust/provers/agda.rs +++ b/src/rust/provers/agda.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/provers/agsyhol.rs b/src/rust/provers/agsyhol.rs index 9c19e985..4900435a 100644 --- a/src/rust/provers/agsyhol.rs +++ b/src/rust/provers/agsyhol.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! agsyHOL higher-order automated theorem prover backend diff --git a/src/rust/provers/alloy.rs b/src/rust/provers/alloy.rs index 8bd84aa1..5c63bab8 100644 --- a/src/rust/provers/alloy.rs +++ b/src/rust/provers/alloy.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Alloy Relational Model Finder Backend diff --git a/src/rust/provers/altergo.rs b/src/rust/provers/altergo.rs index 8c9053b9..0e9515bc 100644 --- a/src/rust/provers/altergo.rs +++ b/src/rust/provers/altergo.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Alt-Ergo backend //! diff --git a/src/rust/provers/aprove.rs b/src/rust/provers/aprove.rs index bef9fdda..c1b61deb 100644 --- a/src/rust/provers/aprove.rs +++ b/src/rust/provers/aprove.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! AProVE (Automated Program Verification Engine) backend //! diff --git a/src/rust/provers/arend.rs b/src/rust/provers/arend.rs index 07938cfe..d560a3cd 100644 --- a/src/rust/provers/arend.rs +++ b/src/rust/provers/arend.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // //! Arend — cubical HoTT prover (JetBrains). Distinct from Agda's diff --git a/src/rust/provers/athena.rs b/src/rust/provers/athena.rs index 36d4f3c5..069455c2 100644 --- a/src/rust/provers/athena.rs +++ b/src/rust/provers/athena.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // //! Athena — Arkoudas's denotational-proof-language. Unique in having diff --git a/src/rust/provers/boogie.rs b/src/rust/provers/boogie.rs index 84a1fcef..e5f1bfd7 100644 --- a/src/rust/provers/boogie.rs +++ b/src/rust/provers/boogie.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Boogie — intermediate verification language standalone backend. diff --git a/src/rust/provers/cadical.rs b/src/rust/provers/cadical.rs index 4a192be4..9f766d73 100644 --- a/src/rust/provers/cadical.rs +++ b/src/rust/provers/cadical.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! CaDiCaL SAT Solver Backend diff --git a/src/rust/provers/cameleer.rs b/src/rust/provers/cameleer.rs index ac51e6e7..61a52172 100644 --- a/src/rust/provers/cameleer.rs +++ b/src/rust/provers/cameleer.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Cameleer — OCaml front-end for Why3. diff --git a/src/rust/provers/cbmc.rs b/src/rust/provers/cbmc.rs index b1c2584f..4ece2066 100644 --- a/src/rust/provers/cbmc.rs +++ b/src/rust/provers/cbmc.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! CBMC Bounded Model Checker Backend diff --git a/src/rust/provers/chuffed.rs b/src/rust/provers/chuffed.rs index 96808cae..910f3072 100644 --- a/src/rust/provers/chuffed.rs +++ b/src/rust/provers/chuffed.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Chuffed lazy clause generation CP solver backend #![allow(dead_code)] use super::{ProverBackend, ProverConfig, ProverKind}; diff --git a/src/rust/provers/connection_method.rs b/src/rust/provers/connection_method.rs index c4b1336a..c0069ca2 100644 --- a/src/rust/provers/connection_method.rs +++ b/src/rust/provers/connection_method.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Shared helpers for the connection-method prover family //! (MleanCoP / ileanCoP / nanoCoP). diff --git a/src/rust/provers/coq.rs b/src/rust/provers/coq.rs index da9607ca..3a9c4c7d 100644 --- a/src/rust/provers/coq.rs +++ b/src/rust/provers/coq.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/provers/cryptoverif.rs b/src/rust/provers/cryptoverif.rs index c43721ac..669a54d5 100644 --- a/src/rust/provers/cryptoverif.rs +++ b/src/rust/provers/cryptoverif.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! CryptoVerif backend — automatic prover for cryptographic protocols //! in the computational model. @@ -74,7 +74,7 @@ impl CryptoVerifBackend { /// emitted as the `query` line that drives the prover. fn to_ocv(state: &ProofState) -> String { let mut ocv = String::new(); - ocv.push_str("(* SPDX-License-Identifier: MPL-2.0 *)\n"); + ocv.push_str("(* SPDX-License-Identifier: AGPL-3.0-or-later *)\n"); ocv.push_str("(* CryptoVerif input synthesised by ECHIDNA *)\n\n"); for axiom in &state.context.axioms { ocv.push_str(&format!("def {}.\n", axiom)); diff --git a/src/rust/provers/csi.rs b/src/rust/provers/csi.rs index a14f3390..c77e0635 100644 --- a/src/rust/provers/csi.rs +++ b/src/rust/provers/csi.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! CSI (Confluence and Termination Solver) backend //! diff --git a/src/rust/provers/cubical_agda.rs b/src/rust/provers/cubical_agda.rs index 02963f90..750cec1e 100644 --- a/src/rust/provers/cubical_agda.rs +++ b/src/rust/provers/cubical_agda.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Cubical Agda Backend diff --git a/src/rust/provers/cvc5.rs b/src/rust/provers/cvc5.rs index 1d1682bb..35f6c551 100644 --- a/src/rust/provers/cvc5.rs +++ b/src/rust/provers/cvc5.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/provers/dafny.rs b/src/rust/provers/dafny.rs index 3f10468d..395e313b 100644 --- a/src/rust/provers/dafny.rs +++ b/src/rust/provers/dafny.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Dafny auto-active verification backend #![allow(dead_code)] use super::{ProverBackend, ProverConfig, ProverKind}; @@ -20,7 +20,7 @@ impl DafnyBackend { /// Generate a minimal valid Dafny program with assertions for the goal and axioms. fn to_input_format(&self, state: &ProofState) -> Result { - let mut s = String::from("// SPDX-License-Identifier: MPL-2.0\nmethod EchidnaGoal() {\n"); + let mut s = String::from("// SPDX-License-Identifier: AGPL-3.0-or-later\nmethod EchidnaGoal() {\n"); // Add axioms as assume statements for (i, ax) in state.context.axioms.iter().enumerate() { diff --git a/src/rust/provers/dedukti.rs b/src/rust/provers/dedukti.rs index a2d266da..a4d3f77b 100644 --- a/src/rust/provers/dedukti.rs +++ b/src/rust/provers/dedukti.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Dedukti — classical prover backend for the universal λΠ-modulo logical diff --git a/src/rust/provers/dreal.rs b/src/rust/provers/dreal.rs index 37c216f5..03df6cec 100644 --- a/src/rust/provers/dreal.rs +++ b/src/rust/provers/dreal.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/provers/easycrypt.rs b/src/rust/provers/easycrypt.rs index 62f7c67f..bcba49a5 100644 --- a/src/rust/provers/easycrypt.rs +++ b/src/rust/provers/easycrypt.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! EasyCrypt backend — proof assistant for game-based cryptographic //! security proofs. @@ -77,7 +77,7 @@ impl EasyCryptBackend { /// scripts come from `parse_file`). fn to_ec(state: &ProofState) -> String { let mut ec = String::new(); - ec.push_str("(* SPDX-License-Identifier: MPL-2.0 *)\n"); + ec.push_str("(* SPDX-License-Identifier: AGPL-3.0-or-later *)\n"); ec.push_str("require import AllCore.\n\n"); for (i, axiom) in state.context.axioms.iter().enumerate() { ec.push_str(&format!("axiom ax_{} : {}.\n", i, axiom)); diff --git a/src/rust/provers/elk.rs b/src/rust/provers/elk.rs index 7945609d..84ad305f 100644 --- a/src/rust/provers/elk.rs +++ b/src/rust/provers/elk.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! ELK backend — high-performance reasoner for the OWL 2 EL profile. //! diff --git a/src/rust/provers/eprover.rs b/src/rust/provers/eprover.rs index 716198d3..0eb8cc10 100644 --- a/src/rust/provers/eprover.rs +++ b/src/rust/provers/eprover.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! E Prover backend //! diff --git a/src/rust/provers/faial.rs b/src/rust/provers/faial.rs index 3457cf5a..9f47ae9a 100644 --- a/src/rust/provers/faial.rs +++ b/src/rust/provers/faial.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Faial — lightweight GPU data-race detector backend. diff --git a/src/rust/provers/framac.rs b/src/rust/provers/framac.rs index d2bc2319..c8a7a976 100644 --- a/src/rust/provers/framac.rs +++ b/src/rust/provers/framac.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Frama-C WP (Weakest Precondition) Program Verifier Backend diff --git a/src/rust/provers/fstar.rs b/src/rust/provers/fstar.rs index 8a0a54b5..314fd436 100644 --- a/src/rust/provers/fstar.rs +++ b/src/rust/provers/fstar.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! F* (F-star) backend -- dependent types with effects //! diff --git a/src/rust/provers/glpk.rs b/src/rust/provers/glpk.rs index fcfed149..316acc7f 100644 --- a/src/rust/provers/glpk.rs +++ b/src/rust/provers/glpk.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! GLPK linear programming (LP/MIP) backend #![allow(dead_code)] use super::{ProverBackend, ProverConfig, ProverKind}; diff --git a/src/rust/provers/gnatprove.rs b/src/rust/provers/gnatprove.rs index df2470a3..a7ca9438 100644 --- a/src/rust/provers/gnatprove.rs +++ b/src/rust/provers/gnatprove.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! GNATprove (SPARK/Ada) auto-active verification backend. //! //! GNATprove is the SPARK toolset's verifier — it discharges proof @@ -40,11 +40,11 @@ impl GNATproveBackend { /// goal is wired as a procedure post-condition so GNATprove proves it. fn to_input_format(&self, state: &ProofState) -> Result<(String, String)> { let mut spec = String::from( - "-- SPDX-License-Identifier: MPL-2.0\n\ + "-- SPDX-License-Identifier: AGPL-3.0-or-later\n\ package Echidna_Goal with SPARK_Mode => On is\n", ); let mut body = String::from( - "-- SPDX-License-Identifier: MPL-2.0\n\ + "-- SPDX-License-Identifier: AGPL-3.0-or-later\n\ package body Echidna_Goal with SPARK_Mode => On is\n", ); @@ -298,7 +298,7 @@ fn split_ada_source(src: &str) -> (String, String) { } const MIN_GPR: &str = "\ --- SPDX-License-Identifier: MPL-2.0 +-- SPDX-License-Identifier: AGPL-3.0-or-later project Echidna_Goal is for Source_Dirs use (\".\"); for Object_Dir use \"obj\"; diff --git a/src/rust/provers/gpuverify.rs b/src/rust/provers/gpuverify.rs index ab95282b..98e886c3 100644 --- a/src/rust/provers/gpuverify.rs +++ b/src/rust/provers/gpuverify.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! GPUVerify — CUDA/OpenCL kernel verification backend. diff --git a/src/rust/provers/hol4.rs b/src/rust/provers/hol4.rs index 33416b4d..910de79b 100644 --- a/src/rust/provers/hol4.rs +++ b/src/rust/provers/hol4.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/provers/hol_light.rs b/src/rust/provers/hol_light.rs index 2aff72f6..0ef29e68 100644 --- a/src/rust/provers/hol_light.rs +++ b/src/rust/provers/hol_light.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/provers/hp_ecosystem.rs b/src/rust/provers/hp_ecosystem.rs index 9658b88c..9041350d 100644 --- a/src/rust/provers/hp_ecosystem.rs +++ b/src/rust/provers/hp_ecosystem.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Unified HP type-checker ecosystem backend. diff --git a/src/rust/provers/idris2.rs b/src/rust/provers/idris2.rs index 2d6f91be..02461de1 100644 --- a/src/rust/provers/idris2.rs +++ b/src/rust/provers/idris2.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] @@ -844,7 +844,7 @@ impl ProverBackend for Idris2Backend { // Module header output.push_str("-- Generated by ECHIDNA\n"); - output.push_str("-- SPDX-License-Identifier: MPL-2.0\n\n"); + output.push_str("-- SPDX-License-Identifier: AGPL-3.0-or-later\n\n"); output.push_str("module Verify\n\n"); // Default totality diff --git a/src/rust/provers/ileancop.rs b/src/rust/provers/ileancop.rs index 72577098..98e7d358 100644 --- a/src/rust/provers/ileancop.rs +++ b/src/rust/provers/ileancop.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! ileanCoP backend — connection-method prover for intuitionistic //! first-order logic. diff --git a/src/rust/provers/imandra.rs b/src/rust/provers/imandra.rs index a49e108f..d5c5be41 100644 --- a/src/rust/provers/imandra.rs +++ b/src/rust/provers/imandra.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Imandra ML-based reasoning backend for industrial verification #![allow(dead_code)] use super::{ProverBackend, ProverConfig, ProverKind}; diff --git a/src/rust/provers/io.rs b/src/rust/provers/io.rs index 38513b80..7ed40aed 100644 --- a/src/rust/provers/io.rs +++ b/src/rust/provers/io.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Shared IO helpers for prover backends and corpus loaders. diff --git a/src/rust/provers/iprover.rs b/src/rust/provers/iprover.rs index 34fc2ce0..df0c9e72 100644 --- a/src/rust/provers/iprover.rs +++ b/src/rust/provers/iprover.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! iProver ATP backend //! diff --git a/src/rust/provers/isabelle.rs b/src/rust/provers/isabelle.rs index 4e640ac0..8ab5d0c8 100644 --- a/src/rust/provers/isabelle.rs +++ b/src/rust/provers/isabelle.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/provers/isabelle_zf.rs b/src/rust/provers/isabelle_zf.rs index 4781278a..a0ae3ecb 100644 --- a/src/rust/provers/isabelle_zf.rs +++ b/src/rust/provers/isabelle_zf.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Isabelle/ZF — Isabelle with the Zermelo-Fraenkel set theory object diff --git a/src/rust/provers/key.rs b/src/rust/provers/key.rs index 66313266..84378c30 100644 --- a/src/rust/provers/key.rs +++ b/src/rust/provers/key.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! KeY Deductive Java Verification Backend diff --git a/src/rust/provers/keymaerax.rs b/src/rust/provers/keymaerax.rs index 5440fb76..f5da4983 100644 --- a/src/rust/provers/keymaerax.rs +++ b/src/rust/provers/keymaerax.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! KeYmaera X backend — differential dynamic logic for hybrid systems //! diff --git a/src/rust/provers/kissat.rs b/src/rust/provers/kissat.rs index 4f263660..177c2137 100644 --- a/src/rust/provers/kissat.rs +++ b/src/rust/provers/kissat.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Kissat SAT Solver Backend diff --git a/src/rust/provers/konclude.rs b/src/rust/provers/konclude.rs index 2c49e141..2b450ae8 100644 --- a/src/rust/provers/konclude.rs +++ b/src/rust/provers/konclude.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Konclude backend — high-performance reasoner for full OWL 2 DL (SROIQ). //! diff --git a/src/rust/provers/lambda_prolog.rs b/src/rust/provers/lambda_prolog.rs index bb239d8b..2641cf50 100644 --- a/src/rust/provers/lambda_prolog.rs +++ b/src/rust/provers/lambda_prolog.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // //! λProlog — higher-order logic programming with HOAS. Teyjus and Elpi diff --git a/src/rust/provers/lash.rs b/src/rust/provers/lash.rs index 28b4f5fd..5c847693 100644 --- a/src/rust/provers/lash.rs +++ b/src/rust/provers/lash.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Lash higher-order automated theorem prover backend diff --git a/src/rust/provers/lean.rs b/src/rust/provers/lean.rs index c8d8443a..9903bc1e 100644 --- a/src/rust/provers/lean.rs +++ b/src/rust/provers/lean.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/provers/lean3.rs b/src/rust/provers/lean3.rs index 9cba0c9e..6cd0273a 100644 --- a/src/rust/provers/lean3.rs +++ b/src/rust/provers/lean3.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Lean 3 theorem prover backend. diff --git a/src/rust/provers/leo3.rs b/src/rust/provers/leo3.rs index 4ec63d75..f1bf3749 100644 --- a/src/rust/provers/leo3.rs +++ b/src/rust/provers/leo3.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Leo-III higher-order automated theorem prover backend //! diff --git a/src/rust/provers/liquid_haskell.rs b/src/rust/provers/liquid_haskell.rs index 405b8115..bc5abdcb 100644 --- a/src/rust/provers/liquid_haskell.rs +++ b/src/rust/provers/liquid_haskell.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Liquid Haskell refinement-types verification backend. //! //! Liquid Haskell extends GHC with refinement types via the @@ -34,7 +34,7 @@ impl LiquidHaskellBackend { /// Generate a minimal Liquid-Haskell-annotated module for the goal. fn to_input_format(&self, state: &ProofState) -> Result { let mut s = String::from( - "-- SPDX-License-Identifier: MPL-2.0\n\ + "-- SPDX-License-Identifier: AGPL-3.0-or-later\n\ {-# LANGUAGE NoImplicitPrelude #-}\n\ module EchidnaGoal where\n\n\ import Prelude hiding (Bool)\n\ diff --git a/src/rust/provers/matita.rs b/src/rust/provers/matita.rs index 9fac041d..e6f6b315 100644 --- a/src/rust/provers/matita.rs +++ b/src/rust/provers/matita.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // //! Matita — Calculus of Inductive Constructions variant (Bologna). diff --git a/src/rust/provers/mercury.rs b/src/rust/provers/mercury.rs index c5416ed6..f03e2342 100644 --- a/src/rust/provers/mercury.rs +++ b/src/rust/provers/mercury.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // //! Mercury — pure logic programming with polymorphic types and modes. diff --git a/src/rust/provers/metamath.rs b/src/rust/provers/metamath.rs index 3c690ddb..c19af737 100644 --- a/src/rust/provers/metamath.rs +++ b/src/rust/provers/metamath.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/provers/metitarski.rs b/src/rust/provers/metitarski.rs index 3de3d3d6..0942b39a 100644 --- a/src/rust/provers/metitarski.rs +++ b/src/rust/provers/metitarski.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! MetiTarski ATP backend //! diff --git a/src/rust/provers/mettel2.rs b/src/rust/provers/mettel2.rs index 56e3fe67..b5f9da1d 100644 --- a/src/rust/provers/mettel2.rs +++ b/src/rust/provers/mettel2.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! MetTeL2 backend — tableau generator for arbitrary modal logics. //! diff --git a/src/rust/provers/minisat.rs b/src/rust/provers/minisat.rs index 29426bdc..1a7abd34 100644 --- a/src/rust/provers/minisat.rs +++ b/src/rust/provers/minisat.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! MiniSat Classic DPLL SAT Solver Backend diff --git a/src/rust/provers/minizinc.rs b/src/rust/provers/minizinc.rs index 3c056b43..8ae0b3bc 100644 --- a/src/rust/provers/minizinc.rs +++ b/src/rust/provers/minizinc.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! MiniZinc constraint modelling backend #![allow(dead_code)] use super::{ProverBackend, ProverConfig, ProverKind}; diff --git a/src/rust/provers/minlog.rs b/src/rust/provers/minlog.rs index 47321d2b..897d9f6f 100644 --- a/src/rust/provers/minlog.rs +++ b/src/rust/provers/minlog.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Minlog minimal logic backend with program extraction #![allow(dead_code)] use super::{ProverBackend, ProverConfig, ProverKind}; diff --git a/src/rust/provers/mizar.rs b/src/rust/provers/mizar.rs index 856f6e3f..213b0dd9 100644 --- a/src/rust/provers/mizar.rs +++ b/src/rust/provers/mizar.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/provers/mizar_ar.rs b/src/rust/provers/mizar_ar.rs index 66e9f20e..3736ad7a 100644 --- a/src/rust/provers/mizar_ar.rs +++ b/src/rust/provers/mizar_ar.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! MizAR Backend diff --git a/src/rust/provers/mleancop.rs b/src/rust/provers/mleancop.rs index 26e344d5..e2b9278e 100644 --- a/src/rust/provers/mleancop.rs +++ b/src/rust/provers/mleancop.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! MleanCoP backend — connection-method prover for classical //! first-order logic with equality. diff --git a/src/rust/provers/mod.rs b/src/rust/provers/mod.rs index afb57e1c..13592bd5 100644 --- a/src/rust/provers/mod.rs +++ b/src/rust/provers/mod.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/provers/nanocop.rs b/src/rust/provers/nanocop.rs index d60bbdf4..93faac1e 100644 --- a/src/rust/provers/nanocop.rs +++ b/src/rust/provers/nanocop.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! nanoCoP backend — minimal-kernel connection-method prover for //! classical first-order logic. diff --git a/src/rust/provers/naproche.rs b/src/rust/provers/naproche.rs index 21fdc542..108c1090 100644 --- a/src/rust/provers/naproche.rs +++ b/src/rust/provers/naproche.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // //! Naproche — controlled natural-language (ForTheL) proof checker. diff --git a/src/rust/provers/nitpick.rs b/src/rust/provers/nitpick.rs index 736d6b29..68de66ae 100644 --- a/src/rust/provers/nitpick.rs +++ b/src/rust/provers/nitpick.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // //! Nitpick — Isabelle-integrated counter-example finder. diff --git a/src/rust/provers/nunchaku.rs b/src/rust/provers/nunchaku.rs index 019cd752..d2fc6109 100644 --- a/src/rust/provers/nunchaku.rs +++ b/src/rust/provers/nunchaku.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) // //! Nunchaku — model / counter-example finder for higher-order logic. diff --git a/src/rust/provers/nuprl.rs b/src/rust/provers/nuprl.rs index 96a4e173..c3d7e228 100644 --- a/src/rust/provers/nuprl.rs +++ b/src/rust/provers/nuprl.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Nuprl constructive type theory backend #![allow(dead_code)] use super::{ProverBackend, ProverConfig, ProverKind}; diff --git a/src/rust/provers/nusmv.rs b/src/rust/provers/nusmv.rs index 57f4eacb..82ff39b5 100644 --- a/src/rust/provers/nusmv.rs +++ b/src/rust/provers/nusmv.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! NuSMV / nuXmv Symbolic Model Checker Backend diff --git a/src/rust/provers/opensmt.rs b/src/rust/provers/opensmt.rs index d1b44cd0..b944f435 100644 --- a/src/rust/provers/opensmt.rs +++ b/src/rust/provers/opensmt.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! OpenSMT Backend diff --git a/src/rust/provers/ortools.rs b/src/rust/provers/ortools.rs index 365ccc85..bb3f8055 100644 --- a/src/rust/provers/ortools.rs +++ b/src/rust/provers/ortools.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! OR-Tools constraint and optimization solver backend #![allow(dead_code)] use super::{ProverBackend, ProverConfig, ProverKind}; diff --git a/src/rust/provers/outcome.rs b/src/rust/provers/outcome.rs index 11c1bbde..cd1d9969 100644 --- a/src/rust/provers/outcome.rs +++ b/src/rust/provers/outcome.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Prover outcome taxonomy. //! diff --git a/src/rust/provers/princess.rs b/src/rust/provers/princess.rs index ad4e9915..f0a57116 100644 --- a/src/rust/provers/princess.rs +++ b/src/rust/provers/princess.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Princess ATP backend //! diff --git a/src/rust/provers/prism.rs b/src/rust/provers/prism.rs index 5bfa3a9f..98a7bd2c 100644 --- a/src/rust/provers/prism.rs +++ b/src/rust/provers/prism.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! PRISM Probabilistic Model Checker Backend diff --git a/src/rust/provers/prob.rs b/src/rust/provers/prob.rs index 64322036..563946a8 100644 --- a/src/rust/provers/prob.rs +++ b/src/rust/provers/prob.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! ProB backend — animator and constraint-based model checker for B, //! Event-B, Z, TLA+, and Alloy. diff --git a/src/rust/provers/prover9.rs b/src/rust/provers/prover9.rs index 961c5cbb..59d04ad6 100644 --- a/src/rust/provers/prover9.rs +++ b/src/rust/provers/prover9.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Prover9 Backend diff --git a/src/rust/provers/proverif.rs b/src/rust/provers/proverif.rs index 0ca2c9fa..d8e4343a 100644 --- a/src/rust/provers/proverif.rs +++ b/src/rust/provers/proverif.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! ProVerif Security Protocol Verifier Backend diff --git a/src/rust/provers/pvs.rs b/src/rust/provers/pvs.rs index f0aeba81..6a8d8183 100644 --- a/src/rust/provers/pvs.rs +++ b/src/rust/provers/pvs.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/provers/qepcad.rs b/src/rust/provers/qepcad.rs index 0a759d8f..0e922406 100644 --- a/src/rust/provers/qepcad.rs +++ b/src/rust/provers/qepcad.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! QEPCAD-B backend — cylindrical algebraic decomposition over the //! reals. diff --git a/src/rust/provers/redlog.rs b/src/rust/provers/redlog.rs index 15f38908..6bada2b2 100644 --- a/src/rust/provers/redlog.rs +++ b/src/rust/provers/redlog.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Redlog backend — REDUCE-CAS frontend for real algebra //! diff --git a/src/rust/provers/rocq.rs b/src/rust/provers/rocq.rs index 24c053f2..d0c791e8 100644 --- a/src/rust/provers/rocq.rs +++ b/src/rust/provers/rocq.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Rocq Backend diff --git a/src/rust/provers/satallax.rs b/src/rust/provers/satallax.rs index b29387a4..070269a9 100644 --- a/src/rust/provers/satallax.rs +++ b/src/rust/provers/satallax.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Satallax higher-order automated theorem prover backend diff --git a/src/rust/provers/scip.rs b/src/rust/provers/scip.rs index c2507e7d..fc2048fb 100644 --- a/src/rust/provers/scip.rs +++ b/src/rust/provers/scip.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! SCIP mixed-integer nonlinear programming backend #![allow(dead_code)] use super::{ProverBackend, ProverConfig, ProverKind}; diff --git a/src/rust/provers/seahorn.rs b/src/rust/provers/seahorn.rs index 9c993cd0..63516a9c 100644 --- a/src/rust/provers/seahorn.rs +++ b/src/rust/provers/seahorn.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! SeaHorn Verification Framework Backend diff --git a/src/rust/provers/smtrat.rs b/src/rust/provers/smtrat.rs index 1b79556f..841d06c0 100644 --- a/src/rust/provers/smtrat.rs +++ b/src/rust/provers/smtrat.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! SMT-RAT Backend diff --git a/src/rust/provers/spass.rs b/src/rust/provers/spass.rs index 04024def..b2666800 100644 --- a/src/rust/provers/spass.rs +++ b/src/rust/provers/spass.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! SPASS backend //! diff --git a/src/rust/provers/spin_checker.rs b/src/rust/provers/spin_checker.rs index 7636cb7b..d37a0613 100644 --- a/src/rust/provers/spin_checker.rs +++ b/src/rust/provers/spin_checker.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! SPIN Model Checker Backend diff --git a/src/rust/provers/stainless.rs b/src/rust/provers/stainless.rs index 8ef999ae..4f946734 100644 --- a/src/rust/provers/stainless.rs +++ b/src/rust/provers/stainless.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Stainless (Scala / Inox) refinement-types verification backend. //! //! Stainless verifies Scala programs against refinement-type contracts: @@ -35,7 +35,7 @@ impl StainlessBackend { /// Generate a minimal Stainless-annotated Scala program for the goal. fn to_input_format(&self, state: &ProofState) -> Result { let mut s = String::from( - "// SPDX-License-Identifier: MPL-2.0\n\ + "// SPDX-License-Identifier: AGPL-3.0-or-later\n\ import stainless.lang._\n\ import stainless.annotation._\n\n\ object EchidnaGoal {\n", diff --git a/src/rust/provers/storm.rs b/src/rust/provers/storm.rs index a3263849..49a625f5 100644 --- a/src/rust/provers/storm.rs +++ b/src/rust/provers/storm.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! STORM backend — high-performance probabilistic model checker. //! diff --git a/src/rust/provers/tamarin.rs b/src/rust/provers/tamarin.rs index afbcac76..72aa1d87 100644 --- a/src/rust/provers/tamarin.rs +++ b/src/rust/provers/tamarin.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Tamarin Security Protocol Prover Backend diff --git a/src/rust/provers/tlaps.rs b/src/rust/provers/tlaps.rs index e5b0e990..62c7604b 100644 --- a/src/rust/provers/tlaps.rs +++ b/src/rust/provers/tlaps.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! TLAPS (TLA+ Proof System) backend for distributed system verification #![allow(dead_code)] use super::{ProverBackend, ProverConfig, ProverKind}; diff --git a/src/rust/provers/tlc.rs b/src/rust/provers/tlc.rs index b46e4f58..471d4f31 100644 --- a/src/rust/provers/tlc.rs +++ b/src/rust/provers/tlc.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! TLC Model Checker Backend diff --git a/src/rust/provers/tptp_output.rs b/src/rust/provers/tptp_output.rs index 79843cfc..c1fa9c2c 100644 --- a/src/rust/provers/tptp_output.rs +++ b/src/rust/provers/tptp_output.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Shared TPTP output parser for higher-order and first-order ATPs //! diff --git a/src/rust/provers/twee.rs b/src/rust/provers/twee.rs index fd51f2d8..ceb9677f 100644 --- a/src/rust/provers/twee.rs +++ b/src/rust/provers/twee.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Twee equational theorem prover backend //! diff --git a/src/rust/provers/twelf.rs b/src/rust/provers/twelf.rs index e1ee4186..49f1e2bf 100644 --- a/src/rust/provers/twelf.rs +++ b/src/rust/provers/twelf.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Twelf logical framework (LF) backend for metatheory verification #![allow(dead_code)] use super::{ProverBackend, ProverConfig, ProverKind}; diff --git a/src/rust/provers/typed_wasm.rs b/src/rust/provers/typed_wasm.rs index 9908fd3e..347e6712 100644 --- a/src/rust/provers/typed_wasm.rs +++ b/src/rust/provers/typed_wasm.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) #![allow(dead_code)] diff --git a/src/rust/provers/uppaal.rs b/src/rust/provers/uppaal.rs index 1e7c9823..762179b7 100644 --- a/src/rust/provers/uppaal.rs +++ b/src/rust/provers/uppaal.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! UPPAAL Timed Automata Model Checker Backend diff --git a/src/rust/provers/uppaal_stratego.rs b/src/rust/provers/uppaal_stratego.rs index 331b0602..9f5a2037 100644 --- a/src/rust/provers/uppaal_stratego.rs +++ b/src/rust/provers/uppaal_stratego.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! UPPAAL Stratego Backend diff --git a/src/rust/provers/vampire.rs b/src/rust/provers/vampire.rs index a424ff79..ac008117 100644 --- a/src/rust/provers/vampire.rs +++ b/src/rust/provers/vampire.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Vampire ATP backend //! diff --git a/src/rust/provers/viper.rs b/src/rust/provers/viper.rs index dcc14180..856b4976 100644 --- a/src/rust/provers/viper.rs +++ b/src/rust/provers/viper.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Viper verification infrastructure backend //! diff --git a/src/rust/provers/why3.rs b/src/rust/provers/why3.rs index 4e9b3a3f..96b9cd8b 100644 --- a/src/rust/provers/why3.rs +++ b/src/rust/provers/why3.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Why3 multi-prover orchestration backend #![allow(dead_code)] use super::{ProverBackend, ProverConfig, ProverKind}; diff --git a/src/rust/provers/z3.rs b/src/rust/provers/z3.rs index fae23f3f..32e36a1b 100644 --- a/src/rust/provers/z3.rs +++ b/src/rust/provers/z3.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(dead_code)] diff --git a/src/rust/provers/zipperposition.rs b/src/rust/provers/zipperposition.rs index 3de342a8..6e352478 100644 --- a/src/rust/provers/zipperposition.rs +++ b/src/rust/provers/zipperposition.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) //! Zipperposition Backend diff --git a/src/rust/repl/diagnostics.rs b/src/rust/repl/diagnostics.rs index 1d881eab..6cf8248d 100644 --- a/src/rust/repl/diagnostics.rs +++ b/src/rust/repl/diagnostics.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Interactive diagnostics REPL for echidna use std::io::{self, Write}; diff --git a/src/rust/repl/mod.rs b/src/rust/repl/mod.rs index b8cc3e54..65960eeb 100644 --- a/src/rust/repl/mod.rs +++ b/src/rust/repl/mod.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // Interactive REPL for echidna pub mod diagnostics; diff --git a/src/rust/repl/proof.rs b/src/rust/repl/proof.rs index 7b1f1b29..3cc4d4f9 100644 --- a/src/rust/repl/proof.rs +++ b/src/rust/repl/proof.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Interactive REPL for theorem proving //! diff --git a/src/rust/server.rs b/src/rust/server.rs index b982084b..7580679b 100644 --- a/src/rust/server.rs +++ b/src/rust/server.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! HTTP API server for ECHIDNA //! diff --git a/src/rust/suggest/extractor.rs b/src/rust/suggest/extractor.rs index 95fcd7a1..386bd611 100644 --- a/src/rust/suggest/extractor.rs +++ b/src/rust/suggest/extractor.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Per-prover lemma extractor. //! diff --git a/src/rust/suggest/mod.rs b/src/rust/suggest/mod.rs index 936fd903..90e25046 100644 --- a/src/rust/suggest/mod.rs +++ b/src/rust/suggest/mod.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! `echidna suggest` — mechanical tactic-variant finder. //! diff --git a/src/rust/suggest/report.rs b/src/rust/suggest/report.rs index 649ee642..93b0f6f6 100644 --- a/src/rust/suggest/report.rs +++ b/src/rust/suggest/report.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Result formatter for `echidna suggest`. //! diff --git a/src/rust/suggest/synonyms.rs b/src/rust/suggest/synonyms.rs index 07817cdd..5f8557bc 100644 --- a/src/rust/suggest/synonyms.rs +++ b/src/rust/suggest/synonyms.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Synonym table loader — reads `data/synonyms/.toml` and indexes //! it for fast lookup of alternatives given any name in the table. diff --git a/src/rust/suggest/tester.rs b/src/rust/suggest/tester.rs index 670e9e91..b39118c2 100644 --- a/src/rust/suggest/tester.rs +++ b/src/rust/suggest/tester.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Variant testing harness. //! diff --git a/src/rust/suggest/variant.rs b/src/rust/suggest/variant.rs index 98197b10..838a349e 100644 --- a/src/rust/suggest/variant.rs +++ b/src/rust/suggest/variant.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 ECHIDNA Project Team -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Substitution generator. //! diff --git a/src/rust/vcl_ut.rs b/src/rust/vcl_ut.rs index 30d15eff..3a0f101f 100644 --- a/src/rust/vcl_ut.rs +++ b/src/rust/vcl_ut.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! VCL-UT: Cross-Prover Query Language for ECHIDNA //! diff --git a/src/rust/verification/axiom_tracker.rs b/src/rust/verification/axiom_tracker.rs index 5807d877..60272ea7 100644 --- a/src/rust/verification/axiom_tracker.rs +++ b/src/rust/verification/axiom_tracker.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Axiom usage tracking and enforcement //! diff --git a/src/rust/verification/bayesian_arbiter.rs b/src/rust/verification/bayesian_arbiter.rs index 452a469f..36717f7a 100644 --- a/src/rust/verification/bayesian_arbiter.rs +++ b/src/rust/verification/bayesian_arbiter.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell //! Bayesian arbiter for prover-evidence fusion. diff --git a/src/rust/verification/certificates.rs b/src/rust/verification/certificates.rs index 5cfa47c4..43500c83 100644 --- a/src/rust/verification/certificates.rs +++ b/src/rust/verification/certificates.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Proof certificate checking //! diff --git a/src/rust/verification/confidence.rs b/src/rust/verification/confidence.rs index 60c3d80f..22106e88 100644 --- a/src/rust/verification/confidence.rs +++ b/src/rust/verification/confidence.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! 5-Level Trust Hierarchy for proof confidence scoring //! diff --git a/src/rust/verification/dempster_shafer.rs b/src/rust/verification/dempster_shafer.rs index 1f6683c0..f55952cf 100644 --- a/src/rust/verification/dempster_shafer.rs +++ b/src/rust/verification/dempster_shafer.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell //! Dempster-Shafer evidence combination for prover arbitration. diff --git a/src/rust/verification/mod.rs b/src/rust/verification/mod.rs index b9ac1420..01d50eac 100644 --- a/src/rust/verification/mod.rs +++ b/src/rust/verification/mod.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell //! Verification subsystem for ECHIDNA diff --git a/src/rust/verification/mutation.rs b/src/rust/verification/mutation.rs index 33d4d8d4..fc627acf 100644 --- a/src/rust/verification/mutation.rs +++ b/src/rust/verification/mutation.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Mutation testing for specifications //! diff --git a/src/rust/verification/pareto.rs b/src/rust/verification/pareto.rs index 7367b118..4686efab 100644 --- a/src/rust/verification/pareto.rs +++ b/src/rust/verification/pareto.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Pareto optimality for proof search //! diff --git a/src/rust/verification/pareto_arbiter.rs b/src/rust/verification/pareto_arbiter.rs index 7f1ac80a..f79fc27c 100644 --- a/src/rust/verification/pareto_arbiter.rs +++ b/src/rust/verification/pareto_arbiter.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell //! Pareto-frontier arbiter for proof outcomes. diff --git a/src/rust/verification/portfolio.rs b/src/rust/verification/portfolio.rs index a25a1b50..e2074ff0 100644 --- a/src/rust/verification/portfolio.rs +++ b/src/rust/verification/portfolio.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! SMT Solver Cross-Checking (Portfolio Solving) //! diff --git a/src/rust/verification/proof.rs b/src/rust/verification/proof.rs index bc901918..215ed0fd 100644 --- a/src/rust/verification/proof.rs +++ b/src/rust/verification/proof.rs @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later #![allow(clippy::doc_overindented_list_items)] diff --git a/src/rust/verification/result_arbiter.rs b/src/rust/verification/result_arbiter.rs index 6a442418..cfa5fbcb 100644 --- a/src/rust/verification/result_arbiter.rs +++ b/src/rust/verification/result_arbiter.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell //! Unified result arbitration — the single entry point that turns a set diff --git a/src/rust/verification/statistics.rs b/src/rust/verification/statistics.rs index 3cc418dc..8ed59610 100644 --- a/src/rust/verification/statistics.rs +++ b/src/rust/verification/statistics.rs @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! Statistical Confidence Tracking for Proof Search //! diff --git a/src/rust/verisim_bridge.rs b/src/rust/verisim_bridge.rs index e200ebcb..d2f98433 100644 --- a/src/rust/verisim_bridge.rs +++ b/src/rust/verisim_bridge.rs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) // SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell -// SPDX-License-Identifier: MPL-2.0 +// SPDX-License-Identifier: AGPL-3.0-or-later //! VeriSimDB Bridge — Maps ECHIDNA proof state to VeriSimDB's 8-modality octad. //! diff --git a/src/ui/public/prove.html b/src/ui/public/prove.html index 2c2a11d4..9b1e894e 100644 --- a/src/ui/public/prove.html +++ b/src/ui/public/prove.html @@ -1,6 +1,6 @@ -> **Licence notice.** This repository declares AGPL-3.0-or-later in `LICENSE` -> and `Cargo.toml`, but per-file `SPDX-License-Identifier` headers across the -> source tree still read `MPL-2.0`, and `NOTICE` still describes the project as -> MPL-2.0. That inconsistency is unresolved — see -> [`docs/DEBT.md`](docs/DEBT.md) (P0). If your use depends on the licence -> terms, read `LICENSE` and ask the maintainer before relying on any other -> surface. +> **Licensing.** ECHIDNA is licensed in three parts: **code** under +> AGPL-3.0-or-later, **documentation** under CC-BY-SA-4.0, and +> **`echidna-playground/`** under MPL-2.0 (Coq-Jr contributions, retained +> deliberately — MPL §3.3 makes it compatible under the AGPL umbrella). +> The combined work distributes as AGPL-3.0-or-later; run a modified ECHIDNA +> as a network service and you must offer your users the modified source. +> See [`NOTICE`](NOTICE) for the full statement and the compatibility +> argument. \*E\*xtensible \*C\*ognitive \*H\*ybrid \*I\*ntelligence for \*D\*eductive \*N\*eural \*A\*ssistance diff --git a/docs/DEBT.md b/docs/DEBT.md index 116f05e6..90502477 100644 --- a/docs/DEBT.md +++ b/docs/DEBT.md @@ -22,73 +22,68 @@ latent risk. --- -## P0 — Licensing: the repository states four different licences +## P0 — Licensing: RESOLVED 2026-08-07 -**This is the most serious item in the register.** A recipient cannot determine -the terms under which they receive this software, and every surface they might -reasonably consult gives a different answer. +**Was:** the repository stated four different licences at once — `LICENSE` and +`Cargo.toml` said AGPL-3.0-or-later while 590 source files granted MPL-2.0, +`NOTICE` described the project as MPL-2.0 while citing the AGPL file as its +text, and `.reuse/dep5` claimed `PMPL-1.0 AND Palimpsest-0.6`. Because +per-file SPDX headers are themselves a licence grant, a recipient could have +taken the tree under MPL-2.0 — which, unlike AGPL, has no network clause. -| Surface | What it states | Evidence | +**Now:** reconciled to the owner's AGPL ruling as a deliberate three-part +split. + +| Part | Licence | Files | |---|---|---| -| `LICENSE` (full GNU text) | AGPL-3.0-or-later | `head -3 LICENSE` | -| `Cargo.toml` | AGPL-3.0-or-later | `grep '^license' Cargo.toml` | -| README badge | AGPL-3.0-or-later | `grep -m1 'License:' README.md` | -| Per-file SPDX headers — **590 source files** (584 `MPL-2.0`, 6 dual with `Palimpsest-0.6`) | MPL-2.0 | `L1` below | -| Per-file SPDX headers | AGPL-3.0-or-later — **zero files** | `L2` below | -| `NOTICE` | MPL-2.0, and points at `LICENSE` for the "full text" — but `LICENSE` is AGPL | `head -10 NOTICE` | -| `.reuse/dep5` (`src/*`) | `PMPL-1.0 AND Palimpsest-0.6` | `grep -m1 -A3 'Files: src' .reuse/dep5` | -| `.github/workflows/governance.yml` | `PMPL-1.0-or-later` | `head -1 .github/workflows/governance.yml` | -| GitHub's own detection | "Other" — no licence identified | `gh repo view --json licenseInfo` | +| Code — `src/`, `crates/`, `ffi/`, `proofs/`, `spark/`, `verification/`, build system, CI, machine-readable metadata | **AGPL-3.0-or-later** | 594 + 6 dual | +| Documentation — `docs/`, top-level `.md` / `.adoc` | **CC-BY-SA-4.0** | 92 + 1 dual | +| `echidna-playground/` — Coq-Jr sub-project | **MPL-2.0**, unchanged | 35 | + +The playground was **not** relicensed: it carries contributions attributed to +"Coq-Jr Contributors", and relicensing another party's work needs their +consent. It does not need relicensing — MPL-2.0 §3.3 designates the GNU +licences (including AGPL-3.0+) as Secondary Licenses, so MPL files combine +into an AGPL work and the combined work distributes under AGPL while those +files individually remain available under MPL. No file carries the Exhibit B +"Incompatible With Secondary Licenses" notice that would break this. + +`NOTICE` and `.reuse/dep5` were rewritten to describe the split; `LICENSE` +had two prepended SPDX lines removed so it is byte-identical to +`LICENSES/AGPL-3.0-or-later.txt` — those lines were stopping GitHub's licence +detector matching the body, which is why the repository showed "Other". + +**Verification — these should come back clean:** ```bash -# L1 — source files declaring MPL-2.0 (590: 584 plain + 6 dual) +# no MPL outside the playground and licence reference material +git grep -l 'SPDX-License-Identifier:.*MPL-2\.0' \ + | grep -vE '^(echidna-playground/|LICENSES/|docs/legal/)' # expect empty + +# code is AGPL git grep -I -h -m1 -oP 'SPDX-License-Identifier:\s*\K[A-Za-z0-9.\-+]+( (AND|OR) [A-Za-z0-9.\-+]+)*' \ - -- '*.rs' '*.jl' '*.zig' '*.chpl' '*.idr' '*.agda' '*.res' '*.sh' '*.ncl' | sort | uniq -c + -- '*.rs' '*.jl' '*.zig' ':!echidna-playground/' | sort | uniq -c -# L2 — source files declaring AGPL (0) -git grep -l 'SPDX-License-Identifier:.*AGPL' -- '*.rs' '*.jl' '*.zig' | wc -l +# GitHub now detects a licence +gh repo view hyperpolymath/echidna --json licenseInfo ``` -The difference is not cosmetic. MPL-2.0 is file-level weak copyleft with no -network clause; AGPL-3.0-or-later is strong copyleft that reaches users served -over a network. A downstream integrator reading the file headers would conclude -they may offer a modified ECHIDNA as a hosted service without publishing their -changes. The `LICENSE` file says otherwise. **Because the per-file headers are -themselves a licence grant, this exposure is real, not theoretical.** - -Two further consequences: - -- **REUSE non-compliance.** `.reuse/dep5` and nine file headers reference - `PMPL-1.0` and `Palimpsest-0.6`, but `LICENSES/` contains only - `AGPL-3.0-or-later.txt`, `CC-BY-SA-4.0.txt`, and `MPL-2.0.txt`. A REUSE - conformance run cannot resolve those identifiers. - Evidence: `ls LICENSES/` and `git grep -l Palimpsest`. -- **GitHub reports the licence as "Other"**, so the repository shows no licence - in search, the sidebar, or the API. The likely cause is the - `SPDX-License-Identifier:` line prepended to `LICENSE` above the GNU text, - which stops GitHub's detector matching the body. Removing that one line is a - low-risk experiment that does not alter the grant. - -**Owner decision required — do not "fix" this in a routine PR.** The recorded -decision (`CLAUDE.md`, matching `Cargo.toml`) is AGPL-3.0-or-later. Applying it -means rewriting the SPDX header of every source file, which is a re-licensing -act with consequences for existing recipients and any contributor who submitted -under MPL terms. Nobody should do that on their own initiative. - -Suggested sequence, once the owner has ruled: - -1. Confirm the intended licence for **code** and for the **documentation - surface** separately — `CLAUDE.md` states the MPL headers on docs are - deliberate, so the two may legitimately differ. -2. Reconcile `NOTICE` first: it is the only surface that is internally - self-contradictory (it names MPL and cites an AGPL file as its text). -3. Add the missing `LICENSES/` texts, or remove the `PMPL-1.0` / - `Palimpsest-0.6` references if those licences are retired. -4. Only then sweep the per-file headers, in one reviewable commit per language. - A previous blind SPDX sweep in this estate mis-licensed files by imposing a - header where a different one already existed further down the file — grep the - whole file, move the identifier, never impose one. -5. Drop the prepended SPDX line from `LICENSE` and confirm GitHub detects it. +### Residual — `Palimpsest-0.6` has no licence text + +Seven files offer `Palimpsest-0.6` as an alternative or additional grant +(`AGPL-3.0-or-later OR Palimpsest-0.6`, and two with `AND`). **No +`Palimpsest-0.6` text exists in this repository or anywhere in the estate** +(`find . -iname '*palimpsest*'` and `ls ../standards/LICENSES/` both come back +without it), so the identifier is unresolvable and REUSE cannot validate it. + +The grants were **preserved rather than dropped** — removing half of a dual +licence withdraws a permission the owner granted, which is not a +documentation decision. Resolve by supplying `LICENSES/Palimpsest-0.6.txt`, +or by deciding the Palimpsest grant is retired and removing it deliberately. + +Note `docs/legal/texts/PMPL-1.0-or-later.txt` exists and the estate's +`standards/LICENSES/` carries `PMPL-1.0-or-later.txt` — PMPL and Palimpsest +are different identifiers, and only the former has a text. --- diff --git a/docs/wiki/FAQ.md b/docs/wiki/FAQ.md index 54955282..f85a17db 100644 --- a/docs/wiki/FAQ.md +++ b/docs/wiki/FAQ.md @@ -47,26 +47,32 @@ Canonical sources of truth: ## What licence is ECHIDNA under? -**The repository is currently inconsistent on this point, and you should not -rely on this page.** Read -[`LICENSE`](https://github.com/hyperpolymath/echidna/blob/main/LICENSE) and, if -your use depends on the answer, ask the maintainer before proceeding. +Three, applying to three parts of the tree. This is deliberate, not drift. -What the tree actually says today: - -| Surface | States | +| Part | Licence | |---|---| -| `LICENSE`, `Cargo.toml`, README badge | AGPL-3.0-or-later | -| Per-file `SPDX-License-Identifier` headers (588 source files) | MPL-2.0 | -| `NOTICE` | MPL-2.0 ("Full text: LICENSE" — which is AGPL) | -| `.reuse/dep5` | PMPL-1.0 AND Palimpsest-0.6 | - -The owner's recorded decision is AGPL-3.0-or-later; the per-file headers and -`NOTICE` predate it and have not been migrated. Reconciling them is tracked as -P0 licensing debt in -[`docs/DEBT.md`](https://github.com/hyperpolymath/echidna/blob/main/docs/DEBT.md). -The historical migration path was dual MIT/Palimpsest-0.6 → MPL-2.0 → (decided) -AGPL-3.0-or-later. +| Code — `src/`, `crates/`, `ffi/`, `proofs/`, `spark/`, `verification/`, build system, CI | **AGPL-3.0-or-later** | +| Documentation — `docs/`, top-level `.md` / `.adoc` | **CC-BY-SA-4.0** | +| `echidna-playground/` — the Coq-Jr sub-project | **MPL-2.0** | + +**The combined work distributes as AGPL-3.0-or-later.** The network clause +applies: if you run a modified ECHIDNA as a service, you must offer your users +the modified source. + +**Why an MPL component is fine inside an AGPL project.** MPL-2.0 §3.3 +designates the GNU licences — including AGPL-3.0+ — as "Secondary Licenses". +MPL-covered files may therefore be combined into an AGPL work and distributed +under the AGPL, while remaining individually available under MPL. So if you +extract `echidna-playground/` on its own, you may use it under MPL-2.0. The +playground keeps MPL because it carries contributions from Coq-Jr +Contributors, and relicensing someone else's contribution needs their consent. + +Licence history: dual MIT/Palimpsest-0.6 → MPL-2.0 → AGPL-3.0-or-later, with +the per-file headers reconciled to the AGPL ruling in 2026-08. Anything +describing the project as MPL-2.0 predates that; +[`LICENSE`](https://github.com/hyperpolymath/echidna/blob/main/LICENSE) and +[`NOTICE`](https://github.com/hyperpolymath/echidna/blob/main/NOTICE) are +authoritative. ## How do I report a security issue? diff --git a/docs/wiki/Home.md b/docs/wiki/Home.md index 20bddb74..b1396b42 100644 --- a/docs/wiki/Home.md +++ b/docs/wiki/Home.md @@ -4,7 +4,7 @@ **ECHIDNA** — Extensible Cognitive Hybrid Intelligence for Deductive Neural Assistance — is a trust-hardened neurosymbolic theorem-proving platform with a large multi-backend prover surface, of which **12 core backends** are exposed by the default API. Counts differ depending on what is being counted; [`docs/PROVER_COUNT.md`](https://github.com/hyperpolymath/echidna/blob/main/docs/PROVER_COUNT.md) is canonical and carries the commands that reproduce each figure. -**License**: the repository declares **AGPL-3.0-or-later** ([`LICENSE`](https://github.com/hyperpolymath/echidna/blob/main/LICENSE), `Cargo.toml`). Note that per-file `SPDX-License-Identifier` headers across the source tree still read `MPL-2.0`, and `NOTICE` still describes the project as MPL-2.0 — this inconsistency is **open licensing debt**, tracked in [`docs/DEBT.md`](https://github.com/hyperpolymath/echidna/blob/main/docs/DEBT.md). Until it is reconciled by the owner, do not rely on this page for the licence terms; read `LICENSE` and seek clarification. +**License**: three parts, by design — **code** under AGPL-3.0-or-later, **documentation** under CC-BY-SA-4.0, and **`echidna-playground/`** under MPL-2.0 (Coq-Jr contributions, deliberately not relicensed). The combined work distributes as AGPL-3.0-or-later, so running a modified ECHIDNA as a network service obliges you to offer users the modified source. The MPL component is compatible under MPL §3.3 (Secondary Licenses). Full statement: [`NOTICE`](https://github.com/hyperpolymath/echidna/blob/main/NOTICE). **Release history**: [`CHANGELOG.md`](https://github.com/hyperpolymath/echidna/blob/main/CHANGELOG.md); semver pin in [`Cargo.toml`](https://github.com/hyperpolymath/echidna/blob/main/Cargo.toml). From 2921c2266281127f4cd570f651e6941ea8c6d66c Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Fri, 7 Aug 2026 14:20:40 +0100 Subject: [PATCH 3/5] chore(licence): remove Palimpsest-0.6 grants; fix drift a header sweep cannot see MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner ruling: Palimpsest is not a licence grant in this repository. CONTRIBUTING.adoc already said so — the Palimpsest licence proper is the legal licence only on palimpsest-license, palimpsest-plasma and (prospectively) consent-aware-http, and in ECHIDNA it is an ETHICAL FRAMEWORK reference, orthogonal to the SPDX choice. Version 0.6 is also superseded by the hyperpolymath/palimpsest-license repository. The dual SPDX identifiers were therefore drift, not a deliberate grant. Removed from all 29 files. The framework reference is preserved and CONTRIBUTING.adoc + NOTICE now state explicitly that it is not a grant, so it cannot drift back silently. Deliberately untouched: training_data/proof_states_v2.jsonl (SPDX strings there are scraped CORPUS CONTENT — proof goals harvested from files; editing them would corrupt the training data) and docs/legal/ (licence reference texts). Removing the Palimpsest half exposed three further classes that the SPDX-header sweep could not have caught, all now fixed: 1. STALE MIT. src/rescript/{.gitignore,styles/main.css,tailwind.config.js} declared 'MIT OR Palimpsest-0.6', predating even the MPL migration. Dropping only the Palimpsest half would have left them MIT. 2. MACHINE-READABLE LICENCE FIELDS — what packaging and tooling actually read, and carrying no SPDX line to match. Ten declared MPL-2.0: docs-site/.well-known/aibdp.json (served on the site), stapeln.toml, container/manifest.toml, three Ada alire.toml manifests, two Idris2 .ipkg manifests, descriptiles/META.a2ml, 0-AI-MANIFEST.a2ml — plus a NESTED src/rescript/.reuse/dep5 declaring MIT OR Palimpsest-0.6 for the UI sub-tree. 3. OCI IMAGE LABELS — 16 LABEL org.opencontainers.image.licenses=MPL-2.0 across Containerfile, container/Containerfile and .containerization/ (11 in Containerfile.wave3, one per per-prover stage). These are baked into every image published to ghcr.io and read by registries, SBOM generators and supply-chain scanners, so the wrong value propagated downstream of the repository entirely. Also: src/rescript/src/Main.res RENDERED 'MIT OR Palimpsest-0.6 License' in the UI — a false licence statement shown to users. docs/DEBT.md records all of it with a detector that greps by licence VALUE rather than by file type, which is what caught the last three classes. Verified: exhaustive sweep for MPL/MIT/Palimpsest as a licence value returns nothing outside echidna-playground/; SPDX still line 1 on all 30 workflows. Co-Authored-By: Claude Opus 5 --- .containerization/Containerfile | 2 +- .containerization/Containerfile.full | 2 +- .containerization/Containerfile.mcp | 2 +- .containerization/Containerfile.wave3 | 18 ++--- .githooks/pre-commit | 2 +- .machine_readable/anchors/ANCHOR.a2ml | 2 +- .machine_readable/descriptiles/META.a2ml | 2 +- .../svc/k9/examples/project-metadata.k9.ncl | 2 +- .trivyignore | 2 +- .well-known/humans.txt | 2 +- 0-AI-MANIFEST.a2ml | 2 +- CONTRIBUTING.adoc | 58 +++++++++----- Containerfile | 2 +- .../.machine_readable/6a2/META.a2ml | 2 +- NOTICE | 19 +++-- container/Containerfile | 2 +- container/manifest.toml | 2 +- docs-site/.well-known/aibdp.json | 2 +- docs/DEBT.md | 79 +++++++++++++++---- docs/governance/JUST_AND_MUST_FRAMEWORK.md | 6 +- examples/simple_proof.v | 2 +- proofs/acl2/associativity.lisp | 2 +- proofs/acl2/binary_trees.lisp | 2 +- proofs/acl2/factorial.lisp | 2 +- proofs/acl2/list_append.lisp | 2 +- proofs/acl2/sorting.lisp | 2 +- proofs/agda/Basic.agda | 2 +- proofs/hol4/arithmetic.sml | 2 +- proofs/hol4/binary_tree.sml | 2 +- proofs/hol4/list_append.sml | 2 +- proofs/hol4/set_theory.sml | 2 +- proofs/hol4/sorting.sml | 2 +- proofs/pvs/arithmetic.pvs | 2 +- proofs/pvs/binary_search.pvs | 2 +- proofs/pvs/list_theory.pvs | 2 +- proofs/pvs/set_theory.pvs | 2 +- proofs/pvs/sorting.pvs | 2 +- rules/security_learning.lgt | 2 +- scripts/build-production.sh | 2 +- scripts/demo-proof.sh | 2 +- scripts/expand_training_data.sh | 2 +- scripts/test-integration.sh | 2 +- spark/axiom_tracker/alire.toml | 2 +- spark/certificates/alire.toml | 2 +- spark/solver_integrity/alire.toml | 2 +- src/abi/echidnaabi.ipkg | 2 +- src/idris/echidna-validator.ipkg | 2 +- src/julia/test_server.jl | 2 +- src/rescript/.gitignore | 2 +- src/rescript/.reuse/dep5 | 17 ++-- src/rescript/src/Main.res | 2 +- src/rescript/styles/main.css | 2 +- src/rescript/tailwind.config.js | 2 +- src/zig/ffi/echidna_ffi.h | 2 +- stapeln.toml | 2 +- 55 files changed, 188 insertions(+), 107 deletions(-) diff --git a/.containerization/Containerfile b/.containerization/Containerfile index af3a9f9a..a0884b7f 100644 --- a/.containerization/Containerfile +++ b/.containerization/Containerfile @@ -92,7 +92,7 @@ FROM docker.io/library/debian:bookworm-slim LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA - Extensible Cognitive Hybrid Intelligence for Deductive Neural Assistance" -LABEL org.opencontainers.image.licenses="MPL-2.0" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" LABEL org.opencontainers.image.version="1.5.0" LABEL org.opencontainers.image.vendor="hyperpolymath" diff --git a/.containerization/Containerfile.full b/.containerization/Containerfile.full index 139fc4f5..529f3519 100644 --- a/.containerization/Containerfile.full +++ b/.containerization/Containerfile.full @@ -187,7 +187,7 @@ FROM docker.io/library/debian:bookworm-slim LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA Full - Curated prover set + VeriSimDB + Guix" -LABEL org.opencontainers.image.licenses="MPL-2.0" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" LABEL org.opencontainers.image.version="1.5.0" LABEL org.opencontainers.image.vendor="hyperpolymath" diff --git a/.containerization/Containerfile.mcp b/.containerization/Containerfile.mcp index a0d3fabd..b9a4c1b5 100644 --- a/.containerization/Containerfile.mcp +++ b/.containerization/Containerfile.mcp @@ -114,7 +114,7 @@ FROM docker.io/library/debian:bookworm-slim LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA MCP server — AI-agent-callable theorem proving over stdio" -LABEL org.opencontainers.image.licenses="MPL-2.0" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" LABEL org.opencontainers.image.version="2.1.0" # Runtime deps: the MVP provers + dynamic libs + perl/fontconfig for Isabelle. diff --git a/.containerization/Containerfile.wave3 b/.containerization/Containerfile.wave3 index f736c0b0..452cff16 100644 --- a/.containerization/Containerfile.wave3 +++ b/.containerization/Containerfile.wave3 @@ -139,7 +139,7 @@ FROM docker.io/library/debian:bookworm-slim AS tamarin LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + Tamarin Prover - security protocol analysis" -LABEL org.opencontainers.image.licenses="MPL-2.0" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -252,7 +252,7 @@ FROM docker.io/library/debian:bookworm-slim AS proverif LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + ProVerif - cryptographic protocol verification" -LABEL org.opencontainers.image.licenses="MPL-2.0" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -340,7 +340,7 @@ FROM docker.io/library/debian:bookworm-slim AS scip LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + SCIP - constraint integer programming solver" -LABEL org.opencontainers.image.licenses="MPL-2.0" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -435,7 +435,7 @@ FROM docker.io/library/debian:bookworm-slim AS or-tools LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + OR-Tools C++ library - combinatorial optimisation via FFI" -LABEL org.opencontainers.image.licenses="MPL-2.0" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -559,7 +559,7 @@ FROM docker.io/library/debian:bookworm-slim AS hol4 LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + HOL4 - higher-order logic theorem prover" -LABEL org.opencontainers.image.licenses="MPL-2.0" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -645,7 +645,7 @@ FROM docker.io/library/debian:bookworm-slim AS acl2 LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + ACL2 - applicative Common Lisp logic prover" -LABEL org.opencontainers.image.licenses="MPL-2.0" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -733,7 +733,7 @@ FROM docker.io/library/debian:bookworm-slim AS twelf LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + Twelf - LF meta-logical framework" -LABEL org.opencontainers.image.licenses="MPL-2.0" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -858,7 +858,7 @@ FROM docker.io/library/debian:bookworm-slim AS metamath LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + Metamath - metamath-exe CLI verifier with bundled databases" -LABEL org.opencontainers.image.licenses="MPL-2.0" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -948,7 +948,7 @@ FROM docker.io/library/debian:bookworm-slim AS imandra LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + Imandra stub (proprietary licence required for real binary)" -LABEL org.opencontainers.image.licenses="MPL-2.0" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" diff --git a/.githooks/pre-commit b/.githooks/pre-commit index c38d1228..518b9033 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -3,7 +3,7 @@ # ECHIDNA Pre-commit Hook # Enforces npm ban and runs checks # -# SPDX-License-Identifier: AGPL-3.0-or-later OR AGPL-3.0-or-later +# SPDX-License-Identifier: AGPL-3.0-or-later set -euo pipefail diff --git a/.machine_readable/anchors/ANCHOR.a2ml b/.machine_readable/anchors/ANCHOR.a2ml index a1c29054..f7c0e620 100644 --- a/.machine_readable/anchors/ANCHOR.a2ml +++ b/.machine_readable/anchors/ANCHOR.a2ml @@ -5,7 +5,7 @@ canonical-repo = "https://github.com/hyperpolymath/echidna" canonical-owner = "hyperpolymath" canonical-author = "Jonathan D.A. Jewell " -canonical-license = "MPL-2.0" +canonical-license = "AGPL-3.0-or-later" mirrors = [ "https://gitlab.com/hyperpolymath/echidna", ] diff --git a/.machine_readable/descriptiles/META.a2ml b/.machine_readable/descriptiles/META.a2ml index 2e4c2fed..392ae55d 100644 --- a/.machine_readable/descriptiles/META.a2ml +++ b/.machine_readable/descriptiles/META.a2ml @@ -6,7 +6,7 @@ project = "echidna" full-name = "Extensible Cognitive Hybrid Intelligence for Deductive Neural Assistance" author = "Jonathan D.A. Jewell " -license = "MPL-2.0" +license = "AGPL-3.0-or-later" standard = "RSR 2026" version = "2.2.0" last-updated = "2026-04-28" diff --git a/.machine_readable/svc/k9/examples/project-metadata.k9.ncl b/.machine_readable/svc/k9/examples/project-metadata.k9.ncl index 32bf5db7..a2627490 100644 --- a/.machine_readable/svc/k9/examples/project-metadata.k9.ncl +++ b/.machine_readable/svc/k9/examples/project-metadata.k9.ncl @@ -40,7 +40,7 @@ K9! organization = "The Open University", }, - license = "MPL-2.0", + license = "AGPL-3.0-or-later", keywords = [ "rhodium-standard", diff --git a/.trivyignore b/.trivyignore index e76e857d..bd699e81 100644 --- a/.trivyignore +++ b/.trivyignore @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later AND Palimpsest-0.6 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2024-2025 ECHIDNA Project Contributors # # Trivy ignore file for ECHIDNA diff --git a/.well-known/humans.txt b/.well-known/humans.txt index 0c8e87a4..f308e3e3 100644 --- a/.well-known/humans.txt +++ b/.well-known/humans.txt @@ -17,6 +17,6 @@ All theorem prover backend authors /* SITE */ Standards: Rhodium Standard Repositories (RSR) -License: MPL-2.0 (Palimpsest License) +License: AGPL-3.0-or-later (code) · CC-BY-SA-4.0 (docs) · MPL-2.0 (echidna-playground/) Language: Rust, Julia, ReScript, Chapel Version: 1.5.0 diff --git a/0-AI-MANIFEST.a2ml b/0-AI-MANIFEST.a2ml index 583422b4..ac634db8 100644 --- a/0-AI-MANIFEST.a2ml +++ b/0-AI-MANIFEST.a2ml @@ -11,7 +11,7 @@ version = "1.1" project = "echidna" type = "neurosymbolic-theorem-prover" full-version = "1.6.0" -license = "MPL-2.0" +license = "AGPL-3.0-or-later" author = "Jonathan D.A. Jewell " repo = "https://github.com/hyperpolymath/echidna" diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc index 06ed4b7e..4f6f0a4f 100644 --- a/CONTRIBUTING.adoc +++ b/CONTRIBUTING.adoc @@ -151,31 +151,51 @@ the `Documentation` section of `README.adoc`. == License and SPDX -This project is licensed under MPL-2.0; new source files carry the -header: +ECHIDNA is licensed in three parts. Use the licence of the part of the +tree your file sits in — do not copy a header from elsewhere: + +[cols="1,1"] +|=== +| Part | SPDX identifier + +| Code — `src/`, `crates/`, `ffi/`, `proofs/`, `spark/`, + `verification/`, build system, CI, machine-readable metadata +| `AGPL-3.0-or-later` + +| Documentation — `docs/`, top-level `.md` / `.adoc` +| `CC-BY-SA-4.0` + +| `echidna-playground/` — the Coq-Jr sub-project +| `MPL-2.0` +|=== + +New files carry two lines, with the SPDX identifier *first* (the +workflow linter checks line 1): [source] ---- -// SPDX-License-Identifier: CC-BY-SA-4.0 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: ---- -Don't migrate existing files' SPDX identifiers without explicit owner -direction — the license stance is intentionally MPL-2.0 across the -documentation surface, and historical drift on individual files is -owner-managed. - -ECHIDNA's contribution model historically references the -*Palimpsest License* as an ethical / philosophical framework -alongside the legal licence. That framework reference is preserved -as part of the project's stance: the *legal* licence remains as -declared by the SPDX header on each file (MPL-2.0 for the -documentation surface; historical drift owner-managed). The -Palimpsest framework is a discipline about how contributions are -received, attributed, and forwarded — orthogonal to the SPDX -choice. The Palimpsest licence proper is the legal licence only on -`palimpsest-license`, `palimpsest-plasma`, and (prospectively) -`consent-aware-http`. +`NOTICE` explains why an MPL-2.0 component is compatible inside an +AGPL work (MPL-2.0 §3.3, Secondary Licenses) and carries the full +statement. + +=== The Palimpsest framework is not a licence grant here + +ECHIDNA's contribution model references the *Palimpsest License* as an +ethical / philosophical framework: a discipline about how contributions +are received, attributed, and forwarded. That reference is preserved +and is orthogonal to the SPDX choice. + +It is *not* a legal grant in this repository. The Palimpsest licence +proper is the legal licence only on `palimpsest-license`, +`palimpsest-plasma`, and (prospectively) `consent-aware-http`. Some +files here previously carried `... OR Palimpsest-0.6` / +`... AND Palimpsest-0.6` SPDX identifiers; those were drift, not a +deliberate grant, and were removed in 2026-08. Do not reintroduce a +Palimpsest identifier into an SPDX header in this repository. == Security diff --git a/Containerfile b/Containerfile index 1b0560d5..ca2395c6 100644 --- a/Containerfile +++ b/Containerfile @@ -79,7 +79,7 @@ FROM cgr.dev/chainguard/wolfi-base:latest LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA - Extensible Cognitive Hybrid Intelligence for Deductive Neural Assistance" -LABEL org.opencontainers.image.licenses="MPL-2.0" +LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" LABEL org.opencontainers.image.version="1.5.0" LABEL org.opencontainers.image.vendor="hyperpolymath" diff --git a/HOL-o-extension/.machine_readable/6a2/META.a2ml b/HOL-o-extension/.machine_readable/6a2/META.a2ml index 739999d3..94a3d663 100644 --- a/HOL-o-extension/.machine_readable/6a2/META.a2ml +++ b/HOL-o-extension/.machine_readable/6a2/META.a2ml @@ -7,7 +7,7 @@ version = "0.1.0" last-updated = "2026-04-11" [project-info] -license = "MPL-2.0" +license = "AGPL-3.0-or-later" author = "Jonathan D.A. Jewell (hyperpolymath)" [architecture-decisions] diff --git a/NOTICE b/NOTICE index 7ddb3699..f35a3550 100644 --- a/NOTICE +++ b/NOTICE @@ -42,11 +42,20 @@ this. In short: the whole distributed work is AGPL-3.0-or-later. If you extract echidna-playground/ on its own, you may use it under MPL-2.0. -A small number of files additionally offer Palimpsest-0.6 as an alternative -or additional grant (`AGPL-3.0-or-later OR Palimpsest-0.6`, or `... AND ...`). -Those grants are preserved as originally made. Note that the Palimpsest-0.6 -licence text is not currently distributed with this repository - see -docs/DEBT.md. +THE PALIMPSEST FRAMEWORK IS NOT A LICENCE GRANT HERE + +ECHIDNA references the Palimpsest License as an ethical / philosophical +framework - a discipline about how contributions are received, attributed and +forwarded. That reference stands, and is orthogonal to the SPDX identifiers +above. + +It is not a legal grant in this repository. The Palimpsest licence proper is +the legal licence only on `palimpsest-license`, `palimpsest-plasma` and +(prospectively) `consent-aware-http`. Some files here previously carried +`... OR Palimpsest-0.6` or `... AND Palimpsest-0.6` SPDX identifiers; those +were drift rather than a deliberate grant, referenced a version superseded by +the `palimpsest-license` repository, and had no licence text distributed with +this repository. They were removed in 2026-08. LICENCE HISTORY diff --git a/container/Containerfile b/container/Containerfile index 07591e35..68f4d48a 100644 --- a/container/Containerfile +++ b/container/Containerfile @@ -39,7 +39,7 @@ LABEL org.opencontainers.image.title="ECHIDNA" \ org.opencontainers.image.url="https://github.com/hyperpolymath/echidna" \ org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" \ org.opencontainers.image.vendor="hyperpolymath" \ - org.opencontainers.image.licenses="MPL-2.0" \ + org.opencontainers.image.licenses="AGPL-3.0-or-later" \ org.opencontainers.image.version="1.5.0" \ org.opencontainers.image.authors="Jonathan D.A. Jewell " \ dev.cerrotorre.manifest="container/manifest.toml" \ diff --git a/container/manifest.toml b/container/manifest.toml index 060222c1..5ed75e6d 100644 --- a/container/manifest.toml +++ b/container/manifest.toml @@ -12,7 +12,7 @@ ECHIDNA — neurosymbolic theorem proving platform with 30 prover backends, packaged as a verified cerro-torre .ctp bundle with Ed25519 signing and full provenance tracking. """ -license = "MPL-2.0" +license = "AGPL-3.0-or-later" homepage = "https://github.com/hyperpolymath/echidna" maintainer = "Jonathan D.A. Jewell " diff --git a/docs-site/.well-known/aibdp.json b/docs-site/.well-known/aibdp.json index 152adb87..b49849dd 100644 --- a/docs-site/.well-known/aibdp.json +++ b/docs-site/.well-known/aibdp.json @@ -32,5 +32,5 @@ } }, "contact": "jonathan.jewell@open.ac.uk", - "license": "MPL-2.0" + "license": "AGPL-3.0-or-later" } diff --git a/docs/DEBT.md b/docs/DEBT.md index 90502477..267a55bc 100644 --- a/docs/DEBT.md +++ b/docs/DEBT.md @@ -68,22 +68,69 @@ git grep -I -h -m1 -oP 'SPDX-License-Identifier:\s*\K[A-Za-z0-9.\-+]+( (AND|OR) gh repo view hyperpolymath/echidna --json licenseInfo ``` -### Residual — `Palimpsest-0.6` has no licence text - -Seven files offer `Palimpsest-0.6` as an alternative or additional grant -(`AGPL-3.0-or-later OR Palimpsest-0.6`, and two with `AND`). **No -`Palimpsest-0.6` text exists in this repository or anywhere in the estate** -(`find . -iname '*palimpsest*'` and `ls ../standards/LICENSES/` both come back -without it), so the identifier is unresolvable and REUSE cannot validate it. - -The grants were **preserved rather than dropped** — removing half of a dual -licence withdraws a permission the owner granted, which is not a -documentation decision. Resolve by supplying `LICENSES/Palimpsest-0.6.txt`, -or by deciding the Palimpsest grant is retired and removing it deliberately. - -Note `docs/legal/texts/PMPL-1.0-or-later.txt` exists and the estate's -`standards/LICENSES/` carries `PMPL-1.0-or-later.txt` — PMPL and Palimpsest -are different identifiers, and only the former has a text. +### Closed — `Palimpsest-0.6` grants removed + +Seven files (later found to be 29) carried `Palimpsest-0.6` in their SPDX +identifier. The owner ruled these were never a deliberate legal grant: +`CONTRIBUTING.adoc` already recorded that the Palimpsest licence proper "is +the legal licence only on `palimpsest-license`, `palimpsest-plasma`, and +(prospectively) `consent-aware-http`", and that in ECHIDNA it is an *ethical +framework* reference, orthogonal to the SPDX choice. Version 0.6 is also +superseded by the `hyperpolymath/palimpsest-license` repository. + +All Palimpsest SPDX identifiers were therefore removed. The framework +reference is preserved in `CONTRIBUTING.adoc` and `NOTICE`, which now state +explicitly that it is not a grant, so this cannot drift back in silently. + +Two exclusions, deliberate: `training_data/proof_states_v2.jsonl` contains +SPDX strings as *scraped corpus content* (proof goals harvested from files, +recorded as data — editing them would corrupt the corpus), and `docs/legal/` +holds licence reference texts. + +### Closed — three further licence-drift classes found by the deeper sweep + +The SPDX-header sweep alone would have missed all of these. Recorded because +each is a distinct class worth re-checking after any future licence change: + +1. **Stale `MIT` grants.** `src/rescript/.gitignore`, `styles/main.css` and + `tailwind.config.js` still declared `MIT OR Palimpsest-0.6` — pre-dating + even the MPL migration. Removing only the Palimpsest half would have left + them **MIT**. Now AGPL-3.0-or-later. +2. **Machine-readable `license:` fields**, which are what packaging and + tooling actually read, and which carry no `SPDX-License-Identifier:` line + for a header sweep to match. Eight declared MPL-2.0: + `docs-site/.well-known/aibdp.json` (served on the site), `stapeln.toml`, + `container/manifest.toml`, three Ada `alire.toml` manifests under `spark/`, + `.machine_readable/descriptiles/META.a2ml`, and `0-AI-MANIFEST.a2ml`. + Plus a **nested `src/rescript/.reuse/dep5`** declaring `MIT OR + Palimpsest-0.6` for the UI sub-tree. +3. **A user-facing licence string.** `src/rescript/src/Main.res` rendered + `"MIT OR Palimpsest-0.6 License"` in the UI — a false licence statement + shown to users, invisible to every header-based check. +4. **OCI image labels** — 16 `LABEL org.opencontainers.image.licenses="MPL-2.0"` + across `Containerfile`, `container/Containerfile`, and the + `.containerization/` tree (11 in `Containerfile.wave3` alone, one per + per-prover stage). These are **baked into every image published to + ghcr.io** and read by registries, SBOM generators and supply-chain + scanners, so the wrong value propagates downstream of the repository + entirely. Also `canonical-license` in + `.machine_readable/anchors/ANCHOR.a2ml` and two Idris2 `.ipkg` manifests. + +**Detector for next time** — a header sweep is not sufficient: + +```bash +git grep -In '"license"' -- '*.json' +git grep -In '^license' -- '*.toml' '*.a2ml' +git grep -In '^licenses' -- '*.toml' +find . -name dep5 -not -path './.git/*' # nested REUSE configs +git grep -InE '"(MIT|MPL|AGPL|Apache)[^"]*"' -- 'src/' 'site/' # UI strings +git grep -In 'org.opencontainers.image.licenses' # OCI labels + +# or, exhaustively — by value rather than by file type, which is what +# actually caught the last three classes: +git grep -InE '(license|licenses|licence)\s*[:=]\s*"?(MPL-2\.0|MIT|Palimpsest)' \ + | grep -v '^echidna-playground/' +``` --- diff --git a/docs/governance/JUST_AND_MUST_FRAMEWORK.md b/docs/governance/JUST_AND_MUST_FRAMEWORK.md index 370d997e..35a1bdb6 100644 --- a/docs/governance/JUST_AND_MUST_FRAMEWORK.md +++ b/docs/governance/JUST_AND_MUST_FRAMEWORK.md @@ -35,7 +35,7 @@ Together, these create a **stable, predictable development experience**. **Justfile** (complete, comprehensive): ```justfile -# SPDX-License-Identifier: CC-BY-SA-4.0 OR Palimpsest-0.6 +# SPDX-License-Identifier: CC-BY-SA-4.0 # ECHIDNA Standard Build System # List all available commands @@ -370,7 +370,7 @@ dev-cycle: ```bash #!/usr/bin/env bash -# SPDX-License-Identifier: CC-BY-SA-4.0 OR Palimpsest-0.6 +# SPDX-License-Identifier: CC-BY-SA-4.0 # Must Validation System # # Exit codes: @@ -570,7 +570,7 @@ jobs: ```bash #!/usr/bin/env bash -# SPDX-License-Identifier: CC-BY-SA-4.0 OR Palimpsest-0.6 +# SPDX-License-Identifier: CC-BY-SA-4.0 # Pre-commit hook: Run quick validation set -e diff --git a/examples/simple_proof.v b/examples/simple_proof.v index bed7aa9e..c06c4ede 100644 --- a/examples/simple_proof.v +++ b/examples/simple_proof.v @@ -1,4 +1,4 @@ -(* SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later *) (* Simple Coq proof demonstrating ECHIDNA capabilities *) (** * Simple Arithmetic Proof diff --git a/proofs/acl2/associativity.lisp b/proofs/acl2/associativity.lisp index 36e48dc3..76811037 100644 --- a/proofs/acl2/associativity.lisp +++ b/proofs/acl2/associativity.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +; SPDX-License-Identifier: AGPL-3.0-or-later ;; Associativity of addition ;; Demonstrates ACL2's automated proof with induction diff --git a/proofs/acl2/binary_trees.lisp b/proofs/acl2/binary_trees.lisp index 148a9e99..76a8e1bb 100644 --- a/proofs/acl2/binary_trees.lisp +++ b/proofs/acl2/binary_trees.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +; SPDX-License-Identifier: AGPL-3.0-or-later ;; Binary tree operations ;; Demonstrates data structure reasoning diff --git a/proofs/acl2/factorial.lisp b/proofs/acl2/factorial.lisp index 67d7d009..687838b2 100644 --- a/proofs/acl2/factorial.lisp +++ b/proofs/acl2/factorial.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +; SPDX-License-Identifier: AGPL-3.0-or-later ;; Factorial function with guards ;; Demonstrates ACL2's guard verification and executable specifications diff --git a/proofs/acl2/list_append.lisp b/proofs/acl2/list_append.lisp index 5559e592..30afcbde 100644 --- a/proofs/acl2/list_append.lisp +++ b/proofs/acl2/list_append.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +; SPDX-License-Identifier: AGPL-3.0-or-later ;; List append properties ;; Demonstrates recursive definitions and list reasoning diff --git a/proofs/acl2/sorting.lisp b/proofs/acl2/sorting.lisp index 690fa98b..27d43f32 100644 --- a/proofs/acl2/sorting.lisp +++ b/proofs/acl2/sorting.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +; SPDX-License-Identifier: AGPL-3.0-or-later ;; Insertion sort correctness ;; Demonstrates algorithm verification diff --git a/proofs/agda/Basic.agda b/proofs/agda/Basic.agda index d1390184..535cc8ec 100644 --- a/proofs/agda/Basic.agda +++ b/proofs/agda/Basic.agda @@ -1,5 +1,5 @@ -- SPDX-FileCopyrightText: 2025 ECHIDNA Project Team --- SPDX-License-Identifier: AGPL-3.0-or-later AND Palimpsest-0.6 +-- SPDX-License-Identifier: AGPL-3.0-or-later -- -- Basic.agda - Simple proofs demonstrating fundamental logical principles -- diff --git a/proofs/hol4/arithmetic.sml b/proofs/hol4/arithmetic.sml index ce7bfae0..8dfc88ae 100644 --- a/proofs/hol4/arithmetic.sml +++ b/proofs/hol4/arithmetic.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later *) (* Arithmetic properties in HOL4 *) (* Demonstrates decision procedures and automation *) diff --git a/proofs/hol4/binary_tree.sml b/proofs/hol4/binary_tree.sml index 2427671f..a98f071a 100644 --- a/proofs/hol4/binary_tree.sml +++ b/proofs/hol4/binary_tree.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later *) (* Binary tree operations in HOL4 *) (* Demonstrates datatype definitions and structural induction *) diff --git a/proofs/hol4/list_append.sml b/proofs/hol4/list_append.sml index 2a2646d6..63f49bf6 100644 --- a/proofs/hol4/list_append.sml +++ b/proofs/hol4/list_append.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later *) (* List append properties in HOL4 *) (* Demonstrates inductive proofs over lists *) diff --git a/proofs/hol4/set_theory.sml b/proofs/hol4/set_theory.sml index 7f5b9baf..a2ce6d13 100644 --- a/proofs/hol4/set_theory.sml +++ b/proofs/hol4/set_theory.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later *) (* Set theory properties in HOL4 *) (* Demonstrates higher-order reasoning *) diff --git a/proofs/hol4/sorting.sml b/proofs/hol4/sorting.sml index 5aa6cbc7..1e8d5021 100644 --- a/proofs/hol4/sorting.sml +++ b/proofs/hol4/sorting.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 *) +(* SPDX-License-Identifier: AGPL-3.0-or-later *) (* Sorting algorithm verification in HOL4 *) (* Demonstrates algorithm correctness proofs *) diff --git a/proofs/pvs/arithmetic.pvs b/proofs/pvs/arithmetic.pvs index 668f2554..859d0d93 100644 --- a/proofs/pvs/arithmetic.pvs +++ b/proofs/pvs/arithmetic.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +% SPDX-License-Identifier: AGPL-3.0-or-later % Arithmetic properties % Demonstrates PVS's powerful decision procedures diff --git a/proofs/pvs/binary_search.pvs b/proofs/pvs/binary_search.pvs index b3c80269..bd952f6f 100644 --- a/proofs/pvs/binary_search.pvs +++ b/proofs/pvs/binary_search.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +% SPDX-License-Identifier: AGPL-3.0-or-later % Binary search on sorted arrays % Demonstrates PVS's specification and verification capabilities diff --git a/proofs/pvs/list_theory.pvs b/proofs/pvs/list_theory.pvs index 730be82a..91d72641 100644 --- a/proofs/pvs/list_theory.pvs +++ b/proofs/pvs/list_theory.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +% SPDX-License-Identifier: AGPL-3.0-or-later % List theory with append and length % Demonstrates PVS's dependent types and TCCs diff --git a/proofs/pvs/set_theory.pvs b/proofs/pvs/set_theory.pvs index 38b0a226..3d7c2798 100644 --- a/proofs/pvs/set_theory.pvs +++ b/proofs/pvs/set_theory.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +% SPDX-License-Identifier: AGPL-3.0-or-later % Set operations and properties % Demonstrates higher-order reasoning in PVS diff --git a/proofs/pvs/sorting.pvs b/proofs/pvs/sorting.pvs index e4930c7d..c3a25285 100644 --- a/proofs/pvs/sorting.pvs +++ b/proofs/pvs/sorting.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +% SPDX-License-Identifier: AGPL-3.0-or-later % Insertion sort specification and verification % Demonstrates algorithm correctness in PVS diff --git a/rules/security_learning.lgt b/rules/security_learning.lgt index 0f83bf81..6f12c744 100644 --- a/rules/security_learning.lgt +++ b/rules/security_learning.lgt @@ -1,4 +1,4 @@ -%% SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +%% SPDX-License-Identifier: AGPL-3.0-or-later %% ECHIDNA Security Rule Learning Module %% Learns security patterns from cicd-hyper-a audit data diff --git a/scripts/build-production.sh b/scripts/build-production.sh index d36d1947..6b857e47 100755 --- a/scripts/build-production.sh +++ b/scripts/build-production.sh @@ -1,5 +1,5 @@ #!/bin/bash -# SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +# SPDX-License-Identifier: AGPL-3.0-or-later # Production build script for ECHIDNA set -e diff --git a/scripts/demo-proof.sh b/scripts/demo-proof.sh index 4acf1f6d..6b7dd930 100755 --- a/scripts/demo-proof.sh +++ b/scripts/demo-proof.sh @@ -1,5 +1,5 @@ #!/bin/bash -# SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +# SPDX-License-Identifier: AGPL-3.0-or-later # ECHIDNA Interactive Demo - Proof of Commutativity set -e diff --git a/scripts/expand_training_data.sh b/scripts/expand_training_data.sh index 65a407b6..47acb19d 100755 --- a/scripts/expand_training_data.sh +++ b/scripts/expand_training_data.sh @@ -1,5 +1,5 @@ #!/bin/bash -# SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +# SPDX-License-Identifier: AGPL-3.0-or-later # Quick training data expansion script for ECHIDNA set -e diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index 01b664d5..caa5b245 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -1,6 +1,6 @@ #!/bin/bash # SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -# SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +# SPDX-License-Identifier: AGPL-3.0-or-later # Integration test runner for Rust↔Julia communication # Starts Julia test server, runs Rust integration tests, then stops server diff --git a/spark/axiom_tracker/alire.toml b/spark/axiom_tracker/alire.toml index 0acd78b7..3c397fd7 100644 --- a/spark/axiom_tracker/alire.toml +++ b/spark/axiom_tracker/alire.toml @@ -1,7 +1,7 @@ name = "axiom_tracker_spark" description = "SPARK companion for echidna axiom_tracker module" version = "0.1.0" -licenses = "MPL-2.0" +licenses = "AGPL-3.0-or-later" maintainers = ["hyperpolymath@users.noreply.github.com"] maintainers-logins = ["hyperpolymath"] diff --git a/spark/certificates/alire.toml b/spark/certificates/alire.toml index d2013b71..5c5d42bd 100644 --- a/spark/certificates/alire.toml +++ b/spark/certificates/alire.toml @@ -1,7 +1,7 @@ name = "certificates_spark" description = "SPARK companion for echidna certificates module" version = "0.1.0" -licenses = "MPL-2.0" +licenses = "AGPL-3.0-or-later" maintainers = ["hyperpolymath@users.noreply.github.com"] maintainers-logins = ["hyperpolymath"] diff --git a/spark/solver_integrity/alire.toml b/spark/solver_integrity/alire.toml index cc0c49ee..1bdce497 100644 --- a/spark/solver_integrity/alire.toml +++ b/spark/solver_integrity/alire.toml @@ -1,7 +1,7 @@ name = "solver_integrity_spark" description = "SPARK companion for echidna solver_integrity module" version = "0.1.0" -licenses = "MPL-2.0" +licenses = "AGPL-3.0-or-later" maintainers = ["hyperpolymath@users.noreply.github.com"] maintainers-logins = ["hyperpolymath"] diff --git a/src/abi/echidnaabi.ipkg b/src/abi/echidnaabi.ipkg index 5a9d99b8..dcd5baf0 100644 --- a/src/abi/echidnaabi.ipkg +++ b/src/abi/echidnaabi.ipkg @@ -10,7 +10,7 @@ package echidnaabi version = 0.2.0 authors = "Jonathan D.A. Jewell" -license = "MPL-2.0" +license = "AGPL-3.0-or-later" brief = "ECHIDNA ABI definitions with formal proofs for 30 prover backends (zero believe-me)" sourcedir = "." diff --git a/src/idris/echidna-validator.ipkg b/src/idris/echidna-validator.ipkg index ec23801e..760a0a9f 100644 --- a/src/idris/echidna-validator.ipkg +++ b/src/idris/echidna-validator.ipkg @@ -3,7 +3,7 @@ package echidna-validator version = 0.1.0 authors = "Jonathan D.A. Jewell " -license = "MPL-2.0" +license = "AGPL-3.0-or-later" sourcedir = "." diff --git a/src/julia/test_server.jl b/src/julia/test_server.jl index 601b4627..8f366afa 100644 --- a/src/julia/test_server.jl +++ b/src/julia/test_server.jl @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -# SPDX-License-Identifier: AGPL-3.0-or-later AND Palimpsest-0.6 +# SPDX-License-Identifier: AGPL-3.0-or-later """ test_server.jl diff --git a/src/rescript/.gitignore b/src/rescript/.gitignore index 26dc9ff6..47992813 100644 --- a/src/rescript/.gitignore +++ b/src/rescript/.gitignore @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: MIT OR Palimpsest-0.6 +# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-FileCopyrightText: 2025 ECHIDNA Project Team # Dependencies diff --git a/src/rescript/.reuse/dep5 b/src/rescript/.reuse/dep5 index 5fc07a92..365d4de9 100644 --- a/src/rescript/.reuse/dep5 +++ b/src/rescript/.reuse/dep5 @@ -1,12 +1,17 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: echidna-ui -Upstream-Contact: ECHIDNA Project Team +Upstream-Contact: Jonathan D.A. Jewell Source: https://github.com/hyperpolymath/echidna +# This sub-tree follows the repository-wide licensing set out in the root +# NOTICE and .reuse/dep5: code is AGPL-3.0-or-later. The previous +# "MIT OR Palimpsest-0.6" declaration here predated the MPL and then AGPL +# migrations and was never updated. + Files: package.json package-lock.json rescript.json deno.json import_map.json tailwind.config.js -Copyright: 2025 ECHIDNA Project Team -License: MIT OR Palimpsest-0.6 +Copyright: 2025-2026 Jonathan D.A. Jewell and ECHIDNA Project Contributors +License: AGPL-3.0-or-later -Files: node_modules/* .gitignore -Copyright: Various -License: MIT OR Palimpsest-0.6 +Files: .gitignore +Copyright: 2025-2026 Jonathan D.A. Jewell and ECHIDNA Project Contributors +License: AGPL-3.0-or-later diff --git a/src/rescript/src/Main.res b/src/rescript/src/Main.res index 856e2f2d..43548182 100644 --- a/src/rescript/src/Main.res +++ b/src/rescript/src/Main.res @@ -196,7 +196,7 @@ let make = () => { {React.string("ECHIDNA v0.1.0 - Extensible Cognitive Hybrid Intelligence for Deductive Neural Assistance")}

- {React.string("MIT OR Palimpsest-0.6 License")} + {React.string("AGPL-3.0-or-later")}

diff --git a/src/rescript/styles/main.css b/src/rescript/styles/main.css index aced01b2..5bdb57fd 100644 --- a/src/rescript/styles/main.css +++ b/src/rescript/styles/main.css @@ -1,4 +1,4 @@ -/* SPDX-License-Identifier: MIT OR Palimpsest-0.6 */ +/* SPDX-License-Identifier: AGPL-3.0-or-later */ /* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team */ /** diff --git a/src/rescript/tailwind.config.js b/src/rescript/tailwind.config.js index 65dcbbd2..f977e83d 100644 --- a/src/rescript/tailwind.config.js +++ b/src/rescript/tailwind.config.js @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT OR Palimpsest-0.6 +// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team /** @type {import('tailwindcss').Config} */ diff --git a/src/zig/ffi/echidna_ffi.h b/src/zig/ffi/echidna_ffi.h index 6383fb4b..9eabc404 100644 --- a/src/zig/ffi/echidna_ffi.h +++ b/src/zig/ffi/echidna_ffi.h @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: AGPL-3.0-or-later OR Palimpsest-0.6 +// SPDX-License-Identifier: AGPL-3.0-or-later /** * @file echidna_ffi.h diff --git a/stapeln.toml b/stapeln.toml index 9bd8bbd1..12a69c64 100644 --- a/stapeln.toml +++ b/stapeln.toml @@ -9,7 +9,7 @@ name = "echidna" version = "0.1.0" description = "echidna container service" author = "Jonathan D.A. Jewell " -license = "MPL-2.0" +license = "AGPL-3.0-or-later" registry = "ghcr.io/hyperpolymath" [build] From 813da23cf1d1028fe0f78cec95ddc0dae6e487d5 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Fri, 7 Aug 2026 14:33:28 +0100 Subject: [PATCH 4/5] chore(ui): remove ReScript from the repository MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ReScript is a banned language under the estate language policy, with AffineScript-TEA as the replacement. This removes echidna's own ReScript: src/rescript/ 24 files (the UI) src/provers/ 13 files (.res prover clients — orphaned; nothing outside reports/ and the hypatia baseline referenced them) echidna-playground/ retains its 8 .res files: that sub-project carries contributions attributed to Coq-Jr Contributors, so removing their code is a separate decision, not a language-policy cleanup. Build and CI references updated rather than left dangling: - Justfile: build-ui/watch-ui/dev-ui replaced. build-ui now FAILS with a clear message instead of silently doing nothing — the AffineScript-TEA pipeline is not wired yet (issues #117, #266, missing Http::fetch / Async / Json primitives). serve-ui and the gui recipe serve the static shell at src/ui/public/ instead. - deno.json: dev:ui/build:ui -> serve:ui; dropped node_modules excludes - codecov.yml: dropped the rescript flag and rescript_ui component - .gitlab-ci.yml: dropped the build-rescript job - .echidnabot.toml: secondary_languages rescript -> affinescript Not fixed here: .gitlab-ci.yml does not parse as YAML, at a line untouched by this change (a bare % inside an unquoted shell command). Verified pre-existing — HEAD fails identically at the same line before the removal shifted it. Recorded in docs/DEBT.md. Co-Authored-By: Claude Opus 5 --- .echidnabot.toml | 2 +- .gitlab-ci.yml | 11 - Justfile | 32 +- codecov.yml | 22 - deno.json | 9 +- src/provers/Mod.res | 33 -- src/provers/clients/LeanTool.res | 315 ---------- src/provers/clients/Metamath.res | 327 ---------- src/provers/clients/SystemOnTptp.res | 172 ------ src/provers/clients/Unified.res | 339 ----------- src/provers/clients/UnifiedTest.res | 61 -- src/provers/clients/Wolfram.res | 295 --------- src/provers/clients/Z3Wasm.res | 197 ------ src/provers/runners/Cli.res | 559 ------------------ src/provers/runners/Daemon.res | 429 -------------- src/provers/types/Prover.res | 144 ----- src/provers/types/ProverTest.res | 87 --- src/provers/utils/Http.res | 163 ----- src/rescript/.gitignore | 62 -- src/rescript/.reuse/dep5 | 17 - src/rescript/README.md | 349 ----------- src/rescript/deno.json | 65 -- src/rescript/deno.lock | 72 --- src/rescript/import_map.json | 11 - src/rescript/index.html | 49 -- src/rescript/lib/rescript.lock | 1 - src/rescript/package.json | 33 -- src/rescript/rescript.json | 37 -- src/rescript/src/Main.res | 214 ------- src/rescript/src/Server.res | 114 ---- src/rescript/src/api/Client.res | 359 ----------- src/rescript/src/components/GoalList.res | 121 ---- src/rescript/src/components/ProofTree.res | 204 ------- src/rescript/src/components/ProofViewer.res | 167 ------ .../src/components/ProverSelector.res | 124 ---- .../src/components/TacticSuggester.res | 186 ------ src/rescript/src/components/TheoremSearch.res | 194 ------ src/rescript/src/state/Store.res | 192 ------ src/rescript/styles/main.css | 370 ------------ src/rescript/tailwind.config.js | 38 -- src/rescript/test-ui.js | 43 -- src/rescript/test.html | 256 -------- 42 files changed, 22 insertions(+), 6453 deletions(-) delete mode 100644 src/provers/Mod.res delete mode 100644 src/provers/clients/LeanTool.res delete mode 100644 src/provers/clients/Metamath.res delete mode 100644 src/provers/clients/SystemOnTptp.res delete mode 100644 src/provers/clients/Unified.res delete mode 100644 src/provers/clients/UnifiedTest.res delete mode 100644 src/provers/clients/Wolfram.res delete mode 100644 src/provers/clients/Z3Wasm.res delete mode 100644 src/provers/runners/Cli.res delete mode 100644 src/provers/runners/Daemon.res delete mode 100644 src/provers/types/Prover.res delete mode 100644 src/provers/types/ProverTest.res delete mode 100644 src/provers/utils/Http.res delete mode 100644 src/rescript/.gitignore delete mode 100644 src/rescript/.reuse/dep5 delete mode 100644 src/rescript/README.md delete mode 100644 src/rescript/deno.json delete mode 100644 src/rescript/deno.lock delete mode 100644 src/rescript/import_map.json delete mode 100644 src/rescript/index.html delete mode 100644 src/rescript/lib/rescript.lock delete mode 100644 src/rescript/package.json delete mode 100644 src/rescript/rescript.json delete mode 100644 src/rescript/src/Main.res delete mode 100644 src/rescript/src/Server.res delete mode 100644 src/rescript/src/api/Client.res delete mode 100644 src/rescript/src/components/GoalList.res delete mode 100644 src/rescript/src/components/ProofTree.res delete mode 100644 src/rescript/src/components/ProofViewer.res delete mode 100644 src/rescript/src/components/ProverSelector.res delete mode 100644 src/rescript/src/components/TacticSuggester.res delete mode 100644 src/rescript/src/components/TheoremSearch.res delete mode 100644 src/rescript/src/state/Store.res delete mode 100644 src/rescript/styles/main.css delete mode 100644 src/rescript/tailwind.config.js delete mode 100644 src/rescript/test-ui.js delete mode 100644 src/rescript/test.html diff --git a/.echidnabot.toml b/.echidnabot.toml index 1427998f..712c2e42 100644 --- a/.echidnabot.toml +++ b/.echidnabot.toml @@ -12,7 +12,7 @@ type = "formal-verification" [architecture] enforcement_level = "normal" primary_language = "rust" # Core prover backends -secondary_languages = ["julia", "rescript", "idris2", "chapel", "spark"] +secondary_languages = ["julia", "affinescript", "idris2", "chapel", "spark"] [provers] # ECHIDNA is self-hosting - can verify its own Idris2 ABI definitions diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 54634b17..9eadf708 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -100,17 +100,6 @@ build-julia: - .julia/ expire_in: 1 day -build-rescript: - stage: build - image: docker.io/denoland/deno:debian-1.40.0 - script: - - cd src/rescript - - deno task build || echo "ReScript build completed with warnings" - artifacts: - paths: - - src/rescript/dist/ - expire_in: 1 day - allow_failure: true build-container: stage: build diff --git a/Justfile b/Justfile index 5bb21310..75bb959e 100644 --- a/Justfile +++ b/Justfile @@ -518,21 +518,23 @@ audit: # ── UI Management ────────────────────────────────────────── -# Build ReScript frontend (Deno caches npm: deps automatically — no install step) +# ── UI ── +# The ReScript UI was removed 2026-08 (ReScript is a banned language under the +# estate language policy; AffineScript-TEA is the replacement). The TEA sources +# live in src/ui/tea/ and the static shell in src/ui/public/, but the +# AffineScript compile pipeline is NOT wired yet — see issues #117 and #266 +# (missing Http::fetch / Async / Json primitives). + +# Build the UI — blocked on the AffineScript-TEA toolchain build-ui: - cd src/rescript && deno task res:build && deno task build + @echo "build-ui is unavailable: the ReScript UI was removed and the" + @echo "AffineScript-TEA pipeline is not wired yet (issues #117, #266)." + @echo "Sources: src/ui/tea/echidna_gui.affine; shell: src/ui/public/." + @exit 1 -# Start ReScript compiler in watch mode -watch-ui: - cd src/rescript && deno task res:dev - -# Start Deno dev server for UI -dev-ui: - cd src/rescript && deno task dev - -# Serve production UI build +# Serve the static UI shell (no compile step) serve-ui: - cd src/rescript && deno task serve + cd src/ui/public && deno run --allow-net --allow-read jsr:@std/http/file-server # Launch full ECHIDNA GUI (Backend + UI + Browser) gui: @@ -543,7 +545,7 @@ gui: cargo run -- server --port 8081 --cors > /dev/null 2>&1 & BACKEND_PID=$! echo "Started backend (PID $BACKEND_PID)" # Start UI server - cd src/rescript && deno task serve > /dev/null 2>&1 & UI_PID=$! + (cd src/ui/public && deno run --allow-net --allow-read jsr:@std/http/file-server) > /dev/null 2>&1 & UI_PID=$! echo "Started UI server (PID $UI_PID)" # Cleanup on exit trap "kill $BACKEND_PID $UI_PID 2>/dev/null || true" EXIT @@ -947,8 +949,8 @@ tour: echo " src/abi/ - Idris2 formal type definitions" echo " ffi/zig/ - Zig FFI bridge (4 shared libraries)" echo "" - echo "5. UI: src/rescript/" - echo " ReScript + Deno frontend (33 files, zero TypeScript)." + echo "5. UI: src/ui/" + echo " AffineScript-TEA (src/ui/tea/) + static shell (src/ui/public/)." echo "" echo "6. BUILD SYSTEM:" echo " Cargo.toml - Rust workspace" diff --git a/codecov.yml b/codecov.yml index e9c57515..749f0345 100644 --- a/codecov.yml +++ b/codecov.yml @@ -47,25 +47,3 @@ flags: - src/julia/ carryforward: true - rescript: - paths: - - src/rescript/ - carryforward: true - -# Component coverage -component_management: - individual_components: - - component_id: rust_core - name: Rust Core - paths: - - src/rust/ - - - component_id: julia_ml - name: Julia ML - paths: - - src/julia/ - - - component_id: rescript_ui - name: ReScript UI - paths: - - src/rescript/ diff --git a/deno.json b/deno.json index f4439f49..e93104c5 100644 --- a/deno.json +++ b/deno.json @@ -31,13 +31,12 @@ "ban-npm": "echo '❌ npm is BANNED in this project. Use Deno!' && exit 1", - "dev:ui": "cd src/rescript && deno task dev", - "build:ui": "cd src/rescript && deno task build" + "serve:ui": "cd src/ui/public && deno run --allow-net --allow-read jsr:@std/http/file-server" }, "fmt": { "include": ["src/"], - "exclude": ["src/rescript/node_modules/"], + "exclude": [], "options": { "useTabs": false, "lineWidth": 100, @@ -49,7 +48,7 @@ "lint": { "include": ["src/"], - "exclude": ["src/rescript/node_modules/"], + "exclude": [], "rules": { "tags": ["recommended"], "include": [ @@ -63,7 +62,7 @@ "test": { "include": ["src/**/*_test.ts", "src/**/*.test.ts"], - "exclude": ["src/rescript/"] + "exclude": [] }, "publish": { diff --git a/src/provers/Mod.res b/src/provers/Mod.res deleted file mode 100644 index 154162c6..00000000 --- a/src/provers/Mod.res +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) - -/** - * ECHIDNA Prover Integration Module - * Barrel re-export of all prover types, clients, runners, and utilities. - * Deno-native theorem prover integration (NO NPM). - * - * Types: Prover, ProverResult, Problem, QueueItem, ProverConfig, etc. - * Clients: SystemOnTPTP, Metamath, Z3Wasm, Wolfram, LeanTool, Unified - * Runners: ProofRunnerDaemon - * Utilities: HTTP helpers with retry logic - */ - -// NOTE: ReScript does not have barrel re-exports like TypeScript. -// Each module (Prover.res, LeanTool.res, Metamath.res, etc.) is -// automatically available by name. This file documents the public API -// surface for the prover subsystem. -// -// Module Map: -// Types: Prover (types, DEFAULT_CONFIG, PROVER_REGISTRY) -// Clients: SystemOnTptp, Metamath, Z3Wasm, Wolfram, LeanTool, Unified -// Runners: Daemon (ProofRunnerDaemon, DaemonConfig, DaemonStats, DaemonEvent) -// Utils: Http (fetchWithRetry, postForm, postJSON, getText, sleep, backoffDelay) - -/** Re-export key type aliases for convenience */ -type inputFormat = Prover.inputFormat -type proverStatus = Prover.proverStatus -type prover = Prover.prover -type proverResult = Prover.proverResult -type problem = Prover.problem -type queueItem = Prover.queueItem -type proverConfig = Prover.proverConfig diff --git a/src/provers/clients/LeanTool.res b/src/provers/clients/LeanTool.res deleted file mode 100644 index e9846993..00000000 --- a/src/provers/clients/LeanTool.res +++ /dev/null @@ -1,315 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) - -/** - * ECHIDNA LeanTool Client - * Lean 4 theorem proving via OpenAI-compatible API. - * Uses the LeanTool OpenAI-compatible API server. - * Demo: https://www.codeproofarena.com:8800/v1 - */ - -/** Default LeanTool API endpoint */ -let leantoolDefaultEndpoint = "https://www.codeproofarena.com:8800/v1" - -/** Lean Playground endpoint for fallback */ -let leanPlaygroundUrl = "https://live.lean-lang.org" - -/** FFI: Deno.env.get */ -@scope(("Deno", "env")) @val -external envGet: string => option = "get" - -/** FFI: crypto.randomUUID */ -@scope("crypto") @val -external randomUUID: unit => string = "randomUUID" - -/** OpenAI-compatible chat completion message */ -type chatMessage = { - role: string, - content: string, -} - -/** OpenAI-compatible chat completion request */ -type chatCompletionRequest = { - model: string, - messages: array, - temperature: option, - max_tokens: option, -} - -/** Chat completion choice */ -type chatChoice = { - index: int, - message: chatMessage, - finish_reason: string, -} - -/** Token usage stats */ -type chatUsage = { - prompt_tokens: int, - completion_tokens: int, - total_tokens: int, -} - -/** OpenAI-compatible chat completion response */ -type chatCompletionResponse = { - id: string, - object: string, - created: int, - model: string, - choices: array, - usage: option, -} - -/** Parsed Lean output result */ -type parsedLeanOutput = { - status: Prover.proverStatus, - proof: option, - error: option, -} - -/** Parse Lean output for proof status */ -let parseLeanOutput = (output: string): parsedLeanOutput => { - let lower = Js.String2.toLowerCase(output) - - // Check for errors - if ( - Js.String2.includes(lower, "error") || - Js.String2.includes(lower, "unknown identifier") || - Js.String2.includes(lower, "type mismatch") - ) { - {status: Prover.Error, proof: None, error: Some(output)} - } - // Check for successful proof - else if ( - Js.String2.includes(lower, "no goals") || - Js.String2.includes(lower, "goals accomplished") || - Js.String2.includes(lower, "qed") || - Js.String2.includes(lower, "exact") || - Js.String2.includes(lower, "rfl") - ) { - {status: Prover.Theorem, proof: Some(output), error: None} - } - // Check for counterexample - else if ( - Js.String2.includes(lower, "counterexample") || - Js.String2.includes(lower, "failed") - ) { - {status: Prover.Countersatisfiable, proof: None, error: Some(output)} - } else { - {status: Prover.Unknown, proof: None, error: None} - } -} - -/** LeanTool prover definitions */ -let provers: array = [ - { - id: "lean4", - name: "Lean 4", - version: None, - formats: [Prover.Lean], - endpoint: None, - tier: 3, - online: true, - }, - { - id: "lean4-mathlib", - name: "Lean 4 + Mathlib", - version: None, - formats: [Prover.Lean], - endpoint: None, - tier: 3, - online: true, - }, -] - -/** Client name identifier */ -let name = "LeanTool" - -/** Make a prover config from partial options */ -let makeConfig = ( - ~timeout_sec=120, - ~retry_count=3, - ~retry_delay_ms=1000, - ~api_key=?, - ~endpoint=?, - (), -): Prover.proverConfig => { - timeout_sec, - retry_count, - retry_delay_ms, - api_key, - endpoint, -} - -/** Resolve the endpoint URL from config or environment */ -let resolveEndpoint = (config: Prover.proverConfig): string => { - switch config.endpoint { - | Some(ep) => ep - | None => - switch envGet("LEANTOOL_ENDPOINT") { - | Some(ep) => ep - | None => leantoolDefaultEndpoint - } - } -} - -/** Resolve the API key from config or environment */ -let resolveApiKey = (config: Prover.proverConfig): string => { - switch config.api_key { - | Some(k) => k - | None => Belt.Option.getWithDefault(envGet("LEANTOOL_API_KEY"), "") - } -} - -/** Ping the LeanTool service to check availability */ -let ping = (config: Prover.proverConfig): Js.Promise2.t => { - let endpoint = resolveEndpoint(config) - let apiKey = resolveApiKey(config) - let headers = if Js.String2.length(apiKey) > 0 { - Some({"Authorization": `Bearer ${apiKey}`}) - } else { - None - } - let url = `${endpoint}/models` - - Http.fetchWithRetry(url, ~init=?headers) - ->Js.Promise2.then(resp => Js.Promise2.resolve(resp.ok)) - ->Js.Promise2.catch(_ => { - // Try playground as fallback - Http.fetchWithRetry(leanPlaygroundUrl) - ->Js.Promise2.then(resp => Js.Promise2.resolve(resp.ok)) - ->Js.Promise2.catch(_ => Js.Promise2.resolve(false)) - }) -} - -/** List available provers */ -let listProvers = (): Js.Promise2.t> => { - Js.Promise2.resolve(provers) -} - -/** Solve a problem using the LeanTool API */ -let solve = ( - config: Prover.proverConfig, - problem: Prover.problem, - ~proverId: string="lean4", -): Js.Promise2.t => { - let startTime = Js.Date.now() - let endpoint = resolveEndpoint(config) - let apiKey = resolveApiKey(config) - - let model = if proverId == "lean4-mathlib" { "lean4-mathlib" } else { "lean4" } - - let requestBody = Js.Json.object_(Js.Dict.fromArray([ - ("model", Js.Json.string(model)), - ("messages", Js.Json.array([ - Js.Json.object_(Js.Dict.fromArray([ - ("role", Js.Json.string("system")), - ("content", Js.Json.string("You are a Lean 4 theorem prover. Verify the given Lean code and report whether it type-checks successfully.")), - ])), - Js.Json.object_(Js.Dict.fromArray([ - ("role", Js.Json.string("user")), - ("content", Js.Json.string(problem.content)), - ])), - ])), - ("temperature", Js.Json.number(0.0)), - ("max_tokens", Js.Json.number(2048.0)), - ])) - - let headers = Js.Dict.empty() - if Js.String2.length(apiKey) > 0 { - Js.Dict.set(headers, "Authorization", `Bearer ${apiKey}`) - } - - Http.postJSON( - `${endpoint}/chat/completions`, - requestBody, - ~headers, - ~options={ - maxRetries: config.retry_count, - baseDelayMs: config.retry_delay_ms, - maxDelayMs: 16000, - }, - ) - ->Js.Promise2.then(json => { - // Extract output from response choices[0].message.content - let output = switch Js.Json.decodeObject(json) { - | Some(obj) => - switch Js.Dict.get(obj, "choices") { - | Some(choices) => - switch Js.Json.decodeArray(choices) { - | Some(arr) if Belt.Array.length(arr) > 0 => - switch Js.Json.decodeObject(arr[0]) { - | Some(choice) => - switch Js.Dict.get(choice, "message") { - | Some(msg) => - switch Js.Json.decodeObject(msg) { - | Some(msgObj) => - switch Js.Dict.get(msgObj, "content") { - | Some(c) => Belt.Option.getWithDefault(Js.Json.decodeString(c), "") - | None => "" - } - | None => "" - } - | None => "" - } - | None => "" - } - | _ => "" - } - | None => "" - } - | None => "" - } - - let parsed = parseLeanOutput(output) - - Js.Promise2.resolve({ - Prover.prover: proverId, - status: parsed.status, - proof: parsed.proof, - model: None, - time_ms: Js.Date.now() -. startTime, - raw_output: Some(output), - error: parsed.error, - timestamp: Js.Date.make(), - }) - }) - ->Js.Promise2.catch(err => { - Js.Promise2.resolve({ - Prover.prover: proverId, - status: Prover.Error, - proof: None, - model: None, - time_ms: Js.Date.now() -. startTime, - raw_output: None, - error: Some(Js.String.make(err)), - timestamp: Js.Date.make(), - }) - }) -} - -/** Check a Lean theorem (convenience wrapper) */ -let checkTheorem = (config: Prover.proverConfig, code: string): Js.Promise2.t => { - solve(config, { - id: randomUUID(), - name: None, - format: Prover.Lean, - content: code, - expected: None, - timeout_sec: None, - metadata: None, - }, ~proverId="lean4") -} - -/** Check with Mathlib imports (convenience wrapper) */ -let checkWithMathlib = (config: Prover.proverConfig, code: string): Js.Promise2.t => { - solve(config, { - id: randomUUID(), - name: None, - format: Prover.Lean, - content: code, - expected: None, - timeout_sec: None, - metadata: None, - }, ~proverId="lean4-mathlib") -} diff --git a/src/provers/clients/Metamath.res b/src/provers/clients/Metamath.res deleted file mode 100644 index 963ac652..00000000 --- a/src/provers/clients/Metamath.res +++ /dev/null @@ -1,327 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) - -/** - * ECHIDNA Metamath Client - * Metamath proof verification and exploration. - * Uses metamath.js concepts ported to Deno/ReScript. - */ - -/** Metamath databases available online */ -let metamathDatabases: Js.Dict.t = Js.Dict.fromArray([ - ("set.mm", "https://raw.githubusercontent.com/metamath/set.mm/develop/set.mm"), - ("iset.mm", "https://raw.githubusercontent.com/metamath/set.mm/develop/iset.mm"), - ("hol.mm", "https://raw.githubusercontent.com/metamath/set.mm/develop/hol.mm"), -]) - -/** Metamath token types */ -type tokenType = Constant | Variable | Label | Keyword - -/** A single token from Metamath source */ -type token = { - tokenType: tokenType, - value: string, - line: int, - col: int, -} - -/** Metamath statement types */ -type stmtType = Axiom | Provable | Essential | Floating - -/** Simple Metamath statement */ -type mmStatement = { - label: string, - stmtType: stmtType, - symbols: array, - proof: option>, -} - -/** Metamath database (parsed) */ -type mmDatabase = { - constants: Belt.Set.String.t, - variables: Belt.Set.String.t, - statements: Belt.Map.String.t, - axioms: array, - theorems: array, -} - -/** Tokenize Metamath source into token array */ -let tokenize = (source: string): array => { - let tokens = [] - let lines = Js.String2.split(source, "\n") - let keywords = Belt.Set.String.fromArray([ - "$c", "$v", "$f", "$e", "$a", "$p", "$d", "$=", "$.", "${", "$}", - ]) - - lines->Belt.Array.forEachWithIndex((lineNum, line) => { - // Skip comment lines - if !Js.String2.includes(line, "$(") { - let parts = Js.String2.split(Js.String2.trim(line), " ") - ->Belt.Array.keep(p => Js.String2.length(p) > 0) - - let col = ref(0) - parts->Belt.Array.forEach(part => { - if !(Js.String2.startsWith(part, "$(") || Js.String2.endsWith(part, "$)")) { - let tType = if Belt.Set.String.has(keywords, part) { - Keyword - } else if Js.Re.test_(%re("/^[a-zA-Z0-9_.-]+$/"), part) { - Label - } else { - Constant - } - - let _ = Js.Array2.push(tokens, { - tokenType: tType, - value: part, - line: lineNum, - col: col.contents, - }) - col := col.contents + Js.String2.length(part) + 1 - } - }) - } - }) - - tokens -} - -/** Parse Metamath source into database structure */ -let parseMetamath = (source: string): mmDatabase => { - let constants = ref(Belt.Set.String.empty) - let variables = ref(Belt.Set.String.empty) - let statements = ref(Belt.Map.String.empty) - let axioms = [] - let theorems = [] - - let tokens = tokenize(source) - let i = ref(0) - let len = Belt.Array.length(tokens) - - while i.contents < len { - let tok = tokens[i.contents] - - if tok.value == "$c" { - // Constant declaration - i := i.contents + 1 - while i.contents < len && tokens[i.contents].value != "$." { - constants := Belt.Set.String.add(constants.contents, tokens[i.contents].value) - i := i.contents + 1 - } - } else if tok.value == "$v" { - // Variable declaration - i := i.contents + 1 - while i.contents < len && tokens[i.contents].value != "$." { - variables := Belt.Set.String.add(variables.contents, tokens[i.contents].value) - i := i.contents + 1 - } - } else if tok.tokenType == Label { - let label = tok.value - i := i.contents + 1 - - if i.contents < len { - let stmtTypeStr = tokens[i.contents].value - let stmtType = switch stmtTypeStr { - | "$a" => Some(Axiom) - | "$p" => Some(Provable) - | "$e" => Some(Essential) - | "$f" => Some(Floating) - | _ => None - } - - switch stmtType { - | Some(st) => { - i := i.contents + 1 - let symbols = [] - let proof = [] - let inProof = ref(false) - - while i.contents < len && tokens[i.contents].value != "$." { - if tokens[i.contents].value == "$=" { - inProof := true - } else if inProof.contents { - let _ = Js.Array2.push(proof, tokens[i.contents].value) - } else { - let _ = Js.Array2.push(symbols, tokens[i.contents].value) - } - i := i.contents + 1 - } - - let stmt: mmStatement = { - label, - stmtType: st, - symbols, - proof: if Belt.Array.length(proof) > 0 { Some(proof) } else { None }, - } - - statements := Belt.Map.String.set(statements.contents, label, stmt) - - if st == Axiom { - let _ = Js.Array2.push(axioms, label) - } - if st == Provable { - let _ = Js.Array2.push(theorems, label) - } - } - | None => () - } - } - } - - i := i.contents + 1 - } - - { - constants: constants.contents, - variables: variables.contents, - statements: statements.contents, - axioms, - theorems, - } -} - -/** Verify a proof step (simplified - returns valid for basic structure check) */ -let verifyProofStep = ( - _db: mmDatabase, - _theorem: string, - _proof: array, -): (bool, option) => { - // Simplified verification - full implementation would need stack-based RPN - (true, None) -} - -/** Client name identifier */ -let name = "Metamath" - -/** Prover definitions for this client */ -let provers: array = [ - { - id: "metamath-verify", - name: "Metamath Verifier", - version: None, - formats: [Prover.Metamath], - endpoint: None, - tier: 2, - online: true, - }, -] - -/** Ping the Metamath service (checks if set.mm is accessible) */ -let ping = (): Js.Promise2.t => { - switch Js.Dict.get(metamathDatabases, "set.mm") { - | Some(url) => - Http.fetchWithRetry(url, ~init=Some({"method": "HEAD"})) - ->Js.Promise2.then(resp => Js.Promise2.resolve(resp.ok)) - ->Js.Promise2.catch(_ => Js.Promise2.resolve(false)) - | None => Js.Promise2.resolve(false) - } -} - -/** List available provers */ -let listProvers = (): Js.Promise2.t> => { - Js.Promise2.resolve(provers) -} - -/** Solve a problem by parsing and verifying Metamath source */ -let solve = ( - problem: Prover.problem, - ~_prover: option=?, -): Js.Promise2.t => { - let startTime = Js.Date.now() - - // Parse the problem as Metamath source - let db = parseMetamath(problem.content) - let theoremLabels = db.theorems - - if Belt.Array.length(theoremLabels) == 0 { - Js.Promise2.resolve({ - Prover.prover: "metamath-verify", - status: Prover.Unknown, - proof: None, - model: None, - time_ms: Js.Date.now() -. startTime, - raw_output: None, - error: Some("No theorems ($p statements) found in input"), - timestamp: Js.Date.make(), - }) - } else { - // Verify each theorem - let results = theoremLabels->Belt.Array.map(label => { - let stmt = Belt.Map.String.get(db.statements, label) - let proof = switch stmt { - | Some(s) => Belt.Option.getWithDefault(s.proof, []) - | None => [] - } - let (valid, error) = verifyProofStep(db, label, proof) - (label, valid, error) - }) - - let allValid = results->Belt.Array.every(((_, valid, _)) => valid) - let status: Prover.proverStatus = if allValid { Prover.Theorem } else { Prover.Error } - - let errorMsg = if allValid { - None - } else { - let failedMsgs = results - ->Belt.Array.keep(((_, valid, _)) => !valid) - ->Belt.Array.map(((label, _, err)) => { - `${label}: ${Belt.Option.getWithDefault(err, "unknown error")}` - }) - ->Js.Array2.joinWith("; ") - Some(failedMsgs) - } - - Js.Promise2.resolve({ - Prover.prover: "metamath-verify", - status, - proof: if allValid { - Some(`Verified ${Belt.Int.toString(Belt.Array.length(theoremLabels))} theorem(s)`) - } else { - None - }, - model: None, - time_ms: Js.Date.now() -. startTime, - raw_output: Some(Js.Json.stringify(Js.Json.string("verification results"))), - error: errorMsg, - timestamp: Js.Date.make(), - }) - } -} - -/** Load a Metamath database by name */ -let loadDatabase = (dbName: string): Js.Promise2.t => { - switch Js.Dict.get(metamathDatabases, dbName) { - | Some(url) => - Js.log(`[Metamath] Loading database: ${dbName}`) - Http.getText(url) - ->Js.Promise2.then(source => { - let db = parseMetamath(source) - Js.log(`[Metamath] Loaded ${dbName}: ${Belt.Int.toString(Belt.Array.length(db.axioms))} axioms, ${Belt.Int.toString(Belt.Array.length(db.theorems))} theorems`) - Js.Promise2.resolve(db) - }) - | None => - Js.Promise2.reject(Js.Exn.raiseError(`Unknown database: ${dbName}`)) - } -} - -/** Search for a theorem by regex pattern in a loaded database */ -let searchTheorem = ( - db: mmDatabase, - pattern: string, -): array => { - let regex = Js.Re.fromStringWithFlags(pattern, ~flags="i") - Belt.Map.String.toArray(db.statements) - ->Belt.Array.keep(((label, stmt)) => { - Js.Re.test_(regex, label) || - stmt.symbols->Belt.Array.some(s => Js.Re.test_(regex, s)) - }) - ->Belt.Array.map(((label, _)) => label) - ->Belt.Array.slice(~offset=0, ~len=100) -} - -/** Get theorem details from a loaded database */ -let getTheorem = ( - db: mmDatabase, - label: string, -): option => { - Belt.Map.String.get(db.statements, label) -} diff --git a/src/provers/clients/SystemOnTptp.res b/src/provers/clients/SystemOnTptp.res deleted file mode 100644 index d9c79d88..00000000 --- a/src/provers/clients/SystemOnTptp.res +++ /dev/null @@ -1,172 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) - -/** - * ECHIDNA SystemOnTPTP Client - * Connects to TPTP.org's SystemOnTPTP service (40+ theorem provers). - */ - -/** SystemOnTPTP service URLs */ -let systemOnTptpUrl = "https://www.tptp.org/cgi-bin/SystemOnTPTP" -let systemOnTptpForm = "https://www.tptp.org/cgi-bin/SystemOnTPTPFormReply" - -/** Available provers on SystemOnTPTP */ -let tptpProvers: array = [ - // First-order theorem provers - {id: "Vampire---4.8", name: "Vampire 4.8", version: None, formats: [Prover.TPTP], endpoint: None, tier: 1, online: true}, - {id: "E---3.0", name: "E 3.0", version: None, formats: [Prover.TPTP], endpoint: None, tier: 1, online: true}, - {id: "iProver---3.8", name: "iProver 3.8", version: None, formats: [Prover.TPTP], endpoint: None, tier: 1, online: true}, - {id: "SPASS---3.9", name: "SPASS 3.9", version: None, formats: [Prover.TPTP], endpoint: None, tier: 2, online: true}, - {id: "Prover9---1109a", name: "Prover9", version: None, formats: [Prover.TPTP], endpoint: None, tier: 2, online: true}, - // SMT solvers - {id: "Z3---4.12.2", name: "Z3 4.12.2", version: None, formats: [Prover.TPTP, Prover.SMTLIB2], endpoint: None, tier: 1, online: true}, - {id: "CVC5---1.0.8", name: "CVC5 1.0.8", version: None, formats: [Prover.TPTP, Prover.SMTLIB2], endpoint: None, tier: 1, online: true}, - // Higher-order provers - {id: "Leo-III---1.7", name: "Leo-III 1.7", version: None, formats: [Prover.TPTP], endpoint: None, tier: 2, online: true}, - {id: "Satallax---3.5", name: "Satallax 3.5", version: None, formats: [Prover.TPTP], endpoint: None, tier: 2, online: true}, - {id: "Zipperposition---2.1", name: "Zipperposition 2.1", version: None, formats: [Prover.TPTP], endpoint: None, tier: 2, online: true}, - // Model finders - {id: "Paradox---4.0", name: "Paradox 4.0", version: None, formats: [Prover.TPTP], endpoint: None, tier: 2, online: true}, - {id: "Mace4---0.5", name: "Mace4 0.5", version: None, formats: [Prover.TPTP], endpoint: None, tier: 2, online: true}, - // SAT solvers - {id: "MiniSat---2.2.1", name: "MiniSat 2.2.1", version: None, formats: [Prover.DIMACS], endpoint: None, tier: 1, online: true}, - {id: "Glucose---4.2.1", name: "Glucose 4.2.1", version: None, formats: [Prover.DIMACS], endpoint: None, tier: 1, online: true}, - // Proof assistants (limited automation) - {id: "Isabelle---2024", name: "Isabelle 2024", version: None, formats: [Prover.TPTP], endpoint: None, tier: 2, online: true}, -] - -/** Parse SZS status from TPTP output string */ -let parseSZSStatus = (output: string): Prover.proverStatus => { - let statusMatch = Js.String2.match_(output, %re("/SZS status (\\w+)/")) - switch statusMatch { - | Some(matches) if Belt.Array.length(matches) > 1 => - switch Js.Nullable.toOption(matches[1]) { - | Some(status) => { - let lower = Js.String2.toLowerCase(status) - switch lower { - | "theorem" => Prover.Theorem - | "unsatisfiable" => Prover.Unsatisfiable - | "satisfiable" => Prover.Satisfiable - | "countersatisfiable" => Prover.Countersatisfiable - | "timeout" | "resourceout" => Prover.Timeout - | "gaveup" | "unknown" => Prover.Unknown - | "error" => Prover.Error - | _ => Prover.Unknown - } - } - | None => Prover.Unknown - } - | _ => Prover.Unknown - } -} - -/** Parse timing from TPTP output */ -let parseTime = (output: string): float => { - let timeMatch = Js.String2.match_(output, %re("/(\\d+\\.?\\d*)\\s*s(?:econds?)?/i")) - switch timeMatch { - | Some(matches) if Belt.Array.length(matches) > 1 => - switch Js.Nullable.toOption(matches[1]) { - | Some(timeStr) => Belt.Float.fromString(timeStr)->Belt.Option.getWithDefault(0.0) *. 1000.0 - | None => 0.0 - } - | _ => 0.0 - } -} - -/** Extract proof from SZS output block */ -let extractProof = (output: string): option => { - let proofMatch = Js.String2.match_(output, %re("/SZS output start[\\s\\S]*?SZS output end/")) - switch proofMatch { - | Some(matches) if Belt.Array.length(matches) > 0 => - Js.Nullable.toOption(matches[0]) - | _ => None - } -} - -/** Client name identifier */ -let name = "SystemOnTPTP" - -/** Ping the SystemOnTPTP service */ -let ping = (): Js.Promise2.t => { - Http.getText(systemOnTptpUrl) - ->Js.Promise2.then(response => { - Js.Promise2.resolve(Js.String2.includes(response, "SystemOnTPTP")) - }) - ->Js.Promise2.catch(_ => Js.Promise2.resolve(false)) -} - -/** List available provers */ -let listProvers = (): Js.Promise2.t> => { - Js.Promise2.resolve(tptpProvers) -} - -/** Solve a problem using SystemOnTPTP */ -let solve = ( - config: Prover.proverConfig, - problem: Prover.problem, - ~proverId: string="Vampire---4.8", -): Js.Promise2.t => { - let startTime = Js.Date.now() - let timeout = Belt.Option.getWithDefault(problem.timeout_sec, config.timeout_sec) - - let formData = Js.Dict.fromArray([ - ("TPTPProblem", ""), - ("ProblemSource", "FORMULAE"), - ("FORMULAEProblem", problem.content), - ("QuietFlag", "-q2"), - ("SubmitButton", "RunSelectedSystems"), - (`System___${proverId}`, proverId), - (`TimeLimit___${proverId}`, Belt.Int.toString(timeout)), - ]) - - Http.postForm(systemOnTptpForm, formData, ~options={ - maxRetries: config.retry_count, - baseDelayMs: config.retry_delay_ms, - maxDelayMs: 16000, - }) - ->Js.Promise2.then(response => { - let status = parseSZSStatus(response) - let proof = extractProof(response) - let elapsed = Js.Date.now() -. startTime - let parsedTime = parseTime(response) - - Js.Promise2.resolve({ - Prover.prover: proverId, - status, - proof, - model: None, - time_ms: if parsedTime > 0.0 { parsedTime } else { elapsed }, - raw_output: Some(response), - error: None, - timestamp: Js.Date.make(), - }) - }) - ->Js.Promise2.catch(err => { - Js.Promise2.resolve({ - Prover.prover: proverId, - status: Prover.Error, - proof: None, - model: None, - time_ms: Js.Date.now() -. startTime, - raw_output: None, - error: Some(Js.String.make(err)), - timestamp: Js.Date.make(), - }) - }) -} - -/** Solve with multiple provers in parallel */ -let solveMultiple = ( - config: Prover.proverConfig, - problem: Prover.problem, - ~provers: option>=?, -): Js.Promise2.t> => { - let targetProvers = switch provers { - | Some(ps) => ps - | None => tptpProvers->Belt.Array.map(p => p.id) - } - - targetProvers - ->Belt.Array.map(p => solve(config, problem, ~proverId=p)) - ->Js.Promise2.all -} diff --git a/src/provers/clients/Unified.res b/src/provers/clients/Unified.res deleted file mode 100644 index 1a5c4b3f..00000000 --- a/src/provers/clients/Unified.res +++ /dev/null @@ -1,339 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) - -/** - * ECHIDNA Unified Prover Client - * Aggregates all prover backends into a single interface. - */ - -/** Prover selection strategy */ -type selectionStrategy = - | First - | Fastest - | All - | Cascade - | Parallel - -/** Result from unified solving */ -type unifiedResult = { - problem: Prover.problem, - results: array, - bestResult: option, - strategy: selectionStrategy, - totalTime_ms: float, -} - -/** Service health status */ -type serviceHealth = { - name: string, - available: bool, - latency_ms: option, - provers: int, - lastCheck: Js.Date.t, -} - -/** Client backend entry */ -type clientBackend = { - name: string, - provers: array, - ping: unit => Js.Promise2.t, - solve: (Prover.proverConfig, Prover.problem, ~proverId: string) => Js.Promise2.t, -} - -/** Client name identifier */ -let name = "ECHIDNA-Unified" - -/** Initialize all client backends and collect their provers */ -let makeBackends = (config: Prover.proverConfig): array => { - [ - { - name: SystemOnTptp.name, - provers: SystemOnTptp.tptpProvers, - ping: SystemOnTptp.ping, - solve: (cfg, prob, ~proverId) => SystemOnTptp.solve(cfg, prob, ~proverId), - }, - { - name: Metamath.name, - provers: Metamath.provers, - ping: Metamath.ping, - solve: (cfg, prob, ~proverId as _) => Metamath.solve(prob), - }, - { - name: Z3Wasm.fallbackName, - provers: Z3Wasm.fallbackProvers, - ping: Z3Wasm.fallbackPing, - solve: (cfg, prob, ~proverId) => Z3Wasm.fallbackSolve(cfg, prob, ~proverId=Some(proverId)), - }, - { - name: Wolfram.name, - provers: Wolfram.provers, - ping: () => Wolfram.ping(config), - solve: (cfg, prob, ~proverId) => Wolfram.solve(cfg, prob, ~proverId), - }, - { - name: LeanTool.name, - provers: LeanTool.provers, - ping: () => LeanTool.ping(config), - solve: (cfg, prob, ~proverId) => LeanTool.solve(cfg, prob, ~proverId), - }, - ] -} - -/** Build a prover-to-backend mapping */ -let buildProverMap = (backends: array): Js.Dict.t => { - let map = Js.Dict.empty() - backends->Belt.Array.forEach(backend => { - backend.provers->Belt.Array.forEach(p => { - Js.Dict.set(map, p.id, backend) - }) - }) - map -} - -/** Collect all provers from all backends */ -let allProvers = (backends: array): array => { - backends->Belt.Array.flatMap(b => b.provers) -} - -/** Check if status indicates success */ -let isSuccessful = (status: Prover.proverStatus): bool => { - switch status { - | Prover.Theorem | Prover.Unsatisfiable | Prover.Satisfiable => true - | _ => false - } -} - -/** Ping at least one backend */ -let ping = (backends: array): Js.Promise2.t => { - backends - ->Belt.Array.map(b => b.ping()) - ->Js.Promise2.all - ->Js.Promise2.then(results => { - Js.Promise2.resolve(results->Belt.Array.some(ok => ok)) - }) -} - -/** List all provers from all backends */ -let listProvers = (backends: array): Js.Promise2.t> => { - Js.Promise2.resolve(allProvers(backends)) -} - -/** Check health of all services */ -let healthCheck = (backends: array): Js.Promise2.t> => { - backends - ->Belt.Array.map(backend => { - let start = Js.Date.now() - backend.ping() - ->Js.Promise2.then(available => { - Js.Promise2.resolve({ - name: backend.name, - available, - latency_ms: Some(Js.Date.now() -. start), - provers: Belt.Array.length(backend.provers), - lastCheck: Js.Date.make(), - }) - }) - ->Js.Promise2.catch(_ => { - Js.Promise2.resolve({ - name: backend.name, - available: false, - latency_ms: None, - provers: Belt.Array.length(backend.provers), - lastCheck: Js.Date.make(), - }) - }) - }) - ->Js.Promise2.all -} - -/** Solve a single problem, optionally specifying a prover */ -let solve = ( - config: Prover.proverConfig, - backends: array, - problem: Prover.problem, - ~proverId: option=?, -): Js.Promise2.t => { - let proverMap = buildProverMap(backends) - - switch proverId { - | Some(pid) => - switch Js.Dict.get(proverMap, pid) { - | Some(backend) => backend.solve(config, problem, ~proverId=pid) - | None => - Js.Promise2.resolve({ - Prover.prover: pid, - status: Prover.Error, - proof: None, - model: None, - time_ms: 0.0, - raw_output: None, - error: Some(`Unknown prover: ${pid}`), - timestamp: Js.Date.make(), - }) - } - | None => { - // Select based on format - let formatClients = switch problem.format { - | Prover.TPTP => ["SystemOnTPTP"] - | Prover.SMTLIB2 => ["Z3-Fallback", "SystemOnTPTP"] - | Prover.Metamath => ["Metamath"] - | Prover.Lean => ["LeanTool"] - | Prover.Wolfram | Prover.Natural => ["WolframAlpha"] - | Prover.DIMACS => ["SystemOnTPTP"] - } - - let selectedBackend = formatClients->Belt.Array.reduce(None, (acc, clientName) => { - switch acc { - | Some(_) => acc - | None => backends->Belt.Array.getBy(b => b.name == clientName) - } - }) - - switch selectedBackend { - | Some(backend) => - let defaultProver = switch Belt.Array.get(backend.provers, 0) { - | Some(p) => p.id - | None => "unknown" - } - backend.solve(config, problem, ~proverId=defaultProver) - | None => - switch Belt.Array.get(backends, 0) { - | Some(backend) => - let pid = switch Belt.Array.get(backend.provers, 0) { - | Some(p) => p.id - | None => "unknown" - } - backend.solve(config, problem, ~proverId=pid) - | None => - Js.Promise2.resolve({ - Prover.prover: "unknown", - status: Prover.Error, - proof: None, - model: None, - time_ms: 0.0, - raw_output: None, - error: Some(`No client available for format`), - timestamp: Js.Date.make(), - }) - } - } - } - } -} - -/** Select appropriate provers for a problem based on its format */ -let selectProversForProblem = (problem: Prover.problem): array => { - switch problem.format { - | Prover.TPTP => ["Vampire---4.8", "E---3.0", "Z3---4.12.2", "CVC5---1.0.8"] - | Prover.SMTLIB2 => ["z3-wasm", "Z3---4.12.2", "CVC5---1.0.8"] - | Prover.Metamath => ["metamath-verify"] - | Prover.Lean => ["lean4", "lean4-mathlib"] - | Prover.Wolfram => ["wolfram-prove", "wolfram-solve"] - | Prover.Natural => ["wolfram-prove"] - | Prover.DIMACS => ["MiniSat---2.2.1", "Glucose---4.2.1"] - } -} - -/** Solve with a specified strategy */ -let solveWithStrategy = ( - config: Prover.proverConfig, - backends: array, - problem: Prover.problem, - ~strategy: selectionStrategy=Cascade, - ~provers: option>=?, -): Js.Promise2.t => { - let startTime = Js.Date.now() - let targetProvers = switch provers { - | Some(ps) => ps - | None => selectProversForProblem(problem) - } - - switch strategy { - | First => { - let pid = switch Belt.Array.get(targetProvers, 0) { - | Some(p) => p - | None => "unknown" - } - solve(config, backends, problem, ~proverId=Some(pid)) - ->Js.Promise2.then(result => { - Js.Promise2.resolve({ - problem, - results: [result], - bestResult: Some(result), - strategy: First, - totalTime_ms: Js.Date.now() -. startTime, - }) - }) - } - - | Cascade => { - let rec tryNext = (remaining: array, acc: array): Js.Promise2.t => { - switch Belt.Array.get(remaining, 0) { - | None => - Js.Promise2.resolve({ - problem, - results: acc, - bestResult: None, - strategy: Cascade, - totalTime_ms: Js.Date.now() -. startTime, - }) - | Some(pid) => - solve(config, backends, problem, ~proverId=Some(pid)) - ->Js.Promise2.then(result => { - let newAcc = Belt.Array.concat(acc, [result]) - if isSuccessful(result.status) { - Js.Promise2.resolve({ - problem, - results: newAcc, - bestResult: Some(result), - strategy: Cascade, - totalTime_ms: Js.Date.now() -. startTime, - }) - } else { - tryNext(Belt.Array.sliceToEnd(remaining, 1), newAcc) - } - }) - } - } - tryNext(targetProvers, []) - } - - | Parallel | All | Fastest => { - targetProvers - ->Belt.Array.map(pid => solve(config, backends, problem, ~proverId=Some(pid))) - ->Js.Promise2.all - ->Js.Promise2.then(results => { - let successful = results->Belt.Array.keep(r => isSuccessful(r.status)) - let bestResult = if Belt.Array.length(successful) > 0 { - successful->Belt.Array.reduce(None, (acc, r) => { - switch acc { - | None => Some(r) - | Some(best) => if r.time_ms < best.time_ms { Some(r) } else { acc } - } - }) - } else { - Belt.Array.get(results, 0) - } - - Js.Promise2.resolve({ - problem, - results, - bestResult, - strategy, - totalTime_ms: Js.Date.now() -. startTime, - }) - }) - } - } -} - -/** Get statistics about available provers and backends */ -let getStats = (backends: array): { - "totalProvers": int, - "backends": int, -} => { - { - "totalProvers": allProvers(backends)->Belt.Array.length, - "backends": Belt.Array.length(backends), - } -} diff --git a/src/provers/clients/UnifiedTest.res b/src/provers/clients/UnifiedTest.res deleted file mode 100644 index 57df1bdc..00000000 --- a/src/provers/clients/UnifiedTest.res +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) - -/** - * ECHIDNA Unified Prover Client Tests - * Validates the unified client initialization, prover listing, - * statistics, and basic solving capabilities. - */ - -/** Test: Unified client initialization */ -let testInitialization = () => { - let config = Prover.defaultConfig - let backends = Unified.makeBackends(config) - let provers = Unified.allProvers(backends) - - assert(Unified.name == "ECHIDNA-Unified") - assert(Belt.Array.length(provers) > 0) - Js.log("[UnifiedTest] initialization: PASS") -} - -/** Test: listProvers returns non-empty array */ -let testListProvers = () => { - let config = Prover.defaultConfig - let backends = Unified.makeBackends(config) - - Unified.listProvers(backends) - ->Js.Promise2.then(provers => { - assert(Belt.Array.length(provers) > 0) - - let ids = provers->Belt.Array.map(p => p.Prover.id) - let hasExpected = - ids->Belt.Array.some(id => id == "Vampire---4.8") || - ids->Belt.Array.some(id => id == "z3-wasm") - assert(hasExpected) - - Js.log("[UnifiedTest] listProvers: PASS") - Js.Promise2.resolve() - }) -} - -/** Test: getStats returns valid statistics */ -let testGetStats = () => { - let config = Prover.defaultConfig - let backends = Unified.makeBackends(config) - let stats = Unified.getStats(backends) - - assert(stats["totalProvers"] > 0) - assert(stats["backends"] > 0) - Js.log("[UnifiedTest] getStats: PASS") -} - -/** Run all tests */ -let runAll = () => { - Js.log("=== ECHIDNA Unified Prover Client Tests ===") - testInitialization() - let _ = testListProvers() - testGetStats() - Js.log("=== All unified client tests passed ===") -} - -let _ = runAll() diff --git a/src/provers/clients/Wolfram.res b/src/provers/clients/Wolfram.res deleted file mode 100644 index 19e3cc95..00000000 --- a/src/provers/clients/Wolfram.res +++ /dev/null @@ -1,295 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) - -/** - * ECHIDNA Wolfram Alpha API Client - * Theorem proving and equation solving via Wolfram Alpha. - * Free tier: 2,000 non-commercial API calls per month. - * Get API key at: https://developer.wolframalpha.com/ - */ - -/** Wolfram Alpha API base URL */ -let wolframApiBase = "https://api.wolframalpha.com/v2" - -/** FFI: Deno.env.get */ -@scope(("Deno", "env")) @val -external envGet: string => option = "get" - -/** FFI: crypto.randomUUID */ -@scope("crypto") @val -external randomUUID: unit => string = "randomUUID" - -/** Wolfram subpod image */ -type wolframImage = { - src: string, - alt: string, -} - -/** Wolfram subpod */ -type wolframSubpod = { - title: string, - plaintext: option, - img: option, -} - -/** Wolfram pod */ -type wolframPod = { - title: string, - id: string, - primary: option, - subpods: array, -} - -/** Wolfram query result */ -type wolframQueryResult = { - success: bool, - error: bool, - numpods: int, - pods: option>, - timedout: string, - timing: float, -} - -/** Wolfram API response */ -type wolframResponse = { - queryresult: wolframQueryResult, -} - -/** Proof extraction result */ -type proofContent = { - status: Prover.proverStatus, - proof: option, - model: option, -} - -/** Extract proof-related content from Wolfram response */ -let extractProofContent = (pods: array): proofContent => { - let findPod = (keywords: array): option => { - pods->Belt.Array.getBy(p => { - let lower = Js.String2.toLowerCase(p.title) - keywords->Belt.Array.some(kw => Js.String2.includes(lower, kw)) - }) - } - - let proofPod = findPod(["proof", "derivation", "step"]) - let resultPod = switch pods->Belt.Array.getBy(p => { - let lower = Js.String2.toLowerCase(p.title) - Js.String2.includes(lower, "result") || - Js.String2.includes(lower, "solution") || - Belt.Option.getWithDefault(p.primary, false) - }) { - | Some(p) => Some(p) - | None => None - } - let truthPod = findPod(["truth", "statement"]) - - let status = ref(Prover.Unknown) - let proof = ref(None) - let model = ref(None) - - switch proofPod { - | Some(pod) => { - proof := Some( - pod.subpods - ->Belt.Array.keepMap(s => s.plaintext) - ->Js.Array2.joinWith("\n") - ) - status := Prover.Theorem - } - | None => () - } - - switch truthPod { - | Some(pod) => - switch Belt.Array.get(pod.subpods, 0) { - | Some(sub) => - switch sub.plaintext { - | Some(text) => { - let lower = Js.String2.toLowerCase(text) - if Js.String2.includes(lower, "true") || Js.String2.includes(lower, "valid") { - status := Prover.Theorem - } else if Js.String2.includes(lower, "false") || Js.String2.includes(lower, "invalid") { - status := Prover.Countersatisfiable - } - } - | None => () - } - | None => () - } - | None => () - } - - switch resultPod { - | Some(pod) => { - let modelText = pod.subpods - ->Belt.Array.keepMap(s => s.plaintext) - ->Js.Array2.joinWith("\n") - if Js.String2.length(modelText) > 0 { - model := Some(modelText) - if status.contents == Prover.Unknown { - status := Prover.Satisfiable - } - } - } - | None => () - } - - { - status: status.contents, - proof: proof.contents, - model: model.contents, - } -} - -/** Client name identifier */ -let name = "WolframAlpha" - -/** Prover definitions for this client */ -let provers: array = [ - { - id: "wolfram-prove", - name: "Wolfram Alpha Prover", - version: None, - formats: [Prover.Natural, Prover.Wolfram], - endpoint: None, - tier: 3, - online: true, - }, - { - id: "wolfram-solve", - name: "Wolfram Alpha Solver", - version: None, - formats: [Prover.Natural, Prover.Wolfram], - endpoint: None, - tier: 3, - online: true, - }, -] - -/** Resolve API key from config or environment */ -let resolveApiKey = (config: Prover.proverConfig): string => { - switch config.api_key { - | Some(k) => k - | None => Belt.Option.getWithDefault(envGet("WOLFRAM_APP_ID"), "") - } -} - -/** Ping the Wolfram Alpha service */ -let ping = (config: Prover.proverConfig): Js.Promise2.t => { - let apiKey = resolveApiKey(config) - if Js.String2.length(apiKey) == 0 { - Js.log("[Wolfram] No API key configured (set WOLFRAM_APP_ID)") - Js.Promise2.resolve(false) - } else { - let url = `${wolframApiBase}/query?appid=${apiKey}&input=2%2B2&format=plaintext&output=json` - Http.fetchWithRetry(url) - ->Js.Promise2.then(resp => Http.responseJson(resp)) - ->Js.Promise2.then(_data => Js.Promise2.resolve(true)) - ->Js.Promise2.catch(_ => Js.Promise2.resolve(false)) - } -} - -/** List available provers */ -let listProvers = (): Js.Promise2.t> => { - Js.Promise2.resolve(provers) -} - -/** Solve a problem using Wolfram Alpha */ -let solve = ( - config: Prover.proverConfig, - problem: Prover.problem, - ~proverId: string="wolfram-prove", -): Js.Promise2.t => { - let startTime = Js.Date.now() - let apiKey = resolveApiKey(config) - - if Js.String2.length(apiKey) == 0 { - Js.Promise2.resolve({ - Prover.prover: proverId, - status: Prover.Error, - proof: None, - model: None, - time_ms: Js.Date.now() -. startTime, - raw_output: None, - error: Some("No Wolfram Alpha API key configured. Set WOLFRAM_APP_ID environment variable."), - timestamp: Js.Date.make(), - }) - } else { - let query = if proverId == "wolfram-prove" { - let lower = Js.String2.toLowerCase(problem.content) - if !Js.String2.startsWith(lower, "prove") { - `prove ${problem.content}` - } else { - problem.content - } - } else { - problem.content - } - - let timeout = Belt.Option.getWithDefault(problem.timeout_sec, config.timeout_sec) - let encodedQuery = Js.Global.encodeURIComponent(query) - let url = `${wolframApiBase}/query?appid=${apiKey}&input=${encodedQuery}&format=plaintext&output=json&podtimeout=${Belt.Int.toString(timeout)}` - - Http.fetchWithRetry(url, ~options={ - maxRetries: config.retry_count, - baseDelayMs: config.retry_delay_ms, - maxDelayMs: 16000, - }) - ->Js.Promise2.then(resp => Http.responseJson(resp)) - ->Js.Promise2.then(data => { - // Parse the Wolfram response from JSON - // Note: In production, use a proper JSON decoder - let status = Prover.Unknown - let _ = data - - Js.Promise2.resolve({ - Prover.prover: proverId, - status, - proof: None, - model: None, - time_ms: Js.Date.now() -. startTime, - raw_output: Some(Js.Json.stringify(data)), - error: None, - timestamp: Js.Date.make(), - }) - }) - ->Js.Promise2.catch(err => { - Js.Promise2.resolve({ - Prover.prover: proverId, - status: Prover.Error, - proof: None, - model: None, - time_ms: Js.Date.now() -. startTime, - raw_output: None, - error: Some(Js.String.make(err)), - timestamp: Js.Date.make(), - }) - }) - } -} - -/** Prove a mathematical statement (convenience wrapper) */ -let prove = (config: Prover.proverConfig, statement: string): Js.Promise2.t => { - solve(config, { - id: randomUUID(), - name: None, - format: Prover.Natural, - content: statement, - expected: None, - timeout_sec: None, - metadata: None, - }, ~proverId="wolfram-prove") -} - -/** Solve an equation or system (convenience wrapper) */ -let equation = (config: Prover.proverConfig, eq: string): Js.Promise2.t => { - solve(config, { - id: randomUUID(), - name: None, - format: Prover.Natural, - content: `solve ${eq}`, - expected: None, - timeout_sec: None, - metadata: None, - }, ~proverId="wolfram-solve") -} diff --git a/src/provers/clients/Z3Wasm.res b/src/provers/clients/Z3Wasm.res deleted file mode 100644 index e1d3181b..00000000 --- a/src/provers/clients/Z3Wasm.res +++ /dev/null @@ -1,197 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) - -/** - * ECHIDNA Z3 WASM Client - * Z3 SMT Solver via WebAssembly (Deno-compatible). - * Uses esm.sh CDN for Deno-compatible ES modules without npm. - */ - -/** Z3 WASM CDN URL */ -let z3WasmUrl = "https://esm.sh/z3-solver@4.12.4" - -/** Z3 solver check result type */ -type z3CheckResult = | @as("sat") Sat | @as("unsat") Unsat | @as("unknown") Z3Unknown - -/** Minimal Z3 solver interface for FFI */ -type z3Solver -type z3Model -type z3Context - -/** FFI: Dynamic import for Z3 WASM module */ -@val external importModule: string => Js.Promise2.t<{..}> = "import" - -/** FFI: setTimeout */ -@val external setTimeout: (unit => unit, int) => int = "setTimeout" - -/** Parse SMT-LIB2 result status to prover status */ -let parseSMTStatus = (result: string): Prover.proverStatus => { - switch result { - | "sat" => Prover.Satisfiable - | "unsat" => Prover.Unsatisfiable - | _ => Prover.Unknown - } -} - -/** Z3 WASM Client name */ -let wasmName = "Z3-WASM" - -/** Z3 WASM prover definitions */ -let wasmProvers: array = [ - { - id: "z3-wasm", - name: "Z3 WASM", - version: Some("4.12.4"), - formats: [Prover.SMTLIB2], - endpoint: None, - tier: 1, - online: false, // Local WASM execution - }, -] - -/** Ping the Z3 WASM service (attempts to load WASM module) */ -let wasmPing = (): Js.Promise2.t => { - importModule(z3WasmUrl) - ->Js.Promise2.then(_ => Js.Promise2.resolve(true)) - ->Js.Promise2.catch(_ => Js.Promise2.resolve(false)) -} - -/** List available WASM provers */ -let wasmListProvers = (): Js.Promise2.t> => { - Js.Promise2.resolve(wasmProvers) -} - -/** Solve a problem using Z3 WASM. - * Loads Z3 module, creates context/solver, parses SMT-LIB2 input, - * races against a timeout, and returns the result. - */ -let wasmSolve = ( - config: Prover.proverConfig, - problem: Prover.problem, - ~_prover: option=?, -): Js.Promise2.t => { - let startTime = Js.Date.now() - - importModule(z3WasmUrl) - ->Js.Promise2.then(z3Module => { - // Note: Full Z3 WASM initialization would go here. - // This is a structural port - the actual Z3 init/solve calls - // depend on the specific JS API shape at runtime. - let _ = z3Module - let _ = problem.content - - let timeoutMs = Belt.Option.getWithDefault(problem.timeout_sec, config.timeout_sec) * 1000 - - // Create a timeout promise - let timeoutPromise = Js.Promise2.make((~resolve, ~reject as _reject) => { - let _ = setTimeout(() => resolve("unknown"), timeoutMs) - }) - - // In a full implementation, we would race solver.check() against the timeout. - // For this structural port, we resolve with unknown. - timeoutPromise->Js.Promise2.then(result => { - let elapsed = Js.Date.now() -. startTime - let status = parseSMTStatus(result) - - Js.Promise2.resolve({ - Prover.prover: "z3-wasm", - status: if result == "unknown" && elapsed >= Belt.Int.toFloat(timeoutMs) { - Prover.Timeout - } else { - status - }, - proof: None, - model: None, - time_ms: elapsed, - raw_output: None, - error: None, - timestamp: Js.Date.make(), - }) - }) - }) - ->Js.Promise2.catch(err => { - Js.Promise2.resolve({ - Prover.prover: "z3-wasm", - status: Prover.Error, - proof: None, - model: None, - time_ms: Js.Date.now() -. startTime, - raw_output: None, - error: Some(Js.String.make(err)), - timestamp: Js.Date.make(), - }) - }) -} - -/** Solve multiple problems in sequence (Z3 WASM is single-threaded) */ -let wasmSolveBatch = ( - config: Prover.proverConfig, - problems: array, -): Js.Promise2.t> => { - problems->Belt.Array.reduce( - Js.Promise2.resolve([]), - (accPromise, problem) => { - accPromise->Js.Promise2.then(acc => { - wasmSolve(config, problem)->Js.Promise2.then(result => { - Js.Promise2.resolve(Belt.Array.concat(acc, [result])) - }) - }) - }, - ) -} - -// --- Z3 Fallback Client --- -// Falls back to SystemOnTPTP's Z3 if WASM fails - -/** Z3 Fallback client name */ -let fallbackName = "Z3-Fallback" - -/** Z3 Fallback prover definitions */ -let fallbackProvers: array = [ - { - id: "z3-online", - name: "Z3 Online", - version: None, - formats: [Prover.SMTLIB2], - endpoint: None, - tier: 1, - online: true, - }, -] - -/** Mutable flag tracking whether WASM failed and we should use TPTP fallback */ -let tptpFallback = ref(false) - -/** Ping for fallback client: tries WASM first, falls back to TPTP */ -let fallbackPing = (): Js.Promise2.t => { - wasmPing() - ->Js.Promise2.then(ok => { - if !ok { - tptpFallback := true - } - Js.Promise2.resolve(true) // Can always fall back to TPTP - }) -} - -/** List fallback provers */ -let fallbackListProvers = (): Js.Promise2.t> => { - Js.Promise2.resolve(fallbackProvers) -} - -/** Solve with fallback: tries WASM first, then SystemOnTPTP Z3 */ -let fallbackSolve = ( - config: Prover.proverConfig, - problem: Prover.problem, - ~proverId: option=?, -): Js.Promise2.t => { - if !tptpFallback.contents { - wasmSolve(config, problem, ~_prover=proverId) - ->Js.Promise2.catch(_ => { - tptpFallback := true - // Fall back to SystemOnTPTP's Z3 - SystemOnTptp.solve(config, problem, ~proverId="Z3---4.12.2") - }) - } else { - SystemOnTptp.solve(config, problem, ~proverId="Z3---4.12.2") - } -} diff --git a/src/provers/runners/Cli.res b/src/provers/runners/Cli.res deleted file mode 100644 index 7eea354b..00000000 --- a/src/provers/runners/Cli.res +++ /dev/null @@ -1,559 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) - -/** - * ECHIDNA Proof Runner CLI - * Command-line interface for running the proof daemon. - * - * Usage: - * deno run --allow-net --allow-read --allow-write --allow-env Cli.res.js [options] - * - * Options: - * --help Show help - * --health Check service health - * --solve Solve a single problem file - * --batch Process all problems in directory - * --daemon Run as continuous daemon - * --format Input format (tptp, smtlib2, metamath, lean) - * --prover Specific prover to use - * --timeout Timeout in seconds (default: 60) - * --strategy Strategy: first, cascade, parallel, all (default: cascade) - * --output Output results to file - */ - -/** FFI: Deno.args */ -@scope("Deno") @val -external denoArgs: array = "args" - -/** FFI: Deno.readTextFile */ -@scope("Deno") @val -external readTextFile: string => promise = "readTextFile" - -/** FFI: Deno.writeTextFile */ -@scope("Deno") @val -external writeTextFile: (string, string) => promise = "writeTextFile" - -/** FFI: Deno.readDir */ -@scope("Deno") @val -external readDir: string => Js.AsyncIterator.t<{"name": string, "isFile": bool}> = "readDir" - -/** FFI: Deno.exit */ -@scope("Deno") @val -external exit: int => unit = "exit" - -/** FFI: Deno.addSignalListener */ -@scope("Deno") @val -external addSignalListener: (string, unit => unit) => unit = "addSignalListener" - -/** FFI: console.log */ -@scope("console") @val -external log: string => unit = "log" - -/** FFI: console.error */ -@scope("console") @val -external error: string => unit = "error" - -/** FFI: JSON.stringify with indent */ -@scope("JSON") @val -external jsonStringify2: ('a, Js.null<'b>, int) => string = "stringify" - -/** FFI: JSON.parse */ -@scope("JSON") @val -external jsonParse: string => 'a = "parse" - -/** FFI: setTimeout as promise */ -let delay = (ms: int): promise => { - Js.Promise2.make((~resolve, ~reject as _) => { - let _ = Js.Global.setTimeout(() => resolve(), ms) - }) -} - -/** Selection strategy for provers */ -type strategy = - | @as("first") First - | @as("cascade") Cascade - | @as("parallel") Parallel - | @as("all") All - -/** CLI arguments parsed from command line */ -type cliArgs = { - mutable help: bool, - mutable health: bool, - mutable solve: option, - mutable batch: option, - mutable daemon: bool, - mutable format: string, - mutable prover: option, - mutable timeout: int, - mutable strategy: string, - mutable output: option, -} - -/** Create default CLI arguments */ -let makeDefaultArgs = (): cliArgs => { - help: false, - health: false, - solve: None, - batch: None, - daemon: false, - format: "tptp", - prover: None, - timeout: 60, - strategy: "cascade", - output: None, -} - -/** Parse command line arguments from Deno.args */ -let parseArgs = (): cliArgs => { - let args = makeDefaultArgs() - let argv = denoArgs - let len = Array.length(argv) - let i = ref(0) - - while i.contents < len { - let arg = argv->Array.getUnsafe(i.contents) - switch arg { - | "--help" | "-h" => args.help = true - | "--health" => args.health = true - | "--solve" => - i := i.contents + 1 - if i.contents < len { - args.solve = Some(argv->Array.getUnsafe(i.contents)) - } - | "--batch" => - i := i.contents + 1 - if i.contents < len { - args.batch = Some(argv->Array.getUnsafe(i.contents)) - } - | "--daemon" => args.daemon = true - | "--format" => - i := i.contents + 1 - if i.contents < len { - args.format = argv->Array.getUnsafe(i.contents) - } - | "--prover" => - i := i.contents + 1 - if i.contents < len { - args.prover = Some(argv->Array.getUnsafe(i.contents)) - } - | "--timeout" => - i := i.contents + 1 - if i.contents < len { - switch Belt.Int.fromString(argv->Array.getUnsafe(i.contents)) { - | Some(t) => args.timeout = t - | None => () - } - } - | "--strategy" => - i := i.contents + 1 - if i.contents < len { - args.strategy = argv->Array.getUnsafe(i.contents) - } - | "--output" => - i := i.contents + 1 - if i.contents < len { - args.output = Some(argv->Array.getUnsafe(i.contents)) - } - | _ => () - } - i := i.contents + 1 - } - - args -} - -/** Print help message to console */ -let printHelp = (): unit => { - log(` -ECHIDNA Proof Runner - Neurosymbolic Theorem Proving Platform - -Usage: - echidna-runner [options] - -Options: - -h, --help Show this help message - --health Check health of all prover services - --solve Solve a single problem from file - --batch Process all problems in directory - --daemon Run as continuous daemon (day and night) - --format Input format: tptp, smtlib2, metamath, lean, wolfram - --prover Use specific prover (e.g., Vampire---4.8, z3-wasm) - --timeout Timeout in seconds (default: 60) - --strategy Selection strategy: - first - Use first available prover - cascade - Try in order until success (default) - parallel - Run all in parallel - all - Run all, return best result - --output Write results to JSON file - -Examples: - # Check service availability - echidna-runner --health - - # Solve a TPTP problem - echidna-runner --solve problem.p --format tptp - - # Solve with specific prover - echidna-runner --solve problem.smt2 --format smtlib2 --prover z3-wasm - - # Run all provers in parallel - echidna-runner --solve problem.p --strategy parallel - - # Process directory of problems - echidna-runner --batch ./problems --format tptp --output results.json - - # Run as continuous daemon - echidna-runner --daemon - -Environment Variables: - WOLFRAM_APP_ID Wolfram Alpha API key - LEANTOOL_API_KEY LeanTool API key - LEANTOOL_ENDPOINT Custom LeanTool endpoint - -Available Provers: - SystemOnTPTP: Vampire, E, Z3, CVC5, SPASS, Prover9, Leo-III, Satallax, etc. - Local: z3-wasm, metamath-verify - APIs: wolfram-prove, wolfram-solve, lean4, lean4-mathlib -`) -} - -/** Separator line for console output */ -let separator = String.make(~count=50, `\u2500`) -let doubleSeparator = String.make(~count=50, `\u2550`) - -/** Check health of all prover services */ -let checkHealth = async (): unit => { - log("Checking ECHIDNA prover service health...\n") - - let client = Unified.makeClient() - let health = await Unified.healthCheck(client) - - log("Service Status:") - log(separator) - - health->Array.forEach(h => { - let status = if h.available { "✓ Online" } else { "✗ Offline" } - let latency = switch h.latencyMs { - | Some(ms) => Belt.Int.toString(ms) ++ "ms" - | None => "N/A" - } - log(` ${Js.String2.padEnd(h.name, 20, " ")} ${Js.String2.padEnd(status, 12, " ")} ${latency} (${Belt.Int.toString(h.provers)} provers)`) - }) - - log(separator) - - let stats = Unified.getStats(client) - log(`\nTotal: ${Belt.Int.toString(stats.totalProvers)} provers across ${Belt.Int.toString(stats.backends)} backends`) - log(`Healthy: ${Belt.Int.toString(stats.healthyBackends)}/${Belt.Int.toString(stats.backends)} backends`) -} - -/** Solve a single problem from a file path */ -let solveSingle = async ( - ~path: string, - ~format: string, - ~prover: option, - ~timeout: option, - ~strategy: string, -): array => { - let content = await readTextFile(path) - - let parts = Js.String2.split(path, "/") - let name = parts->Array.getUnsafe(Array.length(parts) - 1) - - let problem: Prover.problem = { - id: path, - name: Some(name), - format: format, - content: content, - timeoutSec: timeout, - } - - log(`\nSolving: ${path}`) - log(`Format: ${format}`) - switch prover { - | Some(p) => log(`Prover: ${p}`) - | None => () - } - log(`Strategy: ${strategy}`) - log(separator) - - let client = Unified.makeClientWithTimeout(~timeoutSec=Belt.Option.getWithDefault(timeout, 60)) - let proversArr = switch prover { - | Some(p) => Some([p]) - | None => None - } - let result = await Unified.solveWithStrategy(client, ~problem, ~strategy, ~provers=proversArr) - - // Print results - result.results->Array.forEach(r => { - let emoji = switch r.status { - | "theorem" | "unsatisfiable" => "✓" - | "satisfiable" | "countersatisfiable" => "✗" - | "timeout" => "⏱" - | _ => "?" - } - - log(`\n${emoji} ${r.prover}: ${r.status} (${Belt.Int.toString(r.timeMs)}ms)`) - - switch r.proof { - | Some(proof) => - log(" Proof:") - let lines = Js.String2.split(proof, "\n") - let preview = lines->Array.slice(~start=0, ~end=5)->Array.join("\n ") - log(" " ++ preview) - | None => () - } - - switch r.model { - | Some(model) => - log(" Model:") - let lines = Js.String2.split(model, "\n") - let preview = lines->Array.slice(~start=0, ~end=5)->Array.join("\n ") - log(" " ++ preview) - | None => () - } - - switch r.error { - | Some(err) => log(` Error: ${err}`) - | None => () - } - }) - - log(separator) - log(`Total time: ${Belt.Int.toString(result.totalTimeMs)}ms`) - - switch result.bestResult { - | Some(best) => log(`\nBest result: ${best.prover} - ${best.status}`) - | None => () - } - - result.results -} - -/** Process a batch of problems from a directory */ -let processBatch = async ( - ~dir: string, - ~format: string, - ~prover: option, - ~timeout: option, - ~strategy: string, - ~output: option, -): unit => { - let daemon = Daemon.make({ - defaultTimeout: Belt.Option.getWithDefault(timeout, 60), - strategy: strategy, - persistResults: Belt.Option.isSome(output), - storagePath: switch output { - | Some(o) => Js.String2.replaceByRe(o, %re("/\\.json$/"), "") - | None => "./echidna_results" - }, - pollInterval: 1000, - maxConcurrent: 5, - maxRetries: 3, - healthCheckInterval: 60000, - }) - - // File extension mapping by format - let exts = switch format { - | "tptp" => [".p", ".tptp", ".ax"] - | "smtlib2" => [".smt2", ".smt"] - | "metamath" => [".mm"] - | "lean" => [".lean"] - | "dimacs" => [".cnf", ".dimacs"] - | _ => [".p"] - } - - log(`\nScanning ${dir} for ${format} problems...`) - - // Read directory entries and enqueue matching files - let entries = readDir(dir) - let rec loop = async () => { - let next = await Js.AsyncIterator.next(entries) - if !next.done { - switch next.value { - | Some(entry) => - if entry["isFile"] && exts->Array.some(ext => Js.String2.endsWith(entry["name"], ext)) { - let path = `${dir}/${entry["name"]}` - let content = await readTextFile(path) - let problem: Prover.problem = { - id: path, - name: Some(entry["name"]), - format: format, - content: content, - timeoutSec: timeout, - } - let proversArr = switch prover { - | Some(p) => Some([p]) - | None => None - } - Daemon.enqueue(daemon, ~problem, ~provers=proversArr, ~priority=0) - } - await loop() - | None => () - } - } - } - await loop() - - let status = Daemon.getQueueStatus(daemon) - log(`Queued ${Belt.Int.toString(status.pending)} problems\n`) - - if status.pending == 0 { - log("No problems found!") - } else { - // Run until queue is empty - await Daemon.start(daemon) - - // Wait for completion - let rec waitLoop = async () => { - let s = Daemon.getQueueStatus(daemon) - if s.pending > 0 || s.running > 0 { - await delay(1000) - await waitLoop() - } - } - await waitLoop() - - await Daemon.stop(daemon) - - // Print summary - let stats = Daemon.getStats(daemon) - log("\n" ++ doubleSeparator) - log("BATCH PROCESSING COMPLETE") - log(doubleSeparator) - log(`Problems processed: ${Belt.Int.toString(stats.problemsCompleted + stats.problemsFailed)}`) - log(`Proofs found: ${Belt.Int.toString(stats.proofsFound)}`) - log(`Failed: ${Belt.Int.toString(stats.problemsFailed)}`) - log(`Total time: ${Belt.Int.toString(stats.totalTimeMs)}ms`) - } -} - -/** Run as a continuous daemon process */ -let runDaemon = async (): unit => { - let daemon = Daemon.make({ - pollInterval: 1000, - maxConcurrent: 5, - maxRetries: 3, - defaultTimeout: 60, - strategy: "cascade", - persistResults: true, - storagePath: "./echidna_results", - healthCheckInterval: 60000, - }) - - // Add event logging - Daemon.on(daemon, async event => { - switch event { - | Daemon.Started => log("\nECHIDNA Daemon started") - | Daemon.Stopped => log("\nECHIDNA Daemon stopped") - | Daemon.HealthCheck({results}) => - let online = results->Array.filter(r => r.available)->Array.length - log(`\nHealth: ${Belt.Int.toString(online)}/${Belt.Int.toString(Array.length(results))} services online`) - | _ => () - } - }) - - // Handle shutdown signals - let shutdown = () => { - log("\nReceived shutdown signal...") - let _ = Daemon.stop(daemon) - exit(0) - } - - addSignalListener("SIGINT", shutdown) - addSignalListener("SIGTERM", shutdown) - - log(` -+========================================================+ -| ECHIDNA - Neurosymbolic Theorem Proving Daemon | -| Running continuously... Press Ctrl+C to stop | -+========================================================+ -`) - - // Check for initial problems from queue file - try { - let queueFile = "./echidna_queue.json" - let content = await readTextFile(queueFile) - let problems: array = jsonParse(content) - Daemon.enqueueBatch(daemon, problems) - log(`Loaded ${Belt.Int.toString(Array.length(problems))} problems from queue file`) - } catch { - | _ => - log("No queue file found. Add problems via API or queue file.") - log("Create echidna_queue.json with array of Problem objects.") - } - - await Daemon.start(daemon) - - // Keep running until stopped, printing periodic status - let rec statusLoop = async () => { - await delay(10000) - - let stats = Daemon.getStats(daemon) - let queue = Daemon.getQueueStatus(daemon) - - let now = Js.Date.make()->Js.Date.toISOString - - log( - `[${now}] ` ++ - `Queue: ${Belt.Int.toString(queue.pending)} | Running: ${Belt.Int.toString(queue.running)} | ` ++ - `Completed: ${Belt.Int.toString(stats.problemsCompleted)} | Proofs: ${Belt.Int.toString(stats.proofsFound)}` - ) - - await statusLoop() - } - await statusLoop() -} - -/** Main entry point — parses args and dispatches to appropriate handler */ -let main = async (): unit => { - let args = parseArgs() - - if args.help { - printHelp() - } else if args.health { - await checkHealth() - } else { - switch args.solve { - | Some(path) => - let results = await solveSingle( - ~path, - ~format=args.format, - ~prover=args.prover, - ~timeout=Some(args.timeout), - ~strategy=args.strategy, - ) - switch args.output { - | Some(outputPath) => - await writeTextFile(outputPath, jsonStringify2(results, Js.null, 2)) - log(`\nResults written to ${outputPath}`) - | None => () - } - | None => - switch args.batch { - | Some(dir) => - await processBatch( - ~dir, - ~format=args.format, - ~prover=args.prover, - ~timeout=Some(args.timeout), - ~strategy=args.strategy, - ~output=args.output, - ) - | None => - if args.daemon { - await runDaemon() - } else { - printHelp() - } - } - } - } -} - -// Run if this is the main module -let _ = main()->Js.Promise2.catch(err => { - error(`Fatal error: ${Js.String.make(err)}`) - exit(1) - Js.Promise2.resolve() -}) diff --git a/src/provers/runners/Daemon.res b/src/provers/runners/Daemon.res deleted file mode 100644 index 9c251c9e..00000000 --- a/src/provers/runners/Daemon.res +++ /dev/null @@ -1,429 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) - -/** - * ECHIDNA Continuous Proof Runner Daemon - * Runs proof attempts continuously, day and night. - * Manages a priority queue of problems, concurrent solving, - * health checking, retry logic, and result persistence. - */ - -/** FFI: console.log */ -@scope("console") @val -external log: string => unit = "log" - -/** FFI: console.error */ -@scope("console") @val -external consoleError: (string, 'a) => unit = "error" - -/** FFI: Deno.mkdir */ -@scope("Deno") @val -external mkdir: (string, {"recursive": bool}) => promise = "mkdir" - -/** FFI: Deno.writeTextFile */ -@scope("Deno") @val -external writeTextFile: (string, string) => promise = "writeTextFile" - -/** FFI: Deno.readTextFile */ -@scope("Deno") @val -external readTextFile: string => promise = "readTextFile" - -/** FFI: JSON.stringify with indent */ -@scope("JSON") @val -external jsonStringify2: ('a, Js.null<'b>, int) => string = "stringify" - -/** FFI: JSON.parse */ -@scope("JSON") @val -external jsonParse: string => 'a = "parse" - -/** FFI: Date.now */ -@scope("Date") @val -external dateNow: unit => float = "now" - -/** FFI: setTimeout as promise for delays */ -let sleep = (ms: int): promise => { - Js.Promise2.make((~resolve, ~reject as _) => { - let _ = Js.Global.setTimeout(() => resolve(), ms) - }) -} - -/** Daemon configuration */ -type daemonConfig = { - /** Interval between queue checks (ms) */ - pollInterval: int, - /** Maximum concurrent proof attempts */ - maxConcurrent: int, - /** Maximum retries per problem */ - maxRetries: int, - /** Timeout per problem (seconds) */ - defaultTimeout: int, - /** Strategy for prover selection */ - strategy: string, - /** Enable persistent storage */ - persistResults: bool, - /** Results storage path */ - storagePath: string, - /** Health check interval (ms) */ - healthCheckInterval: int, -} - -/** Default daemon configuration */ -let defaultConfig: daemonConfig = { - pollInterval: 1000, - maxConcurrent: 5, - maxRetries: 3, - defaultTimeout: 60, - strategy: "cascade", - persistResults: true, - storagePath: "./echidna_results", - healthCheckInterval: 60000, -} - -/** Daemon statistics */ -type daemonStats = { - started: float, - mutable problemsQueued: int, - mutable problemsCompleted: int, - mutable problemsFailed: int, - mutable proofsFound: int, - mutable totalTimeMs: int, - mutable uptimeMs: float, - mutable currentRunning: int, -} - -/** Queue item wrapping a problem with metadata */ -type queueItem = { - problem: Prover.problem, - provers: array, - priority: int, - created: float, - mutable attempts: int, -} - -/** Health check result entry */ -type healthEntry = { - name: string, - available: bool, -} - -/** Daemon event types for event handlers */ -type daemonEvent = - | Started - | Stopped - | ProblemQueued({problem: Prover.problem}) - | ProblemStarted({problem: Prover.problem}) - | ProblemCompleted({result: Unified.unifiedResult}) - | ProblemFailed({problem: Prover.problem, error: string}) - | HealthCheck({results: array}) - -/** Event handler function type */ -type eventHandler = daemonEvent => promise - -/** Daemon instance state */ -type t = { - config: daemonConfig, - client: Unified.t, - mutable queue: array, - mutable runningCount: int, - results: Js.Dict.t, - stats: daemonStats, - mutable isRunning: bool, - mutable eventHandlers: array, -} - -/** Create a new daemon instance with the given config */ -let make = (config: daemonConfig): t => { - config: config, - client: Unified.makeClientWithTimeout(~timeoutSec=config.defaultTimeout), - queue: [], - runningCount: 0, - results: Js.Dict.empty(), - stats: { - started: dateNow(), - problemsQueued: 0, - problemsCompleted: 0, - problemsFailed: 0, - proofsFound: 0, - totalTimeMs: 0, - uptimeMs: 0.0, - currentRunning: 0, - }, - isRunning: false, - eventHandlers: [], -} - -/** Register an event handler */ -let on = (daemon: t, handler: eventHandler): unit => { - daemon.eventHandlers = Array.concat(daemon.eventHandlers, [handler]) -} - -/** Emit an event to all registered handlers */ -let emit = async (daemon: t, event: daemonEvent): unit => { - let handlers = daemon.eventHandlers - for i in 0 to Array.length(handlers) - 1 { - try { - switch handlers->Array.get(i) { - | Some(handler) => await handler(event) - | None => () - } - } catch { - | exn => consoleError("[Daemon] Event handler error:", exn) - } - } -} - -/** Enqueue a problem for solving */ -let enqueue = (daemon: t, ~problem: Prover.problem, ~provers: option>=?, ~priority: int=0): unit => { - let item: queueItem = { - problem: problem, - provers: Belt.Option.getWithDefault(provers, []), - priority: priority, - created: dateNow(), - attempts: 0, - } - - // Insert by priority (higher priority first) - let idx = daemon.queue->Array.findIndex(q => q.priority < priority) - if idx == -1 { - daemon.queue = Array.concat(daemon.queue, [item]) - } else { - let before = daemon.queue->Array.slice(~start=0, ~end=idx) - let after = daemon.queue->Array.sliceToEnd(~start=idx) - daemon.queue = Array.concatMany([before, [item], after]) - } - - daemon.stats.problemsQueued = daemon.stats.problemsQueued + 1 - let _ = emit(daemon, ProblemQueued({problem: problem})) - - log(`[Daemon] Queued: ${problem.id} (priority: ${Belt.Int.toString(priority)}, queue size: ${Belt.Int.toString(Array.length(daemon.queue))})`) -} - -/** Enqueue multiple problems at once */ -let enqueueBatch = (daemon: t, problems: array): unit => { - problems->Array.forEach(problem => { - enqueue(daemon, ~problem, ~priority=0) - }) -} - -/** Process a single queue item */ -let processItem = async (daemon: t, item: queueItem): unit => { - let _ = await emit(daemon, ProblemStarted({problem: item.problem})) - - try { - let proversOpt = if Array.length(item.provers) > 0 { Some(item.provers) } else { None } - let result = await Unified.solveWithStrategy( - daemon.client, - ~problem=item.problem, - ~strategy=daemon.config.strategy, - ~provers=proversOpt, - ) - - // Store result - Js.Dict.set(daemon.results, item.problem.id, result) - item.attempts = item.attempts + 1 - - // Update stats - daemon.stats.totalTimeMs = daemon.stats.totalTimeMs + result.totalTimeMs - - switch result.bestResult { - | Some(best) => - switch best.status { - | "theorem" | "unsatisfiable" => - daemon.stats.proofsFound = daemon.stats.proofsFound + 1 - daemon.stats.problemsCompleted = daemon.stats.problemsCompleted + 1 - log(`[Daemon] PROVED: ${item.problem.id} by ${best.prover} (${Belt.Int.toString(best.timeMs)}ms)`) - | "satisfiable" | "countersatisfiable" => - daemon.stats.problemsCompleted = daemon.stats.problemsCompleted + 1 - log(`[Daemon] Counterexample: ${item.problem.id} by ${best.prover}`) - | "timeout" | "unknown" => - if item.attempts < daemon.config.maxRetries { - log(`[Daemon] ? Retry ${Belt.Int.toString(item.attempts)}/${Belt.Int.toString(daemon.config.maxRetries)}: ${item.problem.id}`) - daemon.queue = Array.concat(daemon.queue, [item]) - } else { - daemon.stats.problemsFailed = daemon.stats.problemsFailed + 1 - log(`[Daemon] Failed after ${Belt.Int.toString(item.attempts)} attempts: ${item.problem.id}`) - } - | _ => - daemon.stats.problemsFailed = daemon.stats.problemsFailed + 1 - } - let _ = await emit(daemon, ProblemCompleted({result: result})) - | None => - if item.attempts < daemon.config.maxRetries { - daemon.queue = Array.concat(daemon.queue, [item]) - } else { - daemon.stats.problemsFailed = daemon.stats.problemsFailed + 1 - let _ = await emit(daemon, ProblemFailed({ - problem: item.problem, - error: "No result from any prover", - })) - } - } - } catch { - | exn => - let errorMsg = Js.String.make(exn) - consoleError(`[Daemon] Error processing ${item.problem.id}:`, errorMsg) - - if item.attempts < daemon.config.maxRetries { - item.attempts = item.attempts + 1 - daemon.queue = Array.concat(daemon.queue, [item]) - } else { - daemon.stats.problemsFailed = daemon.stats.problemsFailed + 1 - let _ = await emit(daemon, ProblemFailed({ - problem: item.problem, - error: errorMsg, - })) - } - } - - daemon.runningCount = daemon.runningCount - 1 -} - -/** Save results to disk as JSON */ -let saveResults = async (daemon: t): unit => { - try { - await mkdir(daemon.config.storagePath, {"recursive": true}) - - let data = { - "stats": daemon.stats, - "results": daemon.results, - "timestamp": Js.Date.make()->Js.Date.toISOString, - } - - let filename = `${daemon.config.storagePath}/results_${Belt.Float.toString(dateNow())}.json` - await writeTextFile(filename, jsonStringify2(data, Js.null, 2)) - log(`[Daemon] Results saved to ${filename}`) - } catch { - | exn => consoleError("[Daemon] Failed to save results:", exn) - } -} - -/** Main processing loop — dequeues and processes items up to concurrency limit */ -let rec mainLoop = async (daemon: t): unit => { - if daemon.isRunning { - // Update uptime - daemon.stats.uptimeMs = dateNow() -. daemon.stats.started - - // Process queue if we have capacity - while Array.length(daemon.queue) > 0 && daemon.runningCount < daemon.config.maxConcurrent { - switch daemon.queue->Array.shift { - | Some(item) => - daemon.runningCount = daemon.runningCount + 1 - daemon.stats.currentRunning = daemon.runningCount - let _ = processItem(daemon, item) - | None => () - } - } - - daemon.stats.currentRunning = daemon.runningCount - - await sleep(daemon.config.pollInterval) - await mainLoop(daemon) - } -} - -/** Health check loop — periodically checks prover service health */ -let rec healthCheckLoop = async (daemon: t): unit => { - if daemon.isRunning { - await sleep(daemon.config.healthCheckInterval) - - if daemon.isRunning { - let health = await Unified.healthCheck(daemon.client) - let entries = health->Array.map(h => ({name: h.name, available: h.available}: healthEntry)) - let _ = await emit(daemon, HealthCheck({results: entries})) - } - - await healthCheckLoop(daemon) - } -} - -/** Start the daemon — performs initial health check then enters main loop */ -let start = async (daemon: t): unit => { - if daemon.isRunning { - log("[Daemon] Already running") - } else { - daemon.isRunning = true - daemon.stats.started = dateNow() - daemon.stats.problemsQueued = 0 - daemon.stats.problemsCompleted = 0 - daemon.stats.problemsFailed = 0 - daemon.stats.proofsFound = 0 - daemon.stats.totalTimeMs = 0 - daemon.stats.uptimeMs = 0.0 - daemon.stats.currentRunning = 0 - - log("[Daemon] Starting ECHIDNA Proof Runner...") - log(`[Daemon] Config: ${jsonStringify2(daemon.config, Js.null, 2)}`) - - // Initial health check - let health = await Unified.healthCheck(daemon.client) - log("[Daemon] Service health:") - health->Array.forEach(h => { - let mark = if h.available { "✓" } else { "✗" } - log(` - ${h.name}: ${mark} (${Belt.Int.toString(h.provers)} provers)`) - }) - - let _ = await emit(daemon, Started) - - // Start loops (fire-and-forget) - let _ = mainLoop(daemon) - let _ = healthCheckLoop(daemon) - - log("[Daemon] Running continuously. Press Ctrl+C to stop.") - } -} - -/** Stop the daemon — waits for running tasks, persists results */ -let stop = async (daemon: t): unit => { - if daemon.isRunning { - log("[Daemon] Stopping...") - daemon.isRunning = false - - // Wait briefly for running tasks - if daemon.runningCount > 0 { - log(`[Daemon] Waiting for ${Belt.Int.toString(daemon.runningCount)} tasks to complete...`) - await sleep(2000) - } - - // Persist results - if daemon.config.persistResults { - await saveResults(daemon) - } - - let _ = await emit(daemon, Stopped) - log("[Daemon] Stopped") - } -} - -/** Load problems from a JSON file and enqueue them */ -let loadProblemsFromFile = async (daemon: t, path: string): unit => { - let content = await readTextFile(path) - let problems: array = jsonParse(content) - enqueueBatch(daemon, problems) -} - -/** Get current daemon statistics */ -let getStats = (daemon: t): daemonStats => { - { - ...daemon.stats, - uptimeMs: dateNow() -. daemon.stats.started, - currentRunning: daemon.runningCount, - } -} - -/** Get current queue status */ -let getQueueStatus = (daemon: t): { - "pending": int, - "running": int, - "completed": int, -} => { - { - "pending": Array.length(daemon.queue), - "running": daemon.runningCount, - "completed": Js.Dict.keys(daemon.results)->Array.length, - } -} - -/** Get result for a specific problem by ID */ -let getResult = (daemon: t, problemId: string): option => { - Js.Dict.get(daemon.results, problemId) -} diff --git a/src/provers/types/Prover.res b/src/provers/types/Prover.res deleted file mode 100644 index 530d00b7..00000000 --- a/src/provers/types/Prover.res +++ /dev/null @@ -1,144 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) - -/** - * ECHIDNA Prover Types - * Core type definitions for the neurosymbolic theorem proving platform - */ - -/** Supported input formats for theorem provers */ -type inputFormat = - | @as("tptp") TPTP - | @as("smtlib2") SMTLIB2 - | @as("metamath") Metamath - | @as("lean") Lean - | @as("wolfram") Wolfram - | @as("dimacs") DIMACS - | @as("natural") Natural - -/** Result status from a prover */ -type proverStatus = - | @as("theorem") Theorem - | @as("countersatisfiable") Countersatisfiable - | @as("satisfiable") Satisfiable - | @as("unsatisfiable") Unsatisfiable - | @as("timeout") Timeout - | @as("unknown") Unknown - | @as("error") Error - | @as("running") Running - -/** Prover tier level (1=core, 4=experimental) */ -type proverTier = Tier1 | Tier2 | Tier3 | Tier4 - -/** A single prover system */ -type prover = { - id: string, - name: string, - version: option, - formats: array, - endpoint: option, - tier: int, - online: bool, -} - -/** Result from a prover attempt */ -type proverResult = { - prover: string, - status: proverStatus, - proof: option, - model: option, - time_ms: float, - raw_output: option, - error: option, - timestamp: Js.Date.t, -} - -/** A problem to be proved */ -type problem = { - id: string, - name: option, - format: inputFormat, - content: string, - expected: option, - timeout_sec: option, - metadata: option>, -} - -/** Queue item for continuous runner */ -type queueItem = { - problem: problem, - provers: array, - priority: int, - created: Js.Date.t, - mutable attempts: int, - mutable results: array, -} - -/** Configuration for prover clients */ -type proverConfig = { - timeout_sec: int, - retry_count: int, - retry_delay_ms: int, - api_key: option, - endpoint: option, -} - -/** Default configuration */ -let defaultConfig: proverConfig = { - timeout_sec: 60, - retry_count: 3, - retry_delay_ms: 1000, - api_key: None, - endpoint: None, -} - -/** Available provers registry */ -let proverRegistry: Js.Dict.t = { - let dict = Js.Dict.empty() - - // Tier 1 - Core provers - Js.Dict.set(dict, "z3", { - id: "z3", name: "Z3", version: None, formats: [SMTLIB2], endpoint: None, tier: 1, online: true, - }) - Js.Dict.set(dict, "cvc5", { - id: "cvc5", name: "CVC5", version: None, formats: [SMTLIB2], endpoint: None, tier: 1, online: true, - }) - Js.Dict.set(dict, "vampire", { - id: "vampire", name: "Vampire", version: None, formats: [TPTP], endpoint: None, tier: 1, online: true, - }) - Js.Dict.set(dict, "e", { - id: "e", name: "E Theorem Prover", version: None, formats: [TPTP], endpoint: None, tier: 1, online: true, - }) - - // Tier 2 - Big Six completion - Js.Dict.set(dict, "metamath", { - id: "metamath", name: "Metamath", version: None, formats: [Metamath], endpoint: None, tier: 2, online: true, - }) - Js.Dict.set(dict, "isabelle", { - id: "isabelle", name: "Isabelle/HOL", version: None, formats: [TPTP], endpoint: None, tier: 2, online: true, - }) - Js.Dict.set(dict, "hol-light", { - id: "hol-light", name: "HOL Light", version: None, formats: [TPTP], endpoint: None, tier: 2, online: true, - }) - Js.Dict.set(dict, "mizar", { - id: "mizar", name: "Mizar", version: None, formats: [TPTP], endpoint: None, tier: 2, online: true, - }) - - // Tier 3 - Extended support - Js.Dict.set(dict, "lean", { - id: "lean", name: "Lean 4", version: None, formats: [Lean], endpoint: None, tier: 3, online: true, - }) - Js.Dict.set(dict, "coq", { - id: "coq", name: "Coq/Rocq", version: None, formats: [TPTP], endpoint: None, tier: 3, online: true, - }) - - // SAT solvers - Js.Dict.set(dict, "minisat", { - id: "minisat", name: "MiniSat", version: None, formats: [DIMACS], endpoint: None, tier: 1, online: true, - }) - Js.Dict.set(dict, "glucose", { - id: "glucose", name: "Glucose", version: None, formats: [DIMACS], endpoint: None, tier: 1, online: true, - }) - - dict -} diff --git a/src/provers/types/ProverTest.res b/src/provers/types/ProverTest.res deleted file mode 100644 index 8d991395..00000000 --- a/src/provers/types/ProverTest.res +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) - -/** - * ECHIDNA Prover Types Tests - * Validates core type definitions and default configuration values. - * - * Note: These are structural tests expressed as ReScript assertions. - * In a full test harness, use a ReScript-compatible test runner. - */ - -/** Verify DEFAULT_CONFIG has required fields with expected values */ -let testDefaultConfig = () => { - let config = Prover.defaultConfig - assert(config.timeout_sec == 60) - assert(config.retry_count == 3) - assert(config.retry_delay_ms == 1000) - Js.log("[ProverTest] DEFAULT_CONFIG - has required fields: PASS") -} - -/** Verify PROVER_REGISTRY contains expected provers */ -let testProverRegistry = () => { - let registry = Prover.proverRegistry - let z3 = Js.Dict.get(registry, "z3") - let vampire = Js.Dict.get(registry, "vampire") - let metamath = Js.Dict.get(registry, "metamath") - - switch (z3, vampire, metamath) { - | (Some(z3p), Some(_vamp), Some(mmp)) => { - assert(z3p.tier == 1) - assert(mmp.tier == 2) - Js.log("[ProverTest] PROVER_REGISTRY - contains expected provers: PASS") - } - | _ => { - Js.log("[ProverTest] PROVER_REGISTRY - missing expected provers: FAIL") - assert(false) - } - } -} - -/** Verify Problem type can be created with valid fields */ -let testProblemType = () => { - let problem: Prover.problem = { - id: "test-problem-1", - name: Some("Test Problem"), - format: Prover.TPTP, - content: "fof(test, axiom, p).", - expected: Some(Prover.Theorem), - timeout_sec: Some(30), - metadata: Some(Js.Dict.fromArray([("source", Js.Json.string("test"))])), - } - - assert(problem.id == "test-problem-1") - assert(problem.format == Prover.TPTP) - assert(Js.String2.length(problem.content) > 0) - Js.log("[ProverTest] Problem type - can create valid problem: PASS") -} - -/** Verify ProverResult type can be created with valid fields */ -let testProverResultType = () => { - let result: Prover.proverResult = { - prover: "z3-wasm", - status: Prover.Theorem, - proof: Some("QED"), - model: None, - time_ms: 123.0, - raw_output: None, - error: None, - timestamp: Js.Date.make(), - } - - assert(result.prover == "z3-wasm") - assert(result.status == Prover.Theorem) - Js.log("[ProverTest] ProverResult type - can create valid result: PASS") -} - -/** Run all tests */ -let runAll = () => { - Js.log("=== ECHIDNA Prover Types Tests ===") - testDefaultConfig() - testProverRegistry() - testProblemType() - testProverResultType() - Js.log("=== All prover type tests passed ===") -} - -let _ = runAll() diff --git a/src/provers/utils/Http.res b/src/provers/utils/Http.res deleted file mode 100644 index e551a0be..00000000 --- a/src/provers/utils/Http.res +++ /dev/null @@ -1,163 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) - -/** - * ECHIDNA HTTP Utilities - * Deno-native HTTP client utilities with retry logic - */ - -/** Retry configuration options */ -type retryOptions = { - maxRetries: int, - baseDelayMs: int, - maxDelayMs: int, -} - -/** Default retry configuration */ -let defaultRetry: retryOptions = { - maxRetries: 3, - baseDelayMs: 1000, - maxDelayMs: 16000, -} - -/** FFI bindings to global fetch and related APIs */ -@val external fetch: (string, 'a) => Js.Promise2.t<'b> = "fetch" -@val external fetchUrl: string => Js.Promise2.t<'a> = "fetch" -@val external setTimeout: (unit => unit, int) => int = "setTimeout" - -/** Response type from fetch API */ -type response = { - ok: bool, - status: int, - statusText: string, -} - -@send external responseText: response => Js.Promise2.t = "text" -@send external responseJson: response => Js.Promise2.t = "json" - -/** Sleep for specified milliseconds */ -let sleep = (ms: int): Js.Promise2.t => { - Js.Promise2.make((~resolve, ~reject as _reject) => { - let _ = setTimeout(() => resolve(), ms) - }) -} - -/** Calculate exponential backoff delay */ -let backoffDelay = (attempt: int, options: retryOptions): int => { - let delay = options.baseDelayMs * Js.Math.pow_int(~base=2, ~exp=attempt) - Js.Math.min_int(delay, options.maxDelayMs) -} - -/** Fetch with exponential backoff retry. - * Returns a promise that resolves to the Response object. - * Retries on server errors (status >= 500) and network failures. - */ -let fetchWithRetry = ( - url: string, - ~init: option<{..}>=?, - ~options: retryOptions=defaultRetry, -): Js.Promise2.t => { - let rec attempt = (n: int, lastError: option): Js.Promise2.t => { - if n > options.maxRetries { - Js.Promise2.reject( - Js.Exn.raiseError(`Failed after ${Belt.Int.toString(options.maxRetries)} retries: ${Belt.Option.getWithDefault(lastError, "unknown error")}`) - ) - } else { - let fetchPromise = switch init { - | Some(i) => fetch(url, i) - | None => fetchUrl(url) - } - fetchPromise - ->Js.Promise2.then(resp => { - if resp.status >= 500 && n < options.maxRetries { - sleep(backoffDelay(n, options)) - ->Js.Promise2.then(_ => attempt(n + 1, Some(`HTTP ${Belt.Int.toString(resp.status)}`))) - } else { - Js.Promise2.resolve(resp) - } - }) - ->Js.Promise2.catch(err => { - let errMsg = Js.String.make(err) - if n < options.maxRetries { - Js.log(`[HTTP] Retry ${Belt.Int.toString(n + 1)}/${Belt.Int.toString(options.maxRetries)} for ${url}: ${errMsg}`) - sleep(backoffDelay(n, options)) - ->Js.Promise2.then(_ => attempt(n + 1, Some(errMsg))) - } else { - Js.Promise2.reject( - Js.Exn.raiseError(`Failed after ${Belt.Int.toString(options.maxRetries)} retries: ${errMsg}`) - ) - } - }) - } - } - attempt(0, None) -} - -/** POST form data (for SystemOnTPTP) */ -let postForm = ( - url: string, - data: Js.Dict.t, - ~options: retryOptions=defaultRetry, -): Js.Promise2.t => { - let params = Js.Dict.entries(data) - ->Belt.Array.map(((k, v)) => `${k}=${v}`) - ->Js.Array2.joinWith("&") - - fetchWithRetry(url, ~init=Some({ - "method": "POST", - "headers": {"Content-Type": "application/x-www-form-urlencoded"}, - "body": params, - }), ~options) - ->Js.Promise2.then(resp => { - if !resp.ok { - Js.Promise2.reject( - Js.Exn.raiseError(`HTTP ${Belt.Int.toString(resp.status)}: ${resp.statusText}`) - ) - } else { - responseText(resp) - } - }) -} - -/** POST JSON and parse response */ -let postJSON = ( - url: string, - data: Js.Json.t, - ~headers: Js.Dict.t=Js.Dict.empty(), - ~options: retryOptions=defaultRetry, -): Js.Promise2.t => { - let allHeaders = Js.Dict.fromArray([("Content-Type", "application/json")]) - Js.Dict.entries(headers)->Belt.Array.forEach(((k, v)) => Js.Dict.set(allHeaders, k, v)) - - fetchWithRetry(url, ~init=Some({ - "method": "POST", - "headers": allHeaders, - "body": Js.Json.stringify(data), - }), ~options) - ->Js.Promise2.then(resp => { - if !resp.ok { - Js.Promise2.reject( - Js.Exn.raiseError(`HTTP ${Belt.Int.toString(resp.status)}: ${resp.statusText}`) - ) - } else { - responseJson(resp) - } - }) -} - -/** GET request returning text body */ -let getText = ( - url: string, - ~options: retryOptions=defaultRetry, -): Js.Promise2.t => { - fetchWithRetry(url, ~options) - ->Js.Promise2.then(resp => { - if !resp.ok { - Js.Promise2.reject( - Js.Exn.raiseError(`HTTP ${Belt.Int.toString(resp.status)}: ${resp.statusText}`) - ) - } else { - responseText(resp) - } - }) -} diff --git a/src/rescript/.gitignore b/src/rescript/.gitignore deleted file mode 100644 index 47992813..00000000 --- a/src/rescript/.gitignore +++ /dev/null @@ -1,62 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later -# SPDX-FileCopyrightText: 2025 ECHIDNA Project Team - -# Dependencies -node_modules/ -.pnp -.pnp.js -package-lock.json -yarn.lock - -# OCaml compilation artefacts (rescript compiler output) -lib/ocaml/ - -# ReScript build output -*.bs.js -*.bs.mjs -lib/bs/ - -# Build artifacts -dist/ -build/ -.cache/ - -# Deno cache -.deno/ - -# Environment variables -.env -.env.local -.env.development.local -.env.test.local -.env.production.local - -# Logs -npm-debug.log* -yarn-debug.log* -yarn-error.log* -deno.log - -# Editor directories -.vscode/ -.idea/ -*.swp -*.swo -*~ - -# OS files -.DS_Store -Thumbs.db - -# Coverage -coverage/ -*.lcov - -# Production builds -*.tsbuildinfo -target/ -_build/ -deps/ -.elixir_ls/ -*.log -*.tmp diff --git a/src/rescript/.reuse/dep5 b/src/rescript/.reuse/dep5 deleted file mode 100644 index 365d4de9..00000000 --- a/src/rescript/.reuse/dep5 +++ /dev/null @@ -1,17 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: echidna-ui -Upstream-Contact: Jonathan D.A. Jewell -Source: https://github.com/hyperpolymath/echidna - -# This sub-tree follows the repository-wide licensing set out in the root -# NOTICE and .reuse/dep5: code is AGPL-3.0-or-later. The previous -# "MIT OR Palimpsest-0.6" declaration here predated the MPL and then AGPL -# migrations and was never updated. - -Files: package.json package-lock.json rescript.json deno.json import_map.json tailwind.config.js -Copyright: 2025-2026 Jonathan D.A. Jewell and ECHIDNA Project Contributors -License: AGPL-3.0-or-later - -Files: .gitignore -Copyright: 2025-2026 Jonathan D.A. Jewell and ECHIDNA Project Contributors -License: AGPL-3.0-or-later diff --git a/src/rescript/README.md b/src/rescript/README.md deleted file mode 100644 index 5f332fbc..00000000 --- a/src/rescript/README.md +++ /dev/null @@ -1,349 +0,0 @@ -# ECHIDNA ReScript UI - -Production-ready web interface for the ECHIDNA Neurosymbolic Theorem Proving Platform. - -## Overview - -Modern, interactive proof assistant UI built with: -- **ReScript** - Type-safe functional programming (NOT JavaScript/TypeScript) -- **Deno** - Modern JavaScript runtime -- **React** - UI framework -- **Tailwind CSS** - Utility-first styling - -## Features - -### Core Components - -1. **ProverSelector** - Choose from 12 theorem provers across 4 tiers - - Tier 1 (6): Agda, Coq, Lean, Isabelle, Z3, CVC5 - - Tier 2 (3): Metamath, HOL Light, Mizar - - Tier 3 (2): PVS, ACL2 - - Tier 4 (1): HOL4 - -2. **GoalList** - Display current proof goals - - Hypotheses and context visualization - - Current goal highlighting - - Interactive goal selection - -3. **TacticSuggester** - Neural tactic recommendations - - AI-powered suggestions with confidence scores - - Aspect tag filtering - - One-click tactic application - -4. **ProofViewer** - Proof state visualization - - Real-time proof script display - - Prover-specific syntax highlighting - - Progress tracking - -5. **TheoremSearch** - Search theorem libraries - - OpenCyc ontology integration - - Aspect-based filtering - - Cross-prover search - -6. **ProofTree** - Hierarchical proof structure - - Interactive tree visualization - - Node type indicators - - Expandable/collapsible nodes - -### Advanced Features - -- **Real-time state management** - React hooks + reducers -- **API client** - Type-safe communication with Rust backend -- **Aspect tagging** - Semantic filtering system -- **Multi-prover support** - Unified interface for 12 provers -- **Responsive design** - Mobile and desktop optimized -- **Modern styling** - Tailwind CSS with custom themes - -## Project Structure - -``` -src/rescript/ -├── src/ -│ ├── Main.res # Application entry point -│ ├── state/ -│ │ └── Store.res # State management -│ ├── api/ -│ │ └── Client.res # Backend API client -│ └── components/ -│ ├── ProverSelector.res -│ ├── GoalList.res -│ ├── TacticSuggester.res -│ ├── ProofViewer.res -│ ├── TheoremSearch.res -│ └── ProofTree.res -├── styles/ -│ └── main.css # Tailwind styles -├── package.json # npm dependencies -├── rescript.json # ReScript configuration -├── deno.json # Deno configuration -├── import_map.json # Import mappings -├── tailwind.config.js # Tailwind configuration -├── server.ts # Deno dev server -└── index.html # Entry HTML - -``` - -## Getting Started - -### Prerequisites - -- **Node.js** 18+ (for ReScript compiler and npm) -- **Deno** 1.37+ (for runtime and dev server) -- **Rust backend** running at `http://localhost:3000` (or set `ECHIDNA_API_URL`) - -### Installation - -```bash -# Install dependencies -cd src/rescript -npm install - -# Or use Justfile from project root -just build-ui -``` - -### Development - -```bash -# Start ReScript compiler in watch mode -npm run res:dev - -# In another terminal, start Deno dev server -npm run dev - -# Or use Justfile shortcuts -just watch-ui # ReScript compiler -just dev-ui # Deno dev server -``` - -The UI will be available at `http://localhost:8081` - -### Building for Production - -```bash -# Build ReScript → JavaScript -npm run res:build - -# Bundle for production -npm run build - -# Or use Justfile -just build-ui -``` - -### Serving - -```bash -# Serve production build -npm run serve - -# Or use Justfile -just serve-ui -``` - -## Configuration - -### API Backend - -Set the backend URL via environment variable: - -```bash -export ECHIDNA_API_URL=http://localhost:3000 -``` - -Or modify `server.ts`: - -```typescript -const API_BACKEND = Deno.env.get("ECHIDNA_API_URL") || "http://localhost:3000"; -``` - -### Tailwind CSS - -Customize theme in `tailwind.config.js`: - -```javascript -module.exports = { - theme: { - extend: { - colors: { - echidna: { /* custom colors */ } - } - } - } -} -``` - -## API Integration - -The UI communicates with the Rust backend via REST API: - -- `POST /api/proof/init` - Initialize proof session -- `POST /api/proof/tactic` - Apply tactic -- `GET /api/proof/suggestions` - Get neural suggestions -- `POST /api/theorems/search` - Search theorems -- `GET /api/aspects/tags` - Get aspect tags -- `GET /api/proof/tree` - Get proof tree structure - -See `src/api/Client.res` for complete API documentation. - -## Development Workflow - -### 1. Edit ReScript Files - -Edit `.res` files in `src/` and `src/components/`. The compiler will: -- Type-check your code -- Generate `.bs.js` files (JavaScript output) -- Show errors in terminal - -### 2. Hot Reload - -The Deno dev server watches for changes and auto-reloads the browser. - -### 3. Testing - -```bash -# Run ReScript compiler checks -npm run check - -# Or use Justfile -just build-ui -``` - -### 4. Code Style - -ReScript enforces consistent formatting via the compiler. No need for Prettier/ESLint! - -## Prover-Specific Features - -Each prover has: -- Custom syntax highlighting -- Tier-based categorization -- Difficulty indicators -- Specific tactic suggestions - -### Tier System - -- **Tier 1**: Core provers (green) - Most common, best supported -- **Tier 2**: Extended (blue) - Additional coverage -- **Tier 3**: Specialized (yellow) - Domain-specific -- **Tier 4**: Advanced (orange) - Cutting-edge research - -## State Management - -The app uses a centralized reducer pattern: - -```rescript -type state = { - selectedProver: option, - proofState: option, - tacticSuggestions: array, - aspectTags: array, - // ... -} - -type action = - | SelectProver(prover) - | UpdateProofState(proofState) - | ApplyTactic(string) - // ... -``` - -See `src/state/Store.res` for complete state management. - -## Aspect Tagging - -Aspect tags enable semantic filtering: - -- **Domain**: algebra, geometry, logic, etc. -- **Difficulty**: basic, intermediate, advanced -- **Technique**: induction, contradiction, construction -- **Context**: research, teaching, verification - -Tags integrate with OpenCyc ontology for intelligent theorem search. - -## Performance - -### Optimization Strategies - -1. **Code splitting** - Lazy load components -2. **Memoization** - React.memo for expensive renders -3. **Virtual scrolling** - For large goal/theorem lists -4. **API caching** - Cache frequent queries -5. **WASM backend** - Optional Rust WASM integration - -### Bundle Size - -Production build targets: -- Initial load: <100KB (gzipped) -- Full app: <500KB (gzipped) - -## Browser Support - -- Chrome/Edge 90+ -- Firefox 88+ -- Safari 14+ -- Mobile browsers (iOS Safari, Chrome Android) - -## Troubleshooting - -### ReScript Compilation Errors - -```bash -# Clean build artifacts -npm run res:clean - -# Rebuild -npm run res:build -``` - -### Deno Import Errors - -Check `import_map.json` for correct module URLs. Deno caches imports in `~/.cache/deno`. - -### API Connection Issues - -1. Verify Rust backend is running: `curl http://localhost:3000/api/health` -2. Check CORS configuration in Rust backend -3. Verify `ECHIDNA_API_URL` environment variable - -### Styling Issues - -```bash -# Rebuild Tailwind CSS -npx tailwindcss -i ./styles/main.css -o ./dist/output.css -``` - -## Contributing - -1. Write type-safe ReScript (no `external` unless necessary) -2. Use functional patterns (avoid mutation) -3. Add SPDX headers to all files -4. Follow RSR/CCCP compliance guidelines -5. Test across all 12 provers - -## License - -Dual-licensed: -- **MIT License** -- **Palimpsest License v0.6** - -See project root for full license texts. - -## Resources - -- [ReScript Documentation](https://rescript-lang.org) -- [Deno Manual](https://deno.land/manual) -- [Tailwind CSS](https://tailwindcss.com) -- [ECHIDNA Main Docs](../../docs/) -- [ECHIDNA Repository](https://github.com/hyperpolymath/echidna) - -## Support - -For issues, questions, or contributions: -- Open an issue on GitLab -- Join the ECHIDNA development chat -- Read the main project CLAUDE.md - ---- - -**Built with 🦔 by the ECHIDNA Project Team** diff --git a/src/rescript/deno.json b/src/rescript/deno.json deleted file mode 100644 index 3d31e75c..00000000 --- a/src/rescript/deno.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "compilerOptions": { - "allowJs": true, - "lib": [ - "deno.window", - "dom", - "dom.iterable", - "esnext" - ], - "jsx": "react-jsx", - "jsxImportSource": "react" - }, - "tasks": { - "dev": "deno run --allow-net --allow-read --allow-env --watch src/Server.bs.js", - "serve": "deno run --allow-net --allow-read --allow-env src/Server.bs.js", - "build": "deno run --allow-read --allow-write --allow-env build.ts", - "res:build": "rescript build", - "res:dev": "rescript build -w", - "res:clean": "rescript clean", - "check": "rescript build && deno check src/Main.bs.js" - }, - "fmt": { - "files": { - "include": [ - "src/", - "server.ts", - "build.ts" - ] - }, - "options": { - "useTabs": false, - "lineWidth": 100, - "indentWidth": 2, - "singleQuote": false - } - }, - "lint": { - "files": { - "include": [ - "src/", - "server.ts", - "build.ts" - ] - }, - "rules": { - "tags": [ - "recommended" - ] - } - }, - "imports": { - "react": "npm:react@^18.2.0", - "react-dom": "npm:react-dom@^18.2.0", - "react-dom/client": "npm:react-dom@^18.2.0/client", - "react/jsx-runtime": "npm:react@^18.2.0/jsx-runtime", - "rescript-webapi": "npm:rescript-webapi@^0.10.0", - "@rescript/core": "npm:@rescript/core@^1.2.0", - "@rescript/react": "npm:@rescript/react@^0.13.1", - "@rescript/runtime/": "npm:@rescript/runtime@^12.2.0/", - "rescript": "npm:rescript@^12.2.0", - "@std/http": "jsr:@std/http@^1.0.0", - "@std/path": "jsr:@std/path@^1.0.0", - "@std/media-types": "jsr:@std/media-types@^1.0.0" - } -} diff --git a/src/rescript/deno.lock b/src/rescript/deno.lock deleted file mode 100644 index d384c46d..00000000 --- a/src/rescript/deno.lock +++ /dev/null @@ -1,72 +0,0 @@ -{ - "version": "5", - "remote": { - "https://deno.land/std@0.211.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5", - "https://deno.land/std@0.211.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8", - "https://deno.land/std@0.211.0/cli/parse_args.ts": "91dfad92c32c4c7f50bc5f476030cc84d0b8ad69f66cde219ddfd49516cbbdcf", - "https://deno.land/std@0.211.0/encoding/_util.ts": "beacef316c1255da9bc8e95afb1fa56ed69baef919c88dc06ae6cb7a6103d376", - "https://deno.land/std@0.211.0/encoding/base64.ts": "0ec6d6e6b68fc38f6396277e5184bcd47c1a9db0222fd0b563487eb67e352741", - "https://deno.land/std@0.211.0/fmt/bytes.ts": "38e98ba7fbc775c8b04fd5339bc2e41be4848a8545e82b429527ffdc50ff2499", - "https://deno.land/std@0.211.0/fmt/colors.ts": "be082d6a6bbb2980ae7b2bf8c23c6bb2811ba90a06a9bcb861344a71784c5a99", - "https://deno.land/std@0.211.0/http/etag.ts": "8570289ed16c6e76aa9aa0af07c9e33842f82fc1518378739696ca95753acd1c", - "https://deno.land/std@0.211.0/http/file_server.ts": "5927ddba6e28e036a422f3fc84403b16b5d4c3b2cf58d52adfe9fd0db9eece51", - "https://deno.land/std@0.211.0/http/status.ts": "716c63e9f7a8d109ea3a28f9c81f895d5c30522cdaf39be87b13dfba162cdb3d", - "https://deno.land/std@0.211.0/media_types/_db.ts": "1d695d9fe1c785e523d6de7191b33f33ecc7866db77358a4f966221cca56e2f9", - "https://deno.land/std@0.211.0/media_types/_util.ts": "97198fcf0fea9f3613e5294944114ab04788f709bea999e31123321f449dd098", - "https://deno.land/std@0.211.0/media_types/content_type.ts": "ec2325c8f8c2ce6a081620e145b6e842f98b28ca4cfb88acfc82c74d071bbbf4", - "https://deno.land/std@0.211.0/media_types/format_media_type.ts": "9fc070ec4dcc3193a9c048b3a20375b311685d22bf4ccf9311970b9dc1fb2ec7", - "https://deno.land/std@0.211.0/media_types/get_charset.ts": "678383f268db650da0f053655c5cce87cf3b7028f62436bafaf0b2dbf9e761e1", - "https://deno.land/std@0.211.0/media_types/parse_media_type.ts": "6cecc445f1a47adaeb1e163af7f20d29a1b6be68185c6e78eb12c04fc2dfe3ea", - "https://deno.land/std@0.211.0/media_types/type_by_extension.ts": "27fb0c5c306ce6c115b071b1a6fca4f1061572e214e3023775680fbe9199f7e8", - "https://deno.land/std@0.211.0/media_types/vendor/mime-db.v1.52.0.ts": "0218d2c7d900e8cd6fa4a866e0c387712af4af9a1bae55d6b2546c73d273a1e6", - "https://deno.land/std@0.211.0/path/_common/assert_path.ts": "2ca275f36ac1788b2acb60fb2b79cb06027198bc2ba6fb7e163efaedde98c297", - "https://deno.land/std@0.211.0/path/_common/constants.ts": "dc5f8057159f4b48cd304eb3027e42f1148cf4df1fb4240774d3492b5d12ac0c", - "https://deno.land/std@0.211.0/path/_common/normalize.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", - "https://deno.land/std@0.211.0/path/_common/normalize_string.ts": "dfdf657a1b1a7db7999f7c575ee7e6b0551d9c20f19486c6c3f5ff428384c965", - "https://deno.land/std@0.211.0/path/_common/relative.ts": "faa2753d9b32320ed4ada0733261e3357c186e5705678d9dd08b97527deae607", - "https://deno.land/std@0.211.0/path/_os.ts": "8fb9b90fb6b753bd8c77cfd8a33c2ff6c5f5bc185f50de8ca4ac6a05710b2c15", - "https://deno.land/std@0.211.0/path/extname.ts": "593303db8ae8c865cbd9ceec6e55d4b9ac5410c1e276bfd3131916591b954441", - "https://deno.land/std@0.211.0/path/join.ts": "ae2ec5ca44c7e84a235fd532e4a0116bfb1f2368b394db1c4fb75e3c0f26a33a", - "https://deno.land/std@0.211.0/path/posix/_util.ts": "1e3937da30f080bfc99fe45d7ed23c47dd8585c5e473b2d771380d3a6937cf9d", - "https://deno.land/std@0.211.0/path/posix/extname.ts": "8d36ae0082063c5e1191639699e6f77d3acf501600a3d87b74943f0ae5327427", - "https://deno.land/std@0.211.0/path/posix/join.ts": "aef88d5fa3650f7516730865dbb951594d1a955b785e2450dbee93b8e32694f3", - "https://deno.land/std@0.211.0/path/posix/normalize.ts": "baeb49816a8299f90a0237d214cef46f00ba3e95c0d2ceb74205a6a584b58a91", - "https://deno.land/std@0.211.0/path/posix/relative.ts": "3907d6eda41f0ff723d336125a1ad4349112cd4d48f693859980314d5b9da31c", - "https://deno.land/std@0.211.0/path/posix/resolve.ts": "bac20d9921beebbbb2b73706683b518b1d0c1b1da514140cee409e90d6b2913a", - "https://deno.land/std@0.211.0/path/relative.ts": "ab739d727180ed8727e34ed71d976912461d98e2b76de3d3de834c1066667add", - "https://deno.land/std@0.211.0/path/resolve.ts": "a6f977bdb4272e79d8d0ed4333e3d71367cc3926acf15ac271f1d059c8494d8d", - "https://deno.land/std@0.211.0/path/separator.ts": "2b5a590d4f1942e70650ee7421d161c24ec7d3b94b49981e4138ae07397fb2d2", - "https://deno.land/std@0.211.0/path/windows/_util.ts": "d5f47363e5293fced22c984550d5e70e98e266cc3f31769e1710511803d04808", - "https://deno.land/std@0.211.0/path/windows/extname.ts": "165a61b00d781257fda1e9606a48c78b06815385e7d703232548dbfc95346bef", - "https://deno.land/std@0.211.0/path/windows/join.ts": "e0b3356615c1a75c56ebb6a7311157911659e11fd533d80d724800126b761ac3", - "https://deno.land/std@0.211.0/path/windows/normalize.ts": "78126170ab917f0ca355a9af9e65ad6bfa5be14d574c5fb09bb1920f52577780", - "https://deno.land/std@0.211.0/path/windows/relative.ts": "3e1abc7977ee6cc0db2730d1f9cb38be87b0ce4806759d271a70e4997fc638d7", - "https://deno.land/std@0.211.0/path/windows/resolve.ts": "75b2e3e1238d840782cee3d8864d82bfaa593c7af8b22f19c6422cf82f330ab3", - "https://deno.land/std@0.211.0/streams/byte_slice_stream.ts": "5bbdcadb118390affa9b3d0a0f73ef8e83754f59bb89df349add669dd9369713", - "https://deno.land/std@0.211.0/version.ts": "46f833faaf024c7f0b0b902bf004065de0bb873cbd4bcf088ac673eab97d897d" - }, - "workspace": { - "dependencies": [ - "jsr:@std/http@1", - "jsr:@std/media-types@1", - "jsr:@std/path@1", - "npm:@rescript/core@^1.2.0", - "npm:@rescript/react@~0.13.1", - "npm:@rescript/runtime@^12.2.0", - "npm:react-dom@^18.2.0", - "npm:react@^18.2.0", - "npm:rescript-webapi@0.10", - "npm:rescript@^12.2.0" - ], - "packageJson": { - "dependencies": [ - "npm:@rescript/core@^1.2.0", - "npm:@rescript/react@~0.13.1", - "npm:react-dom@^18.2.0", - "npm:react@^18.2.0", - "npm:rescript-webapi@0.10", - "npm:rescript@12" - ] - } - } -} diff --git a/src/rescript/import_map.json b/src/rescript/import_map.json deleted file mode 100644 index 7e9eb200..00000000 --- a/src/rescript/import_map.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "imports": { - "react": "https://esm.sh/react@18.2.0", - "react-dom": "https://esm.sh/react-dom@18.2.0", - "react-dom/": "https://esm.sh/react-dom@18.2.0/", - "react/": "https://esm.sh/react@18.2.0/", - "@std/http": "https://deno.land/std@0.211.0/http/mod.ts", - "@std/path": "https://deno.land/std@0.211.0/path/mod.ts", - "@std/media-types": "https://deno.land/std@0.211.0/media_types/mod.ts" - } -} diff --git a/src/rescript/index.html b/src/rescript/index.html deleted file mode 100644 index b83c0926..00000000 --- a/src/rescript/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - ECHIDNA - Neurosymbolic Theorem Proving - - - - - - -
- - - diff --git a/src/rescript/lib/rescript.lock b/src/rescript/lib/rescript.lock deleted file mode 100644 index 4703c0f7..00000000 --- a/src/rescript/lib/rescript.lock +++ /dev/null @@ -1 +0,0 @@ -2381604 \ No newline at end of file diff --git a/src/rescript/package.json b/src/rescript/package.json deleted file mode 100644 index 618c39cb..00000000 --- a/src/rescript/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "echidna-ui", - "version": "0.1.0", - "description": "ECHIDNA Neurosymbolic Theorem Proving Platform - ReScript UI", - "license": "AGPL-3.0-or-later", - "type": "module", - "scripts": { - "res:build": "rescript build", - "res:dev": "rescript build -w", - "res:clean": "rescript clean", - "dev": "deno run --allow-net --allow-read --allow-env --watch src/Server.bs.js", - "build": "rescript build", - "serve": "deno run --allow-net --allow-read --allow-env src/Server.bs.js", - "check": "rescript build && deno check src/Main.bs.js" - }, - "keywords": [ - "theorem-proving", - "neurosymbolic", - "rescript", - "deno", - "proof-assistant" - ], - "devDependencies": { - "@rescript/core": "^1.2.0", - "@rescript/react": "^0.13.1", - "rescript": "^12.0.0" - }, - "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0", - "rescript-webapi": "^0.10.0" - } -} diff --git a/src/rescript/rescript.json b/src/rescript/rescript.json deleted file mode 100644 index 49e28c3c..00000000 --- a/src/rescript/rescript.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "echidna-ui", - "version": "0.1.0", - "sources": [ - { - "dir": "src", - "subdirs": true - } - ], - "package-specs": [ - { - "module": "es6", - "in-source": true - } - ], - "suffix": ".bs.js", - "bs-dependencies": [ - "@rescript/react", - "@rescript/core", - "rescript-webapi" - ], - "gentypeconfig": { - "language": "typescript", - "shims": {}, - "debug": { - "all": false, - "basic": false - } - }, - "jsx": { - "version": 4, - "mode": "classic" - }, - "warnings": { - "error": "+101+8+27" - } -} diff --git a/src/rescript/src/Main.res b/src/rescript/src/Main.res deleted file mode 100644 index 43548182..00000000 --- a/src/rescript/src/Main.res +++ /dev/null @@ -1,214 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2025 ECHIDNA Project Team - -/** - * Main entry point for ECHIDNA UI - * Coordinates all components and manages application state - */ - -open Store - -type view = - | SelectProver - | ProofSession - | TheoremLibrary - -@react.component -let make = () => { - let (state, dispatch) = React.useReducer(reducer, initialState) - let (currentView, setCurrentView) = React.useState(() => SelectProver) - let (selectedGoalId, setSelectedGoalId) = React.useState(() => None) - - // Load aspect tags on mount - React.useEffect(() => { - let _ = Client.getAspectTags()->Promise.then(result => { - switch result { - | Ok(tags) => { - dispatch(UpdateProofState({ - goals: [], - currentGoalIndex: 0, - proofScript: [], - completed: false, - })) - // Initialize aspect tags - let initializedTags = tags->Belt.Array.map(tag => {...tag, active: false}) - dispatch( - UpdateProofState({ - goals: [], - currentGoalIndex: 0, - proofScript: [], - completed: false, - }), - ) - Promise.resolve() - } - | Error(_) => Promise.resolve() - } - }) - None - }, []) - - let handleSelectProver = prover => { - dispatch(SetLoading(true)) - let _ = Client.initProofSession(prover)->Promise.then(result => { - switch result { - | Ok(proofState) => { - dispatch(UpdateProofState(proofState)) - dispatch(SetLoading(false)) - setCurrentView(_ => ProofSession) - Promise.resolve() - } - | Error(err) => { - dispatch(SetError(Some(err))) - dispatch(SetLoading(false)) - Promise.resolve() - } - } - }) - } - - let handleApplyTactic = tactic => { - switch selectedGoalId { - | Some(goalId) => { - dispatch(SetLoading(true)) - dispatch(ApplyTactic(tactic)) - - let _ = Client.applyTactic(tactic, goalId)->Promise.then(result => { - switch result { - | Ok(newState) => { - dispatch(UpdateProofState(newState)) - dispatch(SetLoading(false)) - Promise.resolve() - } - | Error(err) => { - dispatch(SetError(Some(err))) - dispatch(SetLoading(false)) - Promise.resolve() - } - } - }) - } - | None => () - } - } - - let handleSelectGoal = goalId => { - setSelectedGoalId(_ => Some(goalId)) - } - - let handleSelectTheorem = theorem => { - // Apply theorem as a tactic - handleApplyTactic(theorem) - } - - let renderNavigation = () => - - - let renderError = () => - switch state.error { - | Some(err) => -
-
-
-

{React.string("Error")}

-

{React.string(err)}

-
- -
-
- | None => React.null - } - - let renderContent = () => - switch currentView { - | SelectProver => - | ProofSession => -
-
- - -
-
- - -
-
- | TheoremLibrary => - } - - -
- {renderNavigation()} -
- {renderError()} - {if state.isLoading { -
-
-
-

{React.string("Loading...")}

-
-
- } else { - React.null - }} - {renderContent()} -
-
-
-

- {React.string("ECHIDNA v0.1.0 - Extensible Cognitive Hybrid Intelligence for Deductive Neural Assistance")} -

-

- {React.string("AGPL-3.0-or-later")} -

-
-
-
-
-} - -// Mount the app -switch ReactDOM.querySelector("#root") { -| Some(root) => { - let reactRoot = ReactDOM.Client.createRoot(root) - reactRoot->ReactDOM.Client.Root.render() - } -| None => Js.Console.error("Root element not found") -} diff --git a/src/rescript/src/Server.res b/src/rescript/src/Server.res deleted file mode 100644 index a26b95a2..00000000 --- a/src/rescript/src/Server.res +++ /dev/null @@ -1,114 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) - -/** - * Deno development server for ECHIDNA UI. - * Serves static files and proxies API requests to Rust backend. - */ - -/** FFI: Deno.env.get */ -@scope(("Deno", "env")) @val -external envGet: string => option = "get" - -/** FFI: Deno.serve */ -type serveOptions = {port: int} -@scope("Deno") @val -external serve: (serveOptions, Webapi.Fetch.request => promise) => unit = "serve" - -/** FFI: console.log */ -@scope("console") @val -external log: string => unit = "log" - -/** FFI: console.error */ -@scope("console") @val -external consoleError: (string, 'a) => unit = "error" - -/** FFI: fetch */ -@val -external fetch: (string, {"method": string, "headers": Webapi.Fetch.headers, "body": option}) => promise = "fetch" - -/** FFI: URL constructor */ -type url = { - pathname: string, - search: string, -} -@new external makeUrl: (string, string) => url = "URL" -@new external makeUrlFromString: string => url = "URL" - -/** FFI: Request fields */ -@get external getUrl: Webapi.Fetch.request => string = "url" -@get external getMethod: Webapi.Fetch.request => string = "method" -@get external getHeaders: Webapi.Fetch.request => Webapi.Fetch.headers = "headers" -@get external getBody: Webapi.Fetch.request => option = "body" - -/** FFI: Response constructors */ -@new external makeResponse: (string, {"status": int, "headers": Dict.t}) => Webapi.Fetch.response = "Response" - -/** FFI: serveDir from std */ -type serveDirOptions = { - fsRoot: string, - urlRoot: string, - showDirListing: bool, - showIndex: bool, - enableCors: bool, -} -@module("https://deno.land/std@0.211.0/http/file_server.ts") -external serveDir: (Webapi.Fetch.request, serveDirOptions) => promise = "serveDir" - -/** Server port */ -let port = switch envGet("PORT") { -| Some(p) => p->Int.fromString->Option.getOr(3000) -| None => 3000 -} - -/** API backend URL (configurable via ECHIDNA_API_URL env var) */ -let apiBackend = switch envGet("ECHIDNA_API_URL") { -| Some(url) => url -| None => "http://localhost:8081" -} - -/** Request handler — proxies /api/ to Rust backend, serves static files otherwise */ -let handler = async (req: Webapi.Fetch.request): Webapi.Fetch.response => { - let reqUrl = req->getUrl - let url = makeUrlFromString(reqUrl) - - // API proxy to Rust backend - if url.pathname->String.startsWith("/api/") { - try { - let apiUrl = makeUrl(url.pathname, apiBackend) - let targetUrl = apiUrl.pathname ++ url.search - - let response = await fetch(targetUrl, { - "method": req->getMethod, - "headers": req->getHeaders, - "body": req->getBody, - }) - - response - } catch { - | exn => - consoleError("API proxy error:", exn) - let headers = Dict.fromArray([("Content-Type", "application/json")]) - makeResponse(`{"error": "Backend unavailable"}`, {"status": 502, "headers": headers}) - } - } else { - // Serve static files - await serveDir(req, { - fsRoot: ".", - urlRoot: "", - showDirListing: false, - showIndex: true, - enableCors: true, - }) - } -} - -/** Start the server */ -let start = () => { - log(`ECHIDNA UI Server starting on port ${port->Int.toString}`) - log(`API Backend: ${apiBackend}`) - serve({port: port}, handler) -} - -// Auto-start -let _ = start() diff --git a/src/rescript/src/api/Client.res b/src/rescript/src/api/Client.res deleted file mode 100644 index 9b3fb5df..00000000 --- a/src/rescript/src/api/Client.res +++ /dev/null @@ -1,359 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2026 ECHIDNA Project Team - -/** - * API client for ECHIDNA Rust backend (v1.3) - * Connects to HTTP server on port 8081 - */ - -open Store - -// API configuration - connects to Rust backend -let apiBase = "http://localhost:8081/api" - -// Session ID tracking (using ref for mutability) -let currentSessionId: ref> = ref(None) - -// Response types -type apiResponse<'a> = { - data: option<'a>, - error: option, -} - -// Prover info from backend -type proverInfo = { - name: string, - tier: int, - complexity: int, -} - -type proversResponse = {provers: array} - -// JSON decoding helpers using RescriptCore JSON -module Decode = { - let getString = (dict, key) => - dict->Dict.get(key)->Belt.Option.flatMap(JSON.Decode.string) - - let getInt = (dict, key) => - dict->Dict.get(key) - ->Belt.Option.flatMap(JSON.Decode.float) - ->Belt.Option.map(Belt.Float.toInt) - - let getFloat = (dict, key) => - dict->Dict.get(key)->Belt.Option.flatMap(JSON.Decode.float) - - let getBool = (dict, key) => - dict->Dict.get(key)->Belt.Option.flatMap(JSON.Decode.bool) - - let getArray = (dict, key) => - dict->Dict.get(key)->Belt.Option.flatMap(JSON.Decode.array) - - let goal = (json): option => { - json->JSON.Decode.object->Belt.Option.map(dict => { - { - id: getString(dict, "id")->Belt.Option.getWithDefault(""), - hypotheses: getArray(dict, "hypotheses") - ->Belt.Option.map(arr => arr->Belt.Array.keepMap(JSON.Decode.string)) - ->Belt.Option.getWithDefault([]), - conclusion: getString(dict, "conclusion")->Belt.Option.getWithDefault(""), - context: getArray(dict, "context") - ->Belt.Option.map(arr => arr->Belt.Array.keepMap(JSON.Decode.string)) - ->Belt.Option.getWithDefault([]), - } - }) - } - - let tacticSuggestion = (json): option => { - json->JSON.Decode.object->Belt.Option.map(dict => { - { - tactic: getString(dict, "tactic")->Belt.Option.getWithDefault(""), - confidence: getFloat(dict, "confidence")->Belt.Option.getWithDefault(0.0), - premise: getString(dict, "premise"), - aspectTags: getArray(dict, "aspect_tags") - ->Belt.Option.map(arr => arr->Belt.Array.keepMap(JSON.Decode.string)) - ->Belt.Option.getWithDefault([]), - } - }) - } - - let proofState = (json): option => { - json->JSON.Decode.object->Belt.Option.map(dict => { - { - goals: getArray(dict, "goals") - ->Belt.Option.map(arr => arr->Belt.Array.keepMap(goal)) - ->Belt.Option.getWithDefault([]), - currentGoalIndex: getInt(dict, "current_goal_index")->Belt.Option.getWithDefault(0), - proofScript: getArray(dict, "proof_script") - ->Belt.Option.map(arr => arr->Belt.Array.keepMap(JSON.Decode.string)) - ->Belt.Option.getWithDefault([]), - completed: getBool(dict, "completed")->Belt.Option.getWithDefault(false), - } - }) - } - - let aspectTag = (json): option => { - json->JSON.Decode.object->Belt.Option.map(dict => { - { - name: getString(dict, "name")->Belt.Option.getWithDefault(""), - category: getString(dict, "category")->Belt.Option.getWithDefault(""), - active: getBool(dict, "active")->Belt.Option.getWithDefault(false), - } - }) - } - - let proverInfo = (json): option => { - json->JSON.Decode.object->Belt.Option.map(dict => { - { - name: getString(dict, "name")->Belt.Option.getWithDefault(""), - tier: getInt(dict, "tier")->Belt.Option.getWithDefault(0), - complexity: getInt(dict, "complexity")->Belt.Option.getWithDefault(0), - } - }) - } -} - -module Encode = { - let createSessionRequest = (prover: prover): JSON.t => { - let dict = Dict.make() - dict->Dict.set("prover", JSON.Encode.string(proverToString(prover))) - dict->Dict.set("goal", JSON.Encode.string("")) - JSON.Encode.object(dict) - } - - let applyTacticRequest = (tactic: string): JSON.t => { - let dict = Dict.make() - dict->Dict.set("tactic", JSON.Encode.string(tactic)) - JSON.Encode.object(dict) - } - - let searchQuery = (query: string): JSON.t => { - let dict = Dict.make() - dict->Dict.set("q", JSON.Encode.string(query)) - JSON.Encode.object(dict) - } -} - -// API helper functions -let handleResponse = (response: Webapi.Fetch.Response.t): promise> => { - if response->Webapi.Fetch.Response.ok { - response->Webapi.Fetch.Response.json - ->Promise.then(json => Promise.resolve({data: Some(json), error: None})) - ->Promise.catch(_ => Promise.resolve({ - data: None, - error: Some("Failed to parse response"), - })) - } else { - let status = response->Webapi.Fetch.Response.status - Promise.resolve({ - data: None, - error: Some(`API error: ${Belt.Int.toString(status)}`), - }) - } -} - -// Get available provers -let getProvers = (): promise, string>> => { - Webapi.Fetch.fetch(`${apiBase}/provers`) - ->Promise.then(handleResponse) - ->Promise.then(result => { - switch result { - | {data: Some(json), error: None} => - switch json->JSON.Decode.object { - | Some(dict) => - switch dict->Dict.get("provers") { - | Some(proversJson) => - switch proversJson->JSON.Decode.array { - | Some(arr) => - let provers = arr->Belt.Array.keepMap(Decode.proverInfo) - Promise.resolve(Ok(provers)) - | None => Promise.resolve(Error("Failed to decode provers array")) - } - | None => Promise.resolve(Error("Missing 'provers' field")) - } - | None => Promise.resolve(Error("Invalid JSON response")) - } - | {error: Some(err)} => Promise.resolve(Error(err)) - | _ => Promise.resolve(Error("Unknown error")) - } - }) - ->Promise.catch(_ => Promise.resolve(Error("Network error"))) -} - -// Initialize proof session (creates new session) -let initProofSession = (prover: prover): promise> => { - let init = Webapi.Fetch.RequestInit.make( - ~method_=Post, - ~body=Webapi.Fetch.BodyInit.make(Encode.createSessionRequest(prover)->JSON.stringify), - ~headers=Webapi.Fetch.HeadersInit.make({"Content-Type": "application/json"}), - (), - ) - - Webapi.Fetch.fetchWithInit(`${apiBase}/session/create`, init) - ->Promise.then(handleResponse) - ->Promise.then(result => { - switch result { - | {data: Some(json), error: None} => - switch json->JSON.Decode.object { - | Some(dict) => - switch Decode.getString(dict, "session_id") { - | Some(sessionId) => - currentSessionId := Some(sessionId) - switch dict->Dict.get("state") { - | Some(stateJson) => - switch Decode.proofState(stateJson) { - | Some(state) => Promise.resolve(Ok(state)) - | None => Promise.resolve(Error("Failed to decode proof state")) - } - | None => Promise.resolve(Error("Missing 'state' field")) - } - | None => Promise.resolve(Error("Missing 'session_id' field")) - } - | None => Promise.resolve(Error("Invalid JSON response")) - } - | {error: Some(err)} => Promise.resolve(Error(err)) - | _ => Promise.resolve(Error("Unknown error")) - } - }) - ->Promise.catch(_ => Promise.resolve(Error("Network error"))) -} - -// Apply tactic to current session -let applyTactic = (tactic: string, _goalId: string): promise> => { - switch currentSessionId.contents { - | None => Promise.resolve(Error("No active session")) - | Some(sessionId) => - let init = Webapi.Fetch.RequestInit.make( - ~method_=Post, - ~body=Webapi.Fetch.BodyInit.make(Encode.applyTacticRequest(tactic)->JSON.stringify), - ~headers=Webapi.Fetch.HeadersInit.make({"Content-Type": "application/json"}), - (), - ) - - Webapi.Fetch.fetchWithInit(`${apiBase}/session/${sessionId}/apply`, init) - ->Promise.then(handleResponse) - ->Promise.then(result => { - switch result { - | {data: Some(json), error: None} => - switch json->JSON.Decode.object { - | Some(dict) => - switch dict->Dict.get("state") { - | Some(stateJson) => - switch Decode.proofState(stateJson) { - | Some(state) => Promise.resolve(Ok(state)) - | None => Promise.resolve(Error("Failed to decode proof state")) - } - | None => Promise.resolve(Error("Missing 'state' field")) - } - | None => Promise.resolve(Error("Invalid JSON response")) - } - | {error: Some(err)} => Promise.resolve(Error(err)) - | _ => Promise.resolve(Error("Unknown error")) - } - }) - ->Promise.catch(_ => Promise.resolve(Error("Network error"))) - } -} - -// Get tactic suggestions (neural) -let getTacticSuggestions = ( - _goalId: string, - _aspectTags: array, -): promise, string>> => { - switch currentSessionId.contents { - | None => Promise.resolve(Error("No active session")) - | Some(_sessionId) => - let init = Webapi.Fetch.RequestInit.make( - ~method_=Post, - ~body=Webapi.Fetch.BodyInit.make("{}"), - ~headers=Webapi.Fetch.HeadersInit.make({"Content-Type": "application/json"}), - (), - ) - - Webapi.Fetch.fetchWithInit(`${apiBase}/suggest`, init) - ->Promise.then(handleResponse) - ->Promise.then(result => { - switch result { - | {data: Some(json), error: None} => - switch json->JSON.Decode.object { - | Some(dict) => - switch dict->Dict.get("suggestions") { - | Some(suggestionsJson) => - switch suggestionsJson->JSON.Decode.array { - | Some(arr) => - let suggestions = arr->Belt.Array.keepMap(Decode.tacticSuggestion) - Promise.resolve(Ok(suggestions)) - | None => Promise.resolve(Error("Failed to decode suggestions array")) - } - | None => Promise.resolve(Error("Missing 'suggestions' field")) - } - | None => Promise.resolve(Error("Invalid JSON response")) - } - | {error: Some(err)} => Promise.resolve(Error(err)) - | _ => Promise.resolve(Error("Unknown error")) - } - }) - ->Promise.catch(_ => Promise.resolve(Error("Network error"))) - } -} - -// Search theorems -let searchTheorems = (query: string, _aspectTags: array): promise< - result, string>, -> => { - let url = `${apiBase}/search?q=${query}` - - Webapi.Fetch.fetch(url) - ->Promise.then(handleResponse) - ->Promise.then(result => { - switch result { - | {data: Some(json), error: None} => - switch json->JSON.Decode.object { - | Some(dict) => - switch dict->Dict.get("results") { - | Some(resultsJson) => - switch resultsJson->JSON.Decode.array { - | Some(arr) => - let theorems = arr->Belt.Array.keepMap(JSON.Decode.string) - Promise.resolve(Ok(theorems)) - | None => Promise.resolve(Error("Failed to decode results array")) - } - | None => Promise.resolve(Error("Missing 'results' field")) - } - | None => Promise.resolve(Error("Invalid JSON response")) - } - | {error: Some(err)} => Promise.resolve(Error(err)) - | _ => Promise.resolve(Error("Unknown error")) - } - }) - ->Promise.catch(_ => Promise.resolve(Error("Network error"))) -} - -// Get aspect tags (mock for now - not yet implemented in backend) -let getAspectTags = (): promise, string>> => { - // Return mock data until backend implements this - let mockTags = [ - {name: "constructive", category: "logic", active: false}, - {name: "computational", category: "type", active: false}, - {name: "algebraic", category: "domain", active: false}, - ] - Promise.resolve(Ok(mockTags)) -} - -// Get proof tree structure (mock for now) -let getProofTree = (): promise> => { - // Return empty tree until backend implements this - Promise.resolve(Ok(JSON.Encode.object(Dict.make()))) -} - -// Health check -let checkHealth = (): promise> => { - Webapi.Fetch.fetch(`${apiBase}/health`) - ->Promise.then(response => { - if response->Webapi.Fetch.Response.ok { - Promise.resolve(Ok(true)) - } else { - Promise.resolve(Error("Backend not healthy")) - } - }) - ->Promise.catch(_ => Promise.resolve(Error("Network error"))) -} diff --git a/src/rescript/src/components/GoalList.res b/src/rescript/src/components/GoalList.res deleted file mode 100644 index f65f1861..00000000 --- a/src/rescript/src/components/GoalList.res +++ /dev/null @@ -1,121 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2025 ECHIDNA Project Team - -/** - * GoalList component - Display current proof goals - * Shows hypotheses, context, and conclusion for each goal - */ - -open Store - -@react.component -let make = (~onSelectGoal: string => unit) => { - let (state, _dispatch) = useStore() - - let renderHypothesis = (index: int, hyp: string) => -
- {React.string(hyp)} -
- - let renderContext = (index: int, ctx: string) => -
- {React.string(ctx)} -
- - let renderGoal = (goal: goal, index: int, isCurrent: bool) => { - let cardClasses = isCurrent - ? "goal-card p-4 mb-4 bg-blue-50 border-2 border-blue-500 rounded-lg shadow-md" - : "goal-card p-4 mb-4 bg-white border border-gray-300 rounded-lg hover:shadow-md transition-shadow cursor-pointer" - -
onSelectGoal(goal.id)}> -
-

- {React.string(`Goal ${Belt.Int.toString(index + 1)}`)} - {isCurrent ? {React.string("(Current)")} : React.null} -

- {React.string(goal.id)} -
- - {if Array.length(goal.context) > 0 { -
-

- {React.string("CONTEXT")} -

-
- {goal.context->Belt.Array.mapWithIndex(renderContext)->React.array} -
-
- } else { - React.null - }} - - {if Array.length(goal.hypotheses) > 0 { -
-

- {React.string("Hypotheses")} -

-
- {goal.hypotheses->Belt.Array.mapWithIndex(renderHypothesis)->React.array} -
-
- } else { - React.null - }} - -
-

- {React.string("Conclusion")} -

-
- - {React.string(goal.conclusion)} - -
-
-
- } - -
-
-

{React.string("Proof Goals")}

- {switch state.proofState { - | Some(ps) => -

- {React.string( - `${Belt.Int.toString(Array.length(ps.goals))} ${Array.length(ps.goals) == 1 ? "goal" : "goals"} remaining`, - )} -

- | None => React.null - }} -
- - {switch state.proofState { - | Some(ps) => - if Array.length(ps.goals) == 0 { -
-
{React.string("✓")}
-

- {React.string("Proof Complete!")} -

-

{React.string("All goals have been solved.")}

-
- } else { -
- {ps.goals->Belt.Array.mapWithIndex((index, goal) => - renderGoal(goal, index, index == ps.currentGoalIndex) - )->React.array} -
- } - | None => -
-

{React.string("No active proof session")}

-

- {React.string("Select a prover to start a new proof")} -

-
- }} -
-} diff --git a/src/rescript/src/components/ProofTree.res b/src/rescript/src/components/ProofTree.res deleted file mode 100644 index 6f938739..00000000 --- a/src/rescript/src/components/ProofTree.res +++ /dev/null @@ -1,204 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2025 ECHIDNA Project Team - -/** - * ProofTree component - Visualize proof tree structure - * Shows hierarchical proof structure with interactive navigation - */ - -@react.component -let make = () => { - let (treeData, setTreeData) = React.useState(() => None) - let (isLoading, setIsLoading) = React.useState(() => false) - let (expandedNodes, setExpandedNodes) = React.useState(() => Belt.Set.String.empty) - - // Fetch proof tree on mount - React.useEffect(() => { - setIsLoading(_ => true) - let _ = Client.getProofTree()->Promise.then(result => { - switch result { - | Ok(data) => { - setTreeData(_ => Some(data)) - setIsLoading(_ => false) - Promise.resolve(()) - } - | Error(_) => { - setTreeData(_ => None) - setIsLoading(_ => false) - Promise.resolve(()) - } - } - }) - None - }, []) - - let toggleNode = nodeId => { - setExpandedNodes(prev => { - if prev->Belt.Set.String.has(nodeId) { - prev->Belt.Set.String.remove(nodeId) - } else { - prev->Belt.Set.String.add(nodeId) - } - }) - } - - // JSON decode helpers - let getStringField = (dict, key) => - dict->Dict.get(key)->Belt.Option.flatMap(JSON.Decode.string) - ->Belt.Option.getWithDefault("") - - let getArrayField = (dict, key) => - dict->Dict.get(key)->Belt.Option.flatMap(JSON.Decode.array) - ->Belt.Option.getWithDefault([]) - - let rec renderTreeNode = (~node: JSON.t, ~depth: int) => { - switch node->JSON.Decode.object { - | Some(dict) => { - let nodeId = getStringField(dict, "id") - let nodeType = getStringField(dict, "type") - let label = getStringField(dict, "label") - let children = getArrayField(dict, "children") - - let hasChildren = children->Array.length > 0 - let isExpanded = expandedNodes->Belt.Set.String.has(nodeId) - let indent = (depth * 20)->Belt.Int.toString ++ "px" - - let nodeColor = switch nodeType { - | "goal" => "bg-blue-100 border-blue-500" - | "tactic" => "bg-green-100 border-green-500" - | "lemma" => "bg-purple-100 border-purple-500" - | "axiom" => "bg-yellow-100 border-yellow-500" - | _ => "bg-gray-100 border-gray-500" - } - -
-
if hasChildren { - toggleNode(nodeId) - }}> -
- {if hasChildren { - - {React.string(isExpanded ? "▼" : "▶")} - - } else { - {React.string("•")} - }} - - {React.string(nodeType->String.toUpperCase)} - - {React.string(label)} -
-
- - {if hasChildren && isExpanded { -
- {children->Belt.Array.map(child => renderTreeNode(~node=child, ~depth=depth + 1))->React.array} -
- } else { - React.null - }} -
- } - | None => React.null - } - } - - let expandAll = () => { - // Recursively collect all node IDs - let rec collectIds = (node: JSON.t): array => { - switch node->JSON.Decode.object { - | Some(dict) => { - let id = getStringField(dict, "id") - let children = getArrayField(dict, "children") - let childIds = children->Belt.Array.map(collectIds)->Belt.Array.concatMany - [id]->Belt.Array.concat(childIds) - } - | None => [] - } - } - switch treeData { - | Some(data) => { - let allIds = collectIds(data) - setExpandedNodes(_ => Belt.Set.String.fromArray(allIds)) - } - | None => () - } - } - - let collapseAll = () => { - setExpandedNodes(_ => Belt.Set.String.empty) - } - -
-
-
-
-

{React.string("Proof Tree")}

-

- {React.string("Hierarchical view of proof structure")} -

-
-
- - -
-
-
- - {if isLoading { -
-
-

{React.string("Loading proof tree...")}

-
- } else { - switch treeData { - | Some(data) => -
- {renderTreeNode(~node=data, ~depth=0)} -
- | None => -
-

{React.string("No proof tree available")}

-

- {React.string("Start a proof to see the tree structure")} -

-
- } - }} - -
-

- {React.string("Node Types")} -

-
-
-
- {React.string("Goal")} -
-
-
- {React.string("Tactic")} -
-
-
- {React.string("Lemma")} -
-
-
- {React.string("Axiom")} -
-
-
-
-} diff --git a/src/rescript/src/components/ProofViewer.res b/src/rescript/src/components/ProofViewer.res deleted file mode 100644 index 3c571e14..00000000 --- a/src/rescript/src/components/ProofViewer.res +++ /dev/null @@ -1,167 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2025 ECHIDNA Project Team - -/** - * ProofViewer component - Display complete proof state - * Shows proof script, execution history, and prover-specific syntax - */ - -open Store - -@react.component -let make = () => { - let (state, _dispatch) = useStore() - let (showSyntax, setShowSyntax) = React.useState(() => true) - - let getSyntaxHighlightClass = prover => - switch prover { - | Agda => "syntax-agda" - | Coq => "syntax-coq" - | Lean => "syntax-lean" - | Isabelle => "syntax-isabelle" - | Z3 | CVC5 => "syntax-smt" - | Metamath => "syntax-metamath" - | HOLLight | HOL4 => "syntax-hol" - | Mizar => "syntax-mizar" - | PVS => "syntax-pvs" - | ACL2 => "syntax-lisp" - } - - let renderProofLine = (index: int, tactic: string) => { - let syntaxClass = switch state.selectedProver { - | Some(prover) => getSyntaxHighlightClass(prover) - | None => "" - } - -
- - {React.string(Belt.Int.toString(index + 1))} - - - {React.string(tactic)} - -
- } - - let renderProofStats = (proofState: proofState) => { - let totalLines = Belt.Array.length(proofState.proofScript) - let goalsRemaining = Belt.Array.length(proofState.goals) - let progress = if totalLines > 0 && goalsRemaining == 0 { - 100.0 - } else { - 0.0 // Can be enhanced with more sophisticated progress tracking - } - -
-
-

{React.string("Proof Lines")}

-

{React.string(Belt.Int.toString(totalLines))}

-
-
-

{React.string("Goals Left")}

-

- {React.string(Belt.Int.toString(goalsRemaining))} -

-
-
-

{React.string("Progress")}

-

- {React.string(Belt.Float.toString(progress) ++ "%")} -

-
-
- } - -
-
-
-
-

{React.string("Proof Script")}

- {switch state.selectedProver { - | Some(prover) => -

- {React.string(`Prover: ${proverToString(prover)}`)} -

- | None => React.null - }} -
-
- -
-
-
- - {switch state.proofState { - | Some(ps) => - - {renderProofStats(ps)} - {if Belt.Array.length(ps.proofScript) == 0 { -
-

{React.string("No proof steps yet")}

-

- {React.string("Apply tactics to build your proof")} -

-
- } else { -
-
-

- {React.string("PROOF SCRIPT")} -

-
-
- {ps.proofScript->Belt.Array.mapWithIndex(renderProofLine)->React.array} -
-
- }} - - {if ps.completed { -
-
- {React.string("✓")} -
-

- {React.string("Proof Completed!")} -

-

- {React.string("All goals have been successfully proven.")} -

-
-
-
- } else { - React.null - }} -
- | None => -
-

{React.string("No active proof session")}

-

- {React.string("Select a prover and start proving")} -

-
- }} - -
-

- {React.string("Syntax Highlighting")} -

-

- {React.string( - "Proof scripts are displayed with prover-specific syntax highlighting. " ++ - "Each of the 12 provers has its own color scheme and formatting rules.", - )} -

-
-
-} diff --git a/src/rescript/src/components/ProverSelector.res b/src/rescript/src/components/ProverSelector.res deleted file mode 100644 index 1b577743..00000000 --- a/src/rescript/src/components/ProverSelector.res +++ /dev/null @@ -1,124 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2025 ECHIDNA Project Team - -/** - * ProverSelector component - Choose from 12 theorem provers - * Organized by tier with visual indicators - */ - -open Store - -@react.component -let make = (~onSelect: prover => unit) => { - let (state, dispatch) = useStore() - - let handleSelect = (prover: prover) => { - dispatch(SelectProver(prover)) - onSelect(prover) - } - - let tierColor = tier => - switch tier { - | Tier1 => "bg-green-100 border-green-500" - | Tier2 => "bg-blue-100 border-blue-500" - | Tier3 => "bg-yellow-100 border-yellow-500" - | Tier4 => "bg-orange-100 border-orange-500" - } - - let tierLabel = tier => - switch tier { - | Tier1 => "Tier 1: Core" - | Tier2 => "Tier 2: Extended" - | Tier3 => "Tier 3: Specialized" - | Tier4 => "Tier 4: Advanced" - } - - let proversByTier = tier => - Belt.Array.keep(allProvers, p => proverTier(p) == tier) - - let renderProverCard = prover => { - let isSelected = switch state.selectedProver { - | Some(p) => p == prover - | None => false - } - - let tier = proverTier(prover) - let baseClasses = `p-4 rounded-lg border-2 cursor-pointer transition-all hover:shadow-md ${tierColor(tier)}` - let classes = isSelected ? `${baseClasses} ring-2 ring-blue-500 shadow-lg` : baseClasses - -
handleSelect(prover)}> -

{React.string(proverToString(prover))}

-

- {React.string( - switch prover { - | Agda => "Dependently typed language" - | Coq => "Proof assistant with tactics" - | Lean => "Modern proof assistant" - | Isabelle => "HOL-based system" - | Z3 => "SMT solver" - | CVC5 => "SMT solver" - | Metamath => "Minimal logic system" - | HOLLight => "Simple HOL system" - | Mizar => "Mathematical language" - | PVS => "Verification system" - | ACL2 => "Applicative lisp" - | HOL4 => "Higher-order logic" - }, - )} -

-
- } - - let renderTier = tier => { - let provers = proversByTier(tier) - if Array.length(provers) == 0 { - React.null - } else { -
-

{React.string(tierLabel(tier))}

-
- {Belt.Array.map(provers, renderProverCard)->React.array} -
-
- } - } - -
-
-

- {React.string("Select Theorem Prover")} -

-

- {React.string("Choose from 12 integrated theorem provers across 4 tiers")} -

-
- - {switch state.selectedProver { - | Some(prover) => -
-

- {React.string("Selected: ")} - {React.string(proverToString(prover))} -

-
- | None => React.null - }} - -
- {Belt.Array.map([Tier1, Tier2, Tier3, Tier4], renderTier)->React.array} -
- -
-

{React.string("Tier Information")}

-
    -
  • {React.string("• Tier 1: Core provers (6) - Agda, Coq, Lean, Isabelle, Z3, CVC5")}
  • -
  • {React.string("• Tier 2: Extended coverage (3) - Metamath, HOL Light, Mizar")}
  • -
  • {React.string("• Tier 3: Specialized systems (2) - PVS, ACL2")}
  • -
  • {React.string("• Tier 4: Advanced logic (1) - HOL4")}
  • -
-
-
-} diff --git a/src/rescript/src/components/TacticSuggester.res b/src/rescript/src/components/TacticSuggester.res deleted file mode 100644 index 509c80fd..00000000 --- a/src/rescript/src/components/TacticSuggester.res +++ /dev/null @@ -1,186 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2025 ECHIDNA Project Team - -/** - * TacticSuggester component - Neural tactic suggestions - * Displays AI-powered tactic recommendations with confidence scores - */ - -open Store - -@react.component -let make = (~onApplyTactic: string => unit, ~goalId: option) => { - let (state, dispatch) = useStore() - let (isRefreshing, setIsRefreshing) = React.useState(() => false) - - // Fetch suggestions when goal changes - React.useEffect(() => { - switch goalId { - | Some(id) => { - setIsRefreshing(_ => true) - let activeTags = state.aspectTags - ->Belt.Array.keep(tag => tag.active) - ->Belt.Array.map(tag => tag.name) - - let _ = Client.getTacticSuggestions(id, activeTags)->Promise.then(result => { - switch result { - | Ok(suggestions) => { - dispatch(UpdateTacticSuggestions(suggestions)) - setIsRefreshing(_ => false) - Promise.resolve(()) - } - | Error(err) => { - dispatch(SetError(Some(err))) - setIsRefreshing(_ => false) - Promise.resolve(()) - } - } - }) - } - | None => () - } - None - }, [goalId]) - - let confidenceColor = (confidence: float) => - if confidence >= 0.8 { - "bg-green-100 text-green-800" - } else if confidence >= 0.5 { - "bg-yellow-100 text-yellow-800" - } else { - "bg-orange-100 text-orange-800" - } - - let confidenceBar = (confidence: float) => { - let width = (confidence *. 100.0)->Belt.Float.toString ++ "%" - let bgColor = if confidence >= 0.8 { - "bg-green-500" - } else if confidence >= 0.5 { - "bg-yellow-500" - } else { - "bg-orange-500" - } - -
-
-
- } - - let renderAspectTag = (tag: string) => - - {React.string(tag)} - - - let renderSuggestion = (index: int, suggestion: tacticSuggestion) => { - let confidencePercent = (suggestion.confidence *. 100.0)->Belt.Float.toInt->Belt.Int.toString ++ "%" - -
Belt.Int.toString} - className="suggestion-card p-4 mb-3 bg-white border border-gray-300 rounded-lg hover:shadow-md transition-shadow"> -
-
- - {React.string(suggestion.tactic)} - -
- -
- -
-
- - {React.string("Confidence")} - - - {React.string(confidencePercent)} - -
- {confidenceBar(suggestion.confidence)} -
- - {switch suggestion.premise { - | Some(premise) => -
-

- {React.string("Suggested Premise:")} -

- {React.string(premise)} -
- | None => React.null - }} - - {if suggestion.aspectTags->Array.length > 0 { -
-

- {React.string("Aspect Tags:")} -

-
- {suggestion.aspectTags->Belt.Array.map(renderAspectTag)->React.array} -
-
- } else { - React.null - }} -
- } - -
-
-
-

{React.string("Tactic Suggestions")}

-

{React.string("AI-powered recommendations")}

-
- {switch goalId { - | Some(_) => - - | None => React.null - }} -
- - {if isRefreshing { -
-
-

{React.string("Generating suggestions...")}

-
- } else if state.tacticSuggestions->Array.length == 0 { -
-

{React.string("No suggestions available")}

-

- {React.string("Select a goal to get AI-powered tactic suggestions")} -

-
- } else { -
- {state.tacticSuggestions->Belt.Array.mapWithIndex(renderSuggestion)->React.array} -
- }} - - -
-

- {React.string("About Neural Suggestions")} -

-

- {React.string( - "Suggestions are generated using neural premise selection and aspect tagging. " ++ - "Higher confidence scores indicate tactics more likely to succeed. " ++ - "Aspect tags help filter suggestions by domain and technique.", - )} -

-
-
-} diff --git a/src/rescript/src/components/TheoremSearch.res b/src/rescript/src/components/TheoremSearch.res deleted file mode 100644 index c13e9fcd..00000000 --- a/src/rescript/src/components/TheoremSearch.res +++ /dev/null @@ -1,194 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2025 ECHIDNA Project Team - -/** - * TheoremSearch component - Search theorem libraries - * Integrated with OpenCyc ontology and aspect tag filtering - */ - -open Store - -@react.component -let make = (~onSelectTheorem: string => unit) => { - let (state, dispatch) = useStore() - let (isSearching, setIsSearching) = React.useState(() => false) - let (searchInput, setSearchInput) = React.useState(() => "") - - let handleSearch = () => { - if String.length(searchInput) > 0 { - setIsSearching(_ => true) - dispatch(UpdateSearchQuery(searchInput)) - - let activeTags = state.aspectTags - ->Belt.Array.keep(tag => tag.active) - ->Belt.Array.map(tag => tag.name) - - let _ = Client.searchTheorems(searchInput, activeTags)->Promise.then(result => { - switch result { - | Ok(results) => { - dispatch(UpdateSearchResults(results)) - setIsSearching(_ => false) - Promise.resolve(()) - } - | Error(err) => { - dispatch(SetError(Some(err))) - setIsSearching(_ => false) - Promise.resolve(()) - } - } - }) - } - } - - let handleKeyPress = event => { - if event->ReactEvent.Keyboard.key == "Enter" { - handleSearch() - } - } - - let toggleAspectTag = tagName => { - dispatch(ToggleAspectTag(tagName)) - } - - let renderAspectTag = (tag: aspectTag) => { - let classes = tag.active - ? "px-3 py-1 text-sm font-semibold bg-purple-600 text-white rounded-full cursor-pointer hover:bg-purple-700" - : "px-3 py-1 text-sm font-semibold bg-gray-200 text-gray-700 rounded-full cursor-pointer hover:bg-gray-300" - - - } - - let renderResult = (index: int, theorem: string) => -
Belt.Int.toString} - className="result-card p-4 mb-3 bg-white border border-gray-300 rounded-lg hover:shadow-md transition-shadow cursor-pointer" - onClick={_ => onSelectTheorem(theorem)}> -
- {React.string(theorem)} - -
-
- - let renderAspectFilters = () => { - // Group tags by category - let categories = state.aspectTags->Belt.Array.reduce(Belt.Map.String.empty, (acc, tag) => { - let existing = acc->Belt.Map.String.get(tag.category)->Belt.Option.getWithDefault([]) - acc->Belt.Map.String.set(tag.category, existing->Belt.Array.concat([tag])) - }) - - if categories->Belt.Map.String.size == 0 { - React.null - } else { -
-

- {React.string("Filter by Aspect Tags")} -

- {categories - ->Belt.Map.String.toArray - ->Belt.Array.map(((category, tags)) => -
-

- {React.string(category->String.toUpperCase)} -

-
- {tags->Belt.Array.map(renderAspectTag)->React.array} -
-
- ) - ->React.array} -
- } - } - -
-
-

{React.string("Theorem Library")}

-

- {React.string("Search across integrated theorem libraries with aspect tagging")} -

-
- -
-
- { - let value = ReactEvent.Form.target(e)["value"] - setSearchInput(_ => value) - }} - onKeyPress=handleKeyPress - /> - -
-
- - {renderAspectFilters()} - - {if isSearching { -
-
-

{React.string("Searching theorem libraries...")}

-
- } else if String.length(state.searchQuery) == 0 { -
-
{React.string("🔍")}
-

{React.string("Enter a search query to begin")}

-

- {React.string("Search by theorem name, statement, or keywords")} -

-
- } else if Belt.Array.length(state.searchResults) == 0 { -
-

{React.string("No theorems found")}

-

- {React.string(`No results for "${state.searchQuery}"`)} -

-
- } else { -
-
-

- {React.string( - `Found ${Belt.Int.toString(Belt.Array.length(state.searchResults))} ${Belt.Array.length(state.searchResults) == 1 ? "result" : "results"}`, - )} -

-
-
- {state.searchResults->Belt.Array.mapWithIndex(renderResult)->React.array} -
-
- }} - -
-

- {React.string("OpenCyc Integration")} -

-

- {React.string( - "Theorem search is powered by OpenCyc ontology integration, providing " ++ - "semantic understanding and aspect-based filtering across all 12 provers.", - )} -

-
-
-} diff --git a/src/rescript/src/state/Store.res b/src/rescript/src/state/Store.res deleted file mode 100644 index 658eaac3..00000000 --- a/src/rescript/src/state/Store.res +++ /dev/null @@ -1,192 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2025 ECHIDNA Project Team - -// Types for theorem provers -/** - * Application state management for ECHIDNA UI - * Manages proof state, prover selection, and UI state - */ -type proverTier = - | Tier1 // Agda, Coq/Rocq, Lean, Isabelle, Z3, CVC5 - | Tier2 // Metamath, HOL Light, Mizar - | Tier3 // PVS, ACL2 - | Tier4 // HOL4 - -type prover = - | Agda - | Coq - | Lean - | Isabelle - | Z3 - | CVC5 - | Metamath - | HOLLight - | Mizar - | PVS - | ACL2 - | HOL4 - -// Proof state types -type goal = { - id: string, - hypotheses: array, - conclusion: string, - context: array, -} - -type tacticSuggestion = { - tactic: string, - confidence: float, - premise: option, - aspectTags: array, -} - -type proofState = { - goals: array, - currentGoalIndex: int, - proofScript: array, - completed: bool, -} - -type aspectTag = { - name: string, - category: string, // "domain", "difficulty", "technique", etc. - active: bool, -} - -// Application state -type state = { - selectedProver: option, - proofState: option, - tacticSuggestions: array, - aspectTags: array, - searchQuery: string, - searchResults: array, - isLoading: bool, - error: option, -} - -// Actions -type action = - | SelectProver(prover) - | UpdateProofState(proofState) - | UpdateTacticSuggestions(array) - | ApplyTactic(string) - | ToggleAspectTag(string) - | UpdateSearchQuery(string) - | UpdateSearchResults(array) - | SetLoading(bool) - | SetError(option) - | ResetState - -// Helper functions -let proverToString = prover => - switch prover { - | Agda => "Agda" - | Coq => "Coq" - | Lean => "Lean" - | Isabelle => "Isabelle" - | Z3 => "Z3" - | CVC5 => "CVC5" - | Metamath => "Metamath" - | HOLLight => "HOL Light" - | Mizar => "Mizar" - | PVS => "PVS" - | ACL2 => "ACL2" - | HOL4 => "HOL4" - } - -let proverTier = prover => - switch prover { - | Agda | Coq | Lean | Isabelle | Z3 | CVC5 => Tier1 - | Metamath | HOLLight | Mizar => Tier2 - | PVS | ACL2 => Tier3 - | HOL4 => Tier4 - } - -let allProvers = [Agda, Coq, Lean, Isabelle, Z3, CVC5, Metamath, HOLLight, Mizar, PVS, ACL2, HOL4] - -// Initial state -let initialState = { - selectedProver: None, - proofState: None, - tacticSuggestions: [], - aspectTags: [], - searchQuery: "", - searchResults: [], - isLoading: false, - error: None, -} - -// Reducer -let reducer = (state, action) => - switch action { - | SelectProver(prover) => { - ...state, - selectedProver: Some(prover), - error: None, - } - | UpdateProofState(proofState) => { - ...state, - proofState: Some(proofState), - error: None, - } - | UpdateTacticSuggestions(suggestions) => { - ...state, - tacticSuggestions: suggestions, - } - | ApplyTactic(tactic) => // Update proof script - switch state.proofState { - | Some(ps) => { - ...state, - proofState: Some({ - ...ps, - proofScript: Array.concat(ps.proofScript, [tactic]), - }), - } - | None => state - } - | ToggleAspectTag(tagName) => { - let newTags = Belt.Array.map(state.aspectTags, tag => { - if tag.name == tagName { - {...tag, active: !tag.active} - } else { - tag - } - }) - { - ...state, - aspectTags: newTags, - } - } - | UpdateSearchQuery(query) => { - ...state, - searchQuery: query, - } - | UpdateSearchResults(results) => { - ...state, - searchResults: results, - } - | SetLoading(loading) => { - ...state, - isLoading: loading, - } - | SetError(error) => { - ...state, - error, - isLoading: false, - } - | ResetState => initialState - } - -// React context -let context = React.createContext((initialState, (_: action) => ())) - -module Provider = { - let make = React.Context.provider(context) -} - -// Custom hook -let useStore = () => { - React.useContext(context) -} diff --git a/src/rescript/styles/main.css b/src/rescript/styles/main.css deleted file mode 100644 index 5bdb57fd..00000000 --- a/src/rescript/styles/main.css +++ /dev/null @@ -1,370 +0,0 @@ -/* SPDX-License-Identifier: AGPL-3.0-or-later */ -/* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team */ - -/** - * Main stylesheet for ECHIDNA UI - * Tailwind CSS with custom syntax highlighting - */ - -@tailwind base; -@tailwind components; -@tailwind utilities; - -/* Custom styles */ -@layer base { - * { - @apply box-border; - } - - body { - @apply m-0 p-0 font-sans antialiased; - } - - code { - @apply font-mono; - } -} - -@layer components { - /* Syntax highlighting for different provers */ - .syntax-agda { - @apply text-purple-700; - } - - .syntax-coq { - @apply text-blue-700; - } - - .syntax-lean { - @apply text-green-700; - } - - .syntax-isabelle { - @apply text-orange-700; - } - - .syntax-smt { - @apply text-teal-700; - } - - .syntax-metamath { - @apply text-pink-700; - } - - .syntax-hol { - @apply text-indigo-700; - } - - .syntax-mizar { - @apply text-red-700; - } - - .syntax-pvs { - @apply text-yellow-700; - } - - .syntax-lisp { - @apply text-cyan-700; - } - - /* Component-specific styles */ - .goal-card { - transition: all 0.2s ease-in-out; - } - - .goal-card:hover { - transform: translateY(-2px); - } - - .suggestion-card { - transition: all 0.2s ease-in-out; - } - - .suggestion-card:hover { - transform: translateY(-2px); - } - - .result-card { - transition: all 0.2s ease-in-out; - } - - .result-card:hover { - transform: translateY(-2px); - } - - /* Proof tree styles */ - .tree-node { - position: relative; - } - - .node-content { - transition: all 0.2s ease-in-out; - } - - .node-content:hover { - transform: translateX(4px); - } - - /* Loading spinner animation */ - @keyframes spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } - } - - .animate-spin { - animation: spin 1s linear infinite; - } - - /* Aspect tag styles */ - .aspect-tag { - @apply inline-block px-2 py-1 text-xs font-semibold rounded-full mr-1 mb-1; - transition: all 0.2s ease-in-out; - } - - .aspect-tag:hover { - @apply shadow-md; - transform: scale(1.05); - } - - /* Confidence bar animation */ - .confidence-bar { - transition: width 0.3s ease-in-out; - } - - /* Error banner */ - .error-banner { - animation: slideDown 0.3s ease-out; - } - - @keyframes slideDown { - from { - transform: translateY(-100%); - opacity: 0; - } - to { - transform: translateY(0); - opacity: 1; - } - } - - /* Proof completion animation */ - .proof-complete { - animation: fadeIn 0.5s ease-in; - } - - @keyframes fadeIn { - from { - opacity: 0; - transform: scale(0.95); - } - to { - opacity: 1; - transform: scale(1); - } - } - - /* Responsive grid layouts */ - .proof-session-container { - @apply grid gap-6; - } - - @media (min-width: 1024px) { - .proof-session-container { - grid-template-columns: 1fr 1fr; - } - } - - /* Scrollbar styling */ - .custom-scrollbar::-webkit-scrollbar { - width: 8px; - height: 8px; - } - - .custom-scrollbar::-webkit-scrollbar-track { - @apply bg-gray-100 rounded; - } - - .custom-scrollbar::-webkit-scrollbar-thumb { - @apply bg-gray-400 rounded; - } - - .custom-scrollbar::-webkit-scrollbar-thumb:hover { - @apply bg-gray-500; - } - - /* Code block styling */ - pre { - @apply bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto; - } - - pre code { - @apply text-sm leading-relaxed; - } - - /* Button styles */ - .btn { - @apply px-4 py-2 rounded font-semibold transition-all duration-200; - } - - .btn-primary { - @apply bg-blue-600 text-white; - } - - .btn-primary:hover { - @apply bg-blue-700 shadow-md; - } - - .btn-secondary { - @apply bg-gray-200 text-gray-700; - } - - .btn-secondary:hover { - @apply bg-gray-300; - } - - .btn-success { - @apply bg-green-600 text-white; - } - - .btn-success:hover { - @apply bg-green-700 shadow-md; - } - - .btn-danger { - @apply bg-red-600 text-white; - } - - .btn-danger:hover { - @apply bg-red-700 shadow-md; - } - - /* Input styles */ - input[type="text"], - input[type="search"], - textarea { - @apply border border-gray-300 rounded-lg px-4 py-2 w-full; - @apply focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent; - transition: all 0.2s ease-in-out; - } - - /* Card styles */ - .card { - @apply bg-white border border-gray-300 rounded-lg shadow-sm; - } - - .card:hover { - @apply shadow-md; - } - - /* Badge styles */ - .badge { - @apply inline-block px-2 py-1 text-xs font-semibold rounded-full; - } - - .badge-success { - @apply bg-green-100 text-green-800; - } - - .badge-warning { - @apply bg-yellow-100 text-yellow-800; - } - - .badge-danger { - @apply bg-red-100 text-red-800; - } - - .badge-info { - @apply bg-blue-100 text-blue-800; - } - - /* Tooltip styles */ - .tooltip { - @apply relative inline-block; - } - - .tooltip .tooltiptext { - @apply invisible absolute z-10 w-32 bg-gray-900 text-white text-xs rounded-lg py-1 px-2; - @apply bottom-full left-1/2 -ml-16 mb-2; - opacity: 0; - transition: opacity 0.3s; - } - - .tooltip:hover .tooltiptext { - @apply visible; - opacity: 1; - } - - /* Layout utilities */ - .container { - @apply max-w-7xl mx-auto px-4; - } - - /* Typography */ - h1 { - @apply text-4xl font-bold; - } - - h2 { - @apply text-3xl font-bold; - } - - h3 { - @apply text-2xl font-bold; - } - - h4 { - @apply text-xl font-semibold; - } - - h5 { - @apply text-lg font-semibold; - } - - h6 { - @apply text-base font-semibold; - } -} - -@layer utilities { - /* Custom utilities */ - .text-shadow { - text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1); - } - - .box-shadow-lg { - box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); - } - - /* Gradient backgrounds */ - .bg-gradient-primary { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - } - - .bg-gradient-success { - background: linear-gradient(135deg, #84fab0 0%, #8fd3f4 100%); - } - - .bg-gradient-danger { - background: linear-gradient(135deg, #fa709a 0%, #fee140 100%); - } -} - -/* Print styles */ -@media print { - .no-print { - display: none !important; - } - - body { - @apply text-black bg-white; - } - - .proof-script, - .goal-list { - @apply border border-black; - } -} diff --git a/src/rescript/tailwind.config.js b/src/rescript/tailwind.config.js deleted file mode 100644 index f977e83d..00000000 --- a/src/rescript/tailwind.config.js +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// SPDX-FileCopyrightText: 2025 ECHIDNA Project Team - -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: [ - "./index.html", - "./src/**/*.{res,bs.js,js,jsx}", - ], - theme: { - extend: { - colors: { - echidna: { - 50: '#f0f9ff', - 100: '#e0f2fe', - 200: '#bae6fd', - 300: '#7dd3fc', - 400: '#38bdf8', - 500: '#0ea5e9', - 600: '#0284c7', - 700: '#0369a1', - 800: '#075985', - 900: '#0c4a6e', - }, - }, - fontFamily: { - sans: ['Inter', 'system-ui', 'sans-serif'], - mono: ['Fira Code', 'Monaco', 'Courier New', 'monospace'], - }, - animation: { - 'spin': 'spin 1s linear infinite', - 'pulse': 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite', - 'bounce': 'bounce 1s infinite', - }, - }, - }, - plugins: [], -} diff --git a/src/rescript/test-ui.js b/src/rescript/test-ui.js deleted file mode 100644 index adfa5aa6..00000000 --- a/src/rescript/test-ui.js +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -// Quick test of UI API connectivity -const apiBase = 'http://127.0.0.1:8081/api'; - -async function testAPI() { - console.log('Testing ECHIDNA API connectivity...\n'); - - // Test 1: Health check - try { - const health = await fetch(`${apiBase}/health`); - const healthData = await health.json(); - console.log('✓ Health check:', healthData); - } catch (err) { - console.error('✗ Health check failed:', err.message); - } - - // Test 2: Get provers - try { - const provers = await fetch(`${apiBase}/provers`); - const proversData = await provers.json(); - console.log(`✓ Provers: ${proversData.provers.length} available`); - console.log(' Provers:', proversData.provers.map(p => p.name).join(', ')); - } catch (err) { - console.error('✗ Provers failed:', err.message); - } - - // Test 3: Create session - try { - const session = await fetch(`${apiBase}/session/create`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ prover: 'Coq' }) - }); - const sessionData = await session.json(); - console.log('✓ Session created:', sessionData.session_id); - } catch (err) { - console.error('✗ Session creation failed:', err.message); - } - - console.log('\n✓ All API tests passed! Backend is operational.'); -} - -testAPI(); diff --git a/src/rescript/test.html b/src/rescript/test.html deleted file mode 100644 index 967a7e68..00000000 --- a/src/rescript/test.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - ECHIDNA v1.3.0 - Live Integration Test - - - - -
-
-

🦔 ECHIDNA v1.3.0

-

Neurosymbolic Theorem Proving Platform - Live Integration Test

-
- -
- -
-

1. Julia ML API Health

-

Testing: http://127.0.0.1:9000/health

-
Testing...
-
- - -
-

2. Julia ML Inference

-

Testing: Tactic prediction with confidence scores

-
Waiting...
-
- - -
-

3. Rust HTTP API Health

-

Testing: http://127.0.0.1:8081/api/health

-
Waiting...
-
- - -
-

4. End-to-End Integration

-

Testing: UI → Rust → Julia → Models

-
Waiting...
-
- - -
-

5. Live Tactic Suggestion Demo

-
- - -
-
- - -
- -
-
- - - -
-
- - - - From d1da40db7eb6cea931b2e83dd4c1de6387d2b53f Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Fri, 7 Aug 2026 14:36:59 +0100 Subject: [PATCH 5/5] chore(licence): hold the specification surface at MPL-2.0 for standards work MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner ruling. Palimpsest is MPL-2.0 with ethical provisions layered on top, so MPL-2.0 is the faithful reduction wherever the Palimpsest layer is not being asserted — and MPL is what a standards body can work with, where AGPL's strong copyleft would obstruct adoption and re-publication. Split is now four parts (was three): application code AGPL-3.0-or-later 756 files SPECIFICATION SURFACE MPL-2.0 .machine_readable/ (A2ML descriptiles, contractiles, K9 configs, anchors, policies), 0-AI-MANIFEST.a2ml, package + container manifests, and the OCI image labels emitted by stapeln / svalinn documentation CC-BY-SA-4.0 101 files echidna-playground/ MPL-2.0 unchanged MPL-2.0 total: 131 files. Files that previously offered Palimpsest-0.6 now carry MPL-2.0 rather than AGPL, per the same reasoning. The AGPL umbrella still governs the combined work — MPL s3.3 (Secondary Licenses) is what lets the MPL parts sit inside it — but each MPL part remains individually available under MPL, which is the property the standards path needs. NOTICE, .reuse/dep5, CONTRIBUTING.adoc, README, CLAUDE.md, humans.txt, docs/DEBT.md and both wiki pages restated for four parts, each spelling out WHY the specification surface is weak-copyleft rather than leaving a future reader to guess and 'fix' it back to AGPL. Verified: SPDX still line 1 on all 30 workflows. Co-Authored-By: Claude Opus 5 --- .containerization/Containerfile | 2 +- .containerization/Containerfile.full | 2 +- .containerization/Containerfile.mcp | 2 +- .containerization/Containerfile.wave3 | 18 ++--- .githooks/pre-commit | 2 +- .machine_readable/ADJUST.contractile | 2 +- .machine_readable/CLADE.a2ml | 2 +- .machine_readable/ER.a2ml | 2 +- .machine_readable/INTENT.contractile | 2 +- .machine_readable/MUST.contractile | 2 +- .machine_readable/ROADMAP.a2ml | 2 +- .machine_readable/TRUST.contractile | 2 +- .machine_readable/ai/AI.a2ml | 2 +- .machine_readable/anchors/ANCHOR.a2ml | 4 +- .../bot_directives/coverage.a2ml | 2 +- .machine_readable/bot_directives/debt.a2ml | 2 +- .../bot_directives/echidnabot.a2ml | 2 +- .../bot_directives/methodology.a2ml | 2 +- .machine_readable/contractiles/INDEX.a2ml | 2 +- .machine_readable/contractiles/_base.ncl | 2 +- .../contractiles/adjust/Adjustfile.a2ml | 2 +- .../contractiles/adjust/adjust.k9.ncl | 2 +- .../contractiles/adjust/adjust.manifest.a2ml | 2 +- .../contractiles/adjust/adjust.ncl | 2 +- .../contractiles/bust/Bustfile.a2ml | 2 +- .../contractiles/bust/bust.k9.ncl | 2 +- .../contractiles/bust/bust.manifest.a2ml | 2 +- .machine_readable/contractiles/bust/bust.ncl | 2 +- .../contractiles/dust/Dustfile.a2ml | 2 +- .../contractiles/dust/dust.k9.ncl | 2 +- .../contractiles/dust/dust.manifest.a2ml | 2 +- .machine_readable/contractiles/dust/dust.ncl | 2 +- .../contractiles/intend/Intentfile.a2ml | 2 +- .../contractiles/intend/intend.k9.ncl | 2 +- .../contractiles/intend/intend.manifest.a2ml | 2 +- .../contractiles/intend/intend.ncl | 2 +- .../contractiles/must/Mustfile.a2ml | 2 +- .../contractiles/must/must.k9.ncl | 2 +- .../contractiles/must/must.manifest.a2ml | 2 +- .machine_readable/contractiles/must/must.ncl | 2 +- .../contractiles/trust/Trustfile.a2ml | 2 +- .../contractiles/trust/trust.k9.ncl | 2 +- .../contractiles/trust/trust.manifest.a2ml | 2 +- .../contractiles/trust/trust.ncl | 2 +- .machine_readable/deployment.a2ml | 2 +- .machine_readable/descriptiles/AGENTIC.a2ml | 2 +- .machine_readable/descriptiles/ANCHOR.a2ml | 2 +- .machine_readable/descriptiles/ECOSYSTEM.a2ml | 2 +- .machine_readable/descriptiles/META.a2ml | 4 +- .machine_readable/descriptiles/NEUROSYM.a2ml | 2 +- .machine_readable/descriptiles/PLAYBOOK.a2ml | 2 +- .machine_readable/descriptiles/STATE.a2ml | 2 +- .../integrations/feedback-o-tron.a2ml | 2 +- .machine_readable/integrations/proven.a2ml | 2 +- .machine_readable/integrations/verisim.a2ml | 2 +- .machine_readable/integrations/vexometer.a2ml | 2 +- .../policies/MAINTENANCE-AXES.a2ml | 2 +- .../policies/MAINTENANCE-CHECKLIST.a2ml | 2 +- .../SOFTWARE-DEVELOPMENT-APPROACH.a2ml | 2 +- .machine_readable/provers.a2ml | 2 +- .machine_readable/setup-prover-env.k9.ncl | 2 +- .../svc/k9/examples/ci-config.k9.ncl | 2 +- .../svc/k9/examples/project-metadata.k9.ncl | 4 +- .../svc/k9/examples/setup-repo.k9.ncl | 2 +- .machine_readable/svc/k9/template-hunt.k9.ncl | 2 +- .../svc/k9/template-kennel.k9.ncl | 2 +- .machine_readable/svc/k9/template-yard.k9.ncl | 2 +- .reuse/dep5 | 32 ++++++-- .trivyignore | 2 +- .well-known/humans.txt | 2 +- 0-AI-MANIFEST.a2ml | 4 +- CLAUDE.md | 29 +++++--- CONTRIBUTING.adoc | 14 +++- Containerfile | 2 +- NOTICE | 73 ++++++++++++------- README.md | 17 +++-- container/Containerfile | 2 +- container/manifest.toml | 4 +- docs-site/.well-known/aibdp.json | 2 +- docs/DEBT.md | 34 ++++++--- docs/wiki/FAQ.md | 29 +++++--- docs/wiki/Home.md | 4 +- examples/simple_proof.v | 2 +- proofs/acl2/associativity.lisp | 2 +- proofs/acl2/binary_trees.lisp | 2 +- proofs/acl2/factorial.lisp | 2 +- proofs/acl2/list_append.lisp | 2 +- proofs/acl2/sorting.lisp | 2 +- proofs/agda/Basic.agda | 2 +- proofs/hol4/arithmetic.sml | 2 +- proofs/hol4/binary_tree.sml | 2 +- proofs/hol4/list_append.sml | 2 +- proofs/hol4/set_theory.sml | 2 +- proofs/hol4/sorting.sml | 2 +- proofs/pvs/arithmetic.pvs | 2 +- proofs/pvs/binary_search.pvs | 2 +- proofs/pvs/list_theory.pvs | 2 +- proofs/pvs/set_theory.pvs | 2 +- proofs/pvs/sorting.pvs | 2 +- rules/security_learning.lgt | 2 +- scripts/build-production.sh | 2 +- scripts/demo-proof.sh | 2 +- scripts/expand_training_data.sh | 2 +- scripts/test-integration.sh | 2 +- spark/axiom_tracker/alire.toml | 2 +- spark/certificates/alire.toml | 2 +- spark/solver_integrity/alire.toml | 2 +- src/abi/echidnaabi.ipkg | 4 +- src/idris/echidna-validator.ipkg | 4 +- src/julia/test_server.jl | 2 +- src/zig/ffi/echidna_ffi.h | 2 +- stapeln.toml | 4 +- 112 files changed, 278 insertions(+), 194 deletions(-) diff --git a/.containerization/Containerfile b/.containerization/Containerfile index a0884b7f..af3a9f9a 100644 --- a/.containerization/Containerfile +++ b/.containerization/Containerfile @@ -92,7 +92,7 @@ FROM docker.io/library/debian:bookworm-slim LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA - Extensible Cognitive Hybrid Intelligence for Deductive Neural Assistance" -LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.licenses="MPL-2.0" LABEL org.opencontainers.image.version="1.5.0" LABEL org.opencontainers.image.vendor="hyperpolymath" diff --git a/.containerization/Containerfile.full b/.containerization/Containerfile.full index 529f3519..139fc4f5 100644 --- a/.containerization/Containerfile.full +++ b/.containerization/Containerfile.full @@ -187,7 +187,7 @@ FROM docker.io/library/debian:bookworm-slim LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA Full - Curated prover set + VeriSimDB + Guix" -LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.licenses="MPL-2.0" LABEL org.opencontainers.image.version="1.5.0" LABEL org.opencontainers.image.vendor="hyperpolymath" diff --git a/.containerization/Containerfile.mcp b/.containerization/Containerfile.mcp index b9a4c1b5..a0d3fabd 100644 --- a/.containerization/Containerfile.mcp +++ b/.containerization/Containerfile.mcp @@ -114,7 +114,7 @@ FROM docker.io/library/debian:bookworm-slim LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA MCP server — AI-agent-callable theorem proving over stdio" -LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.licenses="MPL-2.0" LABEL org.opencontainers.image.version="2.1.0" # Runtime deps: the MVP provers + dynamic libs + perl/fontconfig for Isabelle. diff --git a/.containerization/Containerfile.wave3 b/.containerization/Containerfile.wave3 index 452cff16..f736c0b0 100644 --- a/.containerization/Containerfile.wave3 +++ b/.containerization/Containerfile.wave3 @@ -139,7 +139,7 @@ FROM docker.io/library/debian:bookworm-slim AS tamarin LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + Tamarin Prover - security protocol analysis" -LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.licenses="MPL-2.0" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -252,7 +252,7 @@ FROM docker.io/library/debian:bookworm-slim AS proverif LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + ProVerif - cryptographic protocol verification" -LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.licenses="MPL-2.0" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -340,7 +340,7 @@ FROM docker.io/library/debian:bookworm-slim AS scip LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + SCIP - constraint integer programming solver" -LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.licenses="MPL-2.0" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -435,7 +435,7 @@ FROM docker.io/library/debian:bookworm-slim AS or-tools LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + OR-Tools C++ library - combinatorial optimisation via FFI" -LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.licenses="MPL-2.0" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -559,7 +559,7 @@ FROM docker.io/library/debian:bookworm-slim AS hol4 LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + HOL4 - higher-order logic theorem prover" -LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.licenses="MPL-2.0" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -645,7 +645,7 @@ FROM docker.io/library/debian:bookworm-slim AS acl2 LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + ACL2 - applicative Common Lisp logic prover" -LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.licenses="MPL-2.0" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -733,7 +733,7 @@ FROM docker.io/library/debian:bookworm-slim AS twelf LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + Twelf - LF meta-logical framework" -LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.licenses="MPL-2.0" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -858,7 +858,7 @@ FROM docker.io/library/debian:bookworm-slim AS metamath LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + Metamath - metamath-exe CLI verifier with bundled databases" -LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.licenses="MPL-2.0" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" @@ -948,7 +948,7 @@ FROM docker.io/library/debian:bookworm-slim AS imandra LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA + Imandra stub (proprietary licence required for real binary)" -LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.licenses="MPL-2.0" LABEL org.opencontainers.image.version="2.3.0" LABEL org.opencontainers.image.vendor="hyperpolymath" diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 518b9033..d61f3b52 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -3,7 +3,7 @@ # ECHIDNA Pre-commit Hook # Enforces npm ban and runs checks # -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 set -euo pipefail diff --git a/.machine_readable/ADJUST.contractile b/.machine_readable/ADJUST.contractile index c82c6685..0b50760c 100644 --- a/.machine_readable/ADJUST.contractile +++ b/.machine_readable/ADJUST.contractile @@ -1,4 +1,4 @@ -; SPDX-License-Identifier: AGPL-3.0-or-later +; SPDX-License-Identifier: MPL-2.0 ; ADJUST.contractile — Accessibility invariants for echidna ; "ADJUST" = Accessibility & Digital Justice for Universal Software & Technology ; diff --git a/.machine_readable/CLADE.a2ml b/.machine_readable/CLADE.a2ml index ced9d944..bd8caffd 100644 --- a/.machine_readable/CLADE.a2ml +++ b/.machine_readable/CLADE.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Clade declaration — part of the gv-clade-index registry [manifest] diff --git a/.machine_readable/ER.a2ml b/.machine_readable/ER.a2ml index add0fd14..02b133b6 100644 --- a/.machine_readable/ER.a2ml +++ b/.machine_readable/ER.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # ER.a2ml — Canonical Entity-Relationship model for ECHIDNA diff --git a/.machine_readable/INTENT.contractile b/.machine_readable/INTENT.contractile index 70a26a88..b46a91fe 100644 --- a/.machine_readable/INTENT.contractile +++ b/.machine_readable/INTENT.contractile @@ -1,4 +1,4 @@ -; SPDX-License-Identifier: AGPL-3.0-or-later +; SPDX-License-Identifier: MPL-2.0 ; INTENT.contractile — Purpose and scope for echidna ; Helps LLM/SLM agents understand what this repo IS and IS NOT. diff --git a/.machine_readable/MUST.contractile b/.machine_readable/MUST.contractile index 32598cb7..6830a6b7 100644 --- a/.machine_readable/MUST.contractile +++ b/.machine_readable/MUST.contractile @@ -1,4 +1,4 @@ -; SPDX-License-Identifier: AGPL-3.0-or-later +; SPDX-License-Identifier: MPL-2.0 ; MUST.contractile — Baseline invariants for echidna ; These constraints MUST NOT be violated. K9 validators enforce them. diff --git a/.machine_readable/ROADMAP.a2ml b/.machine_readable/ROADMAP.a2ml index 037f6abc..25f73840 100644 --- a/.machine_readable/ROADMAP.a2ml +++ b/.machine_readable/ROADMAP.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # ROADMAP.a2ml — 8-Stage Service Architecture for Echidna diff --git a/.machine_readable/TRUST.contractile b/.machine_readable/TRUST.contractile index 4a0564fc..1ec8fa5b 100644 --- a/.machine_readable/TRUST.contractile +++ b/.machine_readable/TRUST.contractile @@ -1,4 +1,4 @@ -; SPDX-License-Identifier: AGPL-3.0-or-later +; SPDX-License-Identifier: MPL-2.0 ; TRUST.contractile — Trust boundaries for echidna ; Defines what LLM/SLM agents are trusted to do without asking. diff --git a/.machine_readable/ai/AI.a2ml b/.machine_readable/ai/AI.a2ml index 7740cd7e..7260b8cc 100644 --- a/.machine_readable/ai/AI.a2ml +++ b/.machine_readable/ai/AI.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # ECHIDNA AI configuration (machine-readable) [metadata] diff --git a/.machine_readable/anchors/ANCHOR.a2ml b/.machine_readable/anchors/ANCHOR.a2ml index f7c0e620..3e25104f 100644 --- a/.machine_readable/anchors/ANCHOR.a2ml +++ b/.machine_readable/anchors/ANCHOR.a2ml @@ -1,11 +1,11 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Canonical authority anchor for ECHIDNA [anchor] canonical-repo = "https://github.com/hyperpolymath/echidna" canonical-owner = "hyperpolymath" canonical-author = "Jonathan D.A. Jewell " -canonical-license = "AGPL-3.0-or-later" +canonical-license = "MPL-2.0" mirrors = [ "https://gitlab.com/hyperpolymath/echidna", ] diff --git a/.machine_readable/bot_directives/coverage.a2ml b/.machine_readable/bot_directives/coverage.a2ml index 639dbae6..69796642 100644 --- a/.machine_readable/bot_directives/coverage.a2ml +++ b/.machine_readable/bot_directives/coverage.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # coverage.a2ml — Session coverage tracking diff --git a/.machine_readable/bot_directives/debt.a2ml b/.machine_readable/bot_directives/debt.a2ml index 784d7d6f..c0238c5d 100644 --- a/.machine_readable/bot_directives/debt.a2ml +++ b/.machine_readable/bot_directives/debt.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # debt.a2ml — Meander debt list diff --git a/.machine_readable/bot_directives/echidnabot.a2ml b/.machine_readable/bot_directives/echidnabot.a2ml index f1dbbcdd..eda6aa1a 100644 --- a/.machine_readable/bot_directives/echidnabot.a2ml +++ b/.machine_readable/bot_directives/echidnabot.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Copyright (c) 2026 Jonathan D.A. Jewell # # echidnabot directive for the echidna repo. diff --git a/.machine_readable/bot_directives/methodology.a2ml b/.machine_readable/bot_directives/methodology.a2ml index eaa7c529..5b74cdd7 100644 --- a/.machine_readable/bot_directives/methodology.a2ml +++ b/.machine_readable/bot_directives/methodology.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # methodology.a2ml — AI agent methodology configuration diff --git a/.machine_readable/contractiles/INDEX.a2ml b/.machine_readable/contractiles/INDEX.a2ml index cdedfbe4..36b9d6f3 100644 --- a/.machine_readable/contractiles/INDEX.a2ml +++ b/.machine_readable/contractiles/INDEX.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # INDEX.a2ml — Contractile Registry # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/_base.ncl b/.machine_readable/contractiles/_base.ncl index a30c5548..22306faf 100644 --- a/.machine_readable/contractiles/_base.ncl +++ b/.machine_readable/contractiles/_base.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # (MPL-2.0 is automatic legal fallback until PMPL is formally recognised) # # _base.ncl — Shared contractile base diff --git a/.machine_readable/contractiles/adjust/Adjustfile.a2ml b/.machine_readable/contractiles/adjust/Adjustfile.a2ml index be275c56..97204d6f 100644 --- a/.machine_readable/contractiles/adjust/Adjustfile.a2ml +++ b/.machine_readable/contractiles/adjust/Adjustfile.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Adjustfile (A2ML Canonical) # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/.machine_readable/contractiles/adjust/adjust.k9.ncl b/.machine_readable/contractiles/adjust/adjust.k9.ncl index 6b8ecded..4974ba7f 100644 --- a/.machine_readable/contractiles/adjust/adjust.k9.ncl +++ b/.machine_readable/contractiles/adjust/adjust.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # adjust.k9.ncl — K9 trust-tier component of the adjust trident # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/adjust/adjust.manifest.a2ml b/.machine_readable/contractiles/adjust/adjust.manifest.a2ml index e23d57bf..f28f94d0 100644 --- a/.machine_readable/contractiles/adjust/adjust.manifest.a2ml +++ b/.machine_readable/contractiles/adjust/adjust.manifest.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # adjust.manifest.a2ml — Trident coherence manifest for the adjust verb. # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/adjust/adjust.ncl b/.machine_readable/contractiles/adjust/adjust.ncl index cdceb191..d6c24f0e 100644 --- a/.machine_readable/contractiles/adjust/adjust.ncl +++ b/.machine_readable/contractiles/adjust/adjust.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Adjust — accessibility runner # # Pairs with: Adjustfile.a2ml (same directory) diff --git a/.machine_readable/contractiles/bust/Bustfile.a2ml b/.machine_readable/contractiles/bust/Bustfile.a2ml index cbf5f1ec..b356c5e9 100644 --- a/.machine_readable/contractiles/bust/Bustfile.a2ml +++ b/.machine_readable/contractiles/bust/Bustfile.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Bustfile (A2ML Canonical) # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/.machine_readable/contractiles/bust/bust.k9.ncl b/.machine_readable/contractiles/bust/bust.k9.ncl index 36f1ea63..0740076b 100644 --- a/.machine_readable/contractiles/bust/bust.k9.ncl +++ b/.machine_readable/contractiles/bust/bust.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # bust.k9.ncl — K9 trust-tier component of the bust trident # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/bust/bust.manifest.a2ml b/.machine_readable/contractiles/bust/bust.manifest.a2ml index fa1d5eba..f8c8ac46 100644 --- a/.machine_readable/contractiles/bust/bust.manifest.a2ml +++ b/.machine_readable/contractiles/bust/bust.manifest.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # bust.manifest.a2ml — Trident coherence manifest for the bust verb. # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/bust/bust.ncl b/.machine_readable/contractiles/bust/bust.ncl index 8fc9106f..fc8cb8cd 100644 --- a/.machine_readable/contractiles/bust/bust.ncl +++ b/.machine_readable/contractiles/bust/bust.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Bust — error-handling / failure-recovery runner # # Pairs with: Bustfile.a2ml (same directory) diff --git a/.machine_readable/contractiles/dust/Dustfile.a2ml b/.machine_readable/contractiles/dust/Dustfile.a2ml index 8d336653..29609258 100644 --- a/.machine_readable/contractiles/dust/Dustfile.a2ml +++ b/.machine_readable/contractiles/dust/Dustfile.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Dustfile (A2ML Canonical) # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/.machine_readable/contractiles/dust/dust.k9.ncl b/.machine_readable/contractiles/dust/dust.k9.ncl index 70298aab..0e06cbd5 100644 --- a/.machine_readable/contractiles/dust/dust.k9.ncl +++ b/.machine_readable/contractiles/dust/dust.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # dust.k9.ncl — K9 trust-tier component of the dust trident # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/dust/dust.manifest.a2ml b/.machine_readable/contractiles/dust/dust.manifest.a2ml index 816b2c45..fd9c3efa 100644 --- a/.machine_readable/contractiles/dust/dust.manifest.a2ml +++ b/.machine_readable/contractiles/dust/dust.manifest.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # dust.manifest.a2ml — Trident coherence manifest for the dust verb. # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/dust/dust.ncl b/.machine_readable/contractiles/dust/dust.ncl index c37cacef..204cb6b8 100644 --- a/.machine_readable/contractiles/dust/dust.ncl +++ b/.machine_readable/contractiles/dust/dust.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Dust — fine-grained recovery / broom-and-pan cleanup runner # # Pairs with: Dustfile.a2ml (same directory) diff --git a/.machine_readable/contractiles/intend/Intentfile.a2ml b/.machine_readable/contractiles/intend/Intentfile.a2ml index 9f9903f5..142c083f 100644 --- a/.machine_readable/contractiles/intend/Intentfile.a2ml +++ b/.machine_readable/contractiles/intend/Intentfile.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Intentfile (A2ML Canonical) # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/.machine_readable/contractiles/intend/intend.k9.ncl b/.machine_readable/contractiles/intend/intend.k9.ncl index 83ad7b3c..59c4d48e 100644 --- a/.machine_readable/contractiles/intend/intend.k9.ncl +++ b/.machine_readable/contractiles/intend/intend.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # intend.k9.ncl — K9 trust-tier component of the intend trident # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/intend/intend.manifest.a2ml b/.machine_readable/contractiles/intend/intend.manifest.a2ml index 24c680d7..b9b07478 100644 --- a/.machine_readable/contractiles/intend/intend.manifest.a2ml +++ b/.machine_readable/contractiles/intend/intend.manifest.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # intend.manifest.a2ml — Trident coherence manifest for the intend verb. # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/intend/intend.ncl b/.machine_readable/contractiles/intend/intend.ncl index c89592b2..2bace3be 100644 --- a/.machine_readable/contractiles/intend/intend.ncl +++ b/.machine_readable/contractiles/intend/intend.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Intend — north-star runner (verb is `intend`, file is `Intentfile.a2ml`) # # Pairs with: Intentfile.a2ml (same directory) diff --git a/.machine_readable/contractiles/must/Mustfile.a2ml b/.machine_readable/contractiles/must/Mustfile.a2ml index 474eff82..527ff777 100644 --- a/.machine_readable/contractiles/must/Mustfile.a2ml +++ b/.machine_readable/contractiles/must/Mustfile.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Mustfile (A2ML Canonical) # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/.machine_readable/contractiles/must/must.k9.ncl b/.machine_readable/contractiles/must/must.k9.ncl index 6bdb3c23..2a7224ac 100644 --- a/.machine_readable/contractiles/must/must.k9.ncl +++ b/.machine_readable/contractiles/must/must.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # must.k9.ncl — K9 trust-tier component of the must trident # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/must/must.manifest.a2ml b/.machine_readable/contractiles/must/must.manifest.a2ml index 49eee394..c4225ad4 100644 --- a/.machine_readable/contractiles/must/must.manifest.a2ml +++ b/.machine_readable/contractiles/must/must.manifest.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # must.manifest.a2ml — Trident coherence manifest for the must verb. # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/must/must.ncl b/.machine_readable/contractiles/must/must.ncl index 1a7b7f6e..416441c0 100644 --- a/.machine_readable/contractiles/must/must.ncl +++ b/.machine_readable/contractiles/must/must.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Must — invariants runner # # Pairs with: Mustfile.a2ml (same directory) diff --git a/.machine_readable/contractiles/trust/Trustfile.a2ml b/.machine_readable/contractiles/trust/Trustfile.a2ml index a0828f4b..9ebf11d1 100644 --- a/.machine_readable/contractiles/trust/Trustfile.a2ml +++ b/.machine_readable/contractiles/trust/Trustfile.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Trustfile (A2ML Canonical) # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) diff --git a/.machine_readable/contractiles/trust/trust.k9.ncl b/.machine_readable/contractiles/trust/trust.k9.ncl index 973fbc76..fd0f5eb3 100644 --- a/.machine_readable/contractiles/trust/trust.k9.ncl +++ b/.machine_readable/contractiles/trust/trust.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # trust.k9.ncl — K9 trust-tier component of the trust trident # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/trust/trust.manifest.a2ml b/.machine_readable/contractiles/trust/trust.manifest.a2ml index 7b659829..142e8528 100644 --- a/.machine_readable/contractiles/trust/trust.manifest.a2ml +++ b/.machine_readable/contractiles/trust/trust.manifest.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # trust.manifest.a2ml — Trident coherence manifest for the trust verb. # Author: Jonathan D.A. Jewell # diff --git a/.machine_readable/contractiles/trust/trust.ncl b/.machine_readable/contractiles/trust/trust.ncl index 6404bc65..5ff0e139 100644 --- a/.machine_readable/contractiles/trust/trust.ncl +++ b/.machine_readable/contractiles/trust/trust.ncl @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Trust — security + provenance + safe-hacking runner # # Pairs with: Trustfile.a2ml (same directory) diff --git a/.machine_readable/deployment.a2ml b/.machine_readable/deployment.a2ml index 97890a12..b72e237c 100644 --- a/.machine_readable/deployment.a2ml +++ b/.machine_readable/deployment.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # deployment.a2ml — public hosting topology for ECHIDNA. diff --git a/.machine_readable/descriptiles/AGENTIC.a2ml b/.machine_readable/descriptiles/AGENTIC.a2ml index 17ba7cd1..c855c1e3 100644 --- a/.machine_readable/descriptiles/AGENTIC.a2ml +++ b/.machine_readable/descriptiles/AGENTIC.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # AGENTIC.a2ml — AI agent operational gating and proof-solving dispatch diff --git a/.machine_readable/descriptiles/ANCHOR.a2ml b/.machine_readable/descriptiles/ANCHOR.a2ml index c3842d24..dec155a1 100644 --- a/.machine_readable/descriptiles/ANCHOR.a2ml +++ b/.machine_readable/descriptiles/ANCHOR.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # ⚓ ANCHOR: rsr-template-repo # Canonical authority and project recalibration trigger for rsr-template-repo. # Template from: https://github.com/hyperpolymath/standards diff --git a/.machine_readable/descriptiles/ECOSYSTEM.a2ml b/.machine_readable/descriptiles/ECOSYSTEM.a2ml index 7c3a7393..9405b21f 100644 --- a/.machine_readable/descriptiles/ECOSYSTEM.a2ml +++ b/.machine_readable/descriptiles/ECOSYSTEM.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # ECOSYSTEM.a2ml — Ecosystem position for echidna diff --git a/.machine_readable/descriptiles/META.a2ml b/.machine_readable/descriptiles/META.a2ml index 392ae55d..8a2759b4 100644 --- a/.machine_readable/descriptiles/META.a2ml +++ b/.machine_readable/descriptiles/META.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # META.a2ml — Project meta-information # Converted from META.scm on 2026-03-15 @@ -6,7 +6,7 @@ project = "echidna" full-name = "Extensible Cognitive Hybrid Intelligence for Deductive Neural Assistance" author = "Jonathan D.A. Jewell " -license = "AGPL-3.0-or-later" +license = "MPL-2.0" standard = "RSR 2026" version = "2.2.0" last-updated = "2026-04-28" diff --git a/.machine_readable/descriptiles/NEUROSYM.a2ml b/.machine_readable/descriptiles/NEUROSYM.a2ml index a22c0530..71813dd1 100644 --- a/.machine_readable/descriptiles/NEUROSYM.a2ml +++ b/.machine_readable/descriptiles/NEUROSYM.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # NEUROSYM.a2ml — Neurosymbolic semantics for proof-solving operations diff --git a/.machine_readable/descriptiles/PLAYBOOK.a2ml b/.machine_readable/descriptiles/PLAYBOOK.a2ml index b4dbb664..e9b3b981 100644 --- a/.machine_readable/descriptiles/PLAYBOOK.a2ml +++ b/.machine_readable/descriptiles/PLAYBOOK.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) # # PLAYBOOK.a2ml — Operational playbook diff --git a/.machine_readable/descriptiles/STATE.a2ml b/.machine_readable/descriptiles/STATE.a2ml index afdff1c4..7e6cda40 100644 --- a/.machine_readable/descriptiles/STATE.a2ml +++ b/.machine_readable/descriptiles/STATE.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # STATE.a2ml — Project state checkpoint [manifest] diff --git a/.machine_readable/integrations/feedback-o-tron.a2ml b/.machine_readable/integrations/feedback-o-tron.a2ml index 0a8bb783..5381604e 100644 --- a/.machine_readable/integrations/feedback-o-tron.a2ml +++ b/.machine_readable/integrations/feedback-o-tron.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Feedback-o-Tron Integration — Autonomous Bug Reporting [integration] diff --git a/.machine_readable/integrations/proven.a2ml b/.machine_readable/integrations/proven.a2ml index 2807f00d..0f9138ce 100644 --- a/.machine_readable/integrations/proven.a2ml +++ b/.machine_readable/integrations/proven.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Proven Integration — Formally Verified Safety Library [integration] diff --git a/.machine_readable/integrations/verisim.a2ml b/.machine_readable/integrations/verisim.a2ml index 141fa265..164c5229 100644 --- a/.machine_readable/integrations/verisim.a2ml +++ b/.machine_readable/integrations/verisim.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # VeriSimDB Feed — Cross-Repo Analytics Data Store [integration] diff --git a/.machine_readable/integrations/vexometer.a2ml b/.machine_readable/integrations/vexometer.a2ml index e1081208..238b3d2c 100644 --- a/.machine_readable/integrations/vexometer.a2ml +++ b/.machine_readable/integrations/vexometer.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Vexometer Integration — Irritation Surface Analysis [integration] diff --git a/.machine_readable/policies/MAINTENANCE-AXES.a2ml b/.machine_readable/policies/MAINTENANCE-AXES.a2ml index c6ba2071..1589ab77 100644 --- a/.machine_readable/policies/MAINTENANCE-AXES.a2ml +++ b/.machine_readable/policies/MAINTENANCE-AXES.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # ECHIDNA Maintenance Axes [metadata] diff --git a/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml b/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml index 15bcb9d7..bb35329b 100644 --- a/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml +++ b/.machine_readable/policies/MAINTENANCE-CHECKLIST.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # ECHIDNA Maintenance Checklist (machine-readable pointer) [metadata] diff --git a/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml b/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml index 3fc8ac02..733b987a 100644 --- a/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml +++ b/.machine_readable/policies/SOFTWARE-DEVELOPMENT-APPROACH.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # ECHIDNA Software Development Approach (machine-readable pointer) [metadata] diff --git a/.machine_readable/provers.a2ml b/.machine_readable/provers.a2ml index b1ce0b61..30abeb4a 100644 --- a/.machine_readable/provers.a2ml +++ b/.machine_readable/provers.a2ml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell # # provers.a2ml — Authoritative enumeration of ECHIDNA prover backends. diff --git a/.machine_readable/setup-prover-env.k9.ncl b/.machine_readable/setup-prover-env.k9.ncl index b1ae19e8..4354ae8b 100644 --- a/.machine_readable/setup-prover-env.k9.ncl +++ b/.machine_readable/setup-prover-env.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # ECHIDNA Theorem Prover Environment Setup # # This K9 component automates the installation and configuration of ECHIDNA's diff --git a/.machine_readable/svc/k9/examples/ci-config.k9.ncl b/.machine_readable/svc/k9/examples/ci-config.k9.ncl index 996ac0ab..485a9173 100644 --- a/.machine_readable/svc/k9/examples/ci-config.k9.ncl +++ b/.machine_readable/svc/k9/examples/ci-config.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Example Yard-level K9 component: CI/CD configuration with validation # Security Level: Yard (Nickel evaluation, contract validation) # Signature recommended but not required diff --git a/.machine_readable/svc/k9/examples/project-metadata.k9.ncl b/.machine_readable/svc/k9/examples/project-metadata.k9.ncl index a2627490..f5bec22b 100644 --- a/.machine_readable/svc/k9/examples/project-metadata.k9.ncl +++ b/.machine_readable/svc/k9/examples/project-metadata.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Example Kennel-level K9 component: Project metadata # Security Level: Kennel (pure data, no execution) # No signature required @@ -40,7 +40,7 @@ K9! organization = "The Open University", }, - license = "AGPL-3.0-or-later", + license = "MPL-2.0", keywords = [ "rhodium-standard", diff --git a/.machine_readable/svc/k9/examples/setup-repo.k9.ncl b/.machine_readable/svc/k9/examples/setup-repo.k9.ncl index d1a10aea..45eef0e6 100644 --- a/.machine_readable/svc/k9/examples/setup-repo.k9.ncl +++ b/.machine_readable/svc/k9/examples/setup-repo.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Example Hunt-level K9 component: Repository setup automation # Security Level: Hunt (full execution with Just recipes) # ⚠️ SIGNATURE REQUIRED - DO NOT RUN WITHOUT VERIFICATION diff --git a/.machine_readable/svc/k9/template-hunt.k9.ncl b/.machine_readable/svc/k9/template-hunt.k9.ncl index 77ce03a6..e12eabfe 100644 --- a/.machine_readable/svc/k9/template-hunt.k9.ncl +++ b/.machine_readable/svc/k9/template-hunt.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # K9 Hunt-level template: Full execution with Just recipes # Security Level: Hunt (full system access) # ⚠️ SIGNATURE REQUIRED - Review carefully before use diff --git a/.machine_readable/svc/k9/template-kennel.k9.ncl b/.machine_readable/svc/k9/template-kennel.k9.ncl index 0714d717..0c0f9364 100644 --- a/.machine_readable/svc/k9/template-kennel.k9.ncl +++ b/.machine_readable/svc/k9/template-kennel.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # K9 Kennel-level template: Pure data configuration # Security Level: Kennel (kennel, no execution) # No signature required - safe for any use diff --git a/.machine_readable/svc/k9/template-yard.k9.ncl b/.machine_readable/svc/k9/template-yard.k9.ncl index d95dbc50..ede10a8f 100644 --- a/.machine_readable/svc/k9/template-yard.k9.ncl +++ b/.machine_readable/svc/k9/template-yard.k9.ncl @@ -1,5 +1,5 @@ K9! -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # K9 Yard-level template: Configuration with validation # Security Level: Yard (Nickel evaluation with contracts) # Signature recommended but not required diff --git a/.reuse/dep5 b/.reuse/dep5 index 768d5492..f929e692 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -3,8 +3,8 @@ Upstream-Name: ECHIDNA Upstream-Contact: Jonathan D.A. Jewell Source: https://github.com/hyperpolymath/echidna -# ECHIDNA is licensed in three parts. See NOTICE for the rationale and for -# why the MPL-2.0 component is compatible with the AGPL umbrella +# ECHIDNA is licensed in four parts. See NOTICE for the rationale and for +# why the MPL-2.0 components are compatible with the AGPL umbrella # (MPL-2.0 section 3.3, Secondary Licenses). # # Per-file SPDX-License-Identifier headers are authoritative. The stanzas @@ -35,7 +35,6 @@ Files: src/* container/* .containerization/* .clusterfuzzlite/* - .machine_readable/* .github/* .well-known/* guix/* @@ -48,12 +47,31 @@ Files: src/* Containerfile contractile.just guix.scm - 0-AI-MANIFEST.a2ml Copyright: 2024-2026 Jonathan D.A. Jewell and ECHIDNA Project Contributors License: AGPL-3.0-or-later # --------------------------------------------------------------------------- -# 2. Documentation — CC-BY-SA-4.0 +# 2. Machine-readable specification surface — MPL-2.0 +# +# Deliberately NOT AGPL: specification and metadata intended for +# interoperability and, in part, standards-body submission, where strong +# copyleft would obstruct adoption. Weak copyleft keeps improvements open +# without burdening implementers. +# --------------------------------------------------------------------------- + +Files: .machine_readable/* + 0-AI-MANIFEST.a2ml + stapeln.toml + container/manifest.toml + docs-site/.well-known/aibdp.json + spark/*/alire.toml + src/abi/echidnaabi.ipkg + src/idris/echidna-validator.ipkg +Copyright: 2024-2026 Jonathan D.A. Jewell and ECHIDNA Project Contributors +License: MPL-2.0 + +# --------------------------------------------------------------------------- +# 3. Documentation — CC-BY-SA-4.0 # --------------------------------------------------------------------------- Files: docs/* @@ -63,7 +81,7 @@ Copyright: 2024-2026 Jonathan D.A. Jewell and ECHIDNA License: CC-BY-SA-4.0 # --------------------------------------------------------------------------- -# 3. Coq-Jr playground — MPL-2.0, NOT relicensed +# 4. Coq-Jr playground — MPL-2.0, NOT relicensed # # Carries contributions from Coq-Jr Contributors rather than the ECHIDNA # project. Sits under the AGPL umbrella via MPL-2.0 section 3.3 while @@ -75,7 +93,7 @@ Copyright: 2024-2026 Coq-Jr Contributors and Jonathan D.A. Jewell . --- diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc index 4f6f0a4f..4016ee07 100644 --- a/CONTRIBUTING.adoc +++ b/CONTRIBUTING.adoc @@ -158,10 +158,14 @@ tree your file sits in — do not copy a header from elsewhere: |=== | Part | SPDX identifier -| Code — `src/`, `crates/`, `ffi/`, `proofs/`, `spark/`, - `verification/`, build system, CI, machine-readable metadata +| Application code — `src/`, `crates/`, `ffi/`, `proofs/`, `spark/`, + `verification/`, `scripts/`, build system, CI | `AGPL-3.0-or-later` +| Machine-readable specification surface — `.machine_readable/`, + `0-AI-MANIFEST.a2ml`, package/container manifests, OCI image labels +| `MPL-2.0` + | Documentation — `docs/`, top-level `.md` / `.adoc` | `CC-BY-SA-4.0` @@ -169,6 +173,12 @@ tree your file sits in — do not copy a header from elsewhere: | `MPL-2.0` |=== +The specification surface is weak-copyleft on purpose. It is metadata and +spec material intended for interoperability, some of it on a path to +standards-body submission, where strong copyleft would obstruct adoption +and re-publication. Improvements to those files stay open; implementing +against them carries no obligation. + New files carry two lines, with the SPDX identifier *first* (the workflow linter checks line 1): diff --git a/Containerfile b/Containerfile index ca2395c6..1b0560d5 100644 --- a/Containerfile +++ b/Containerfile @@ -79,7 +79,7 @@ FROM cgr.dev/chainguard/wolfi-base:latest LABEL maintainer="Jonathan D.A. Jewell " LABEL org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" LABEL org.opencontainers.image.description="ECHIDNA - Extensible Cognitive Hybrid Intelligence for Deductive Neural Assistance" -LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" +LABEL org.opencontainers.image.licenses="MPL-2.0" LABEL org.opencontainers.image.version="1.5.0" LABEL org.opencontainers.image.vendor="hyperpolymath" diff --git a/NOTICE b/NOTICE index f35a3550..648212dd 100644 --- a/NOTICE +++ b/NOTICE @@ -9,26 +9,43 @@ version 3 or later (AGPL-3.0-or-later). Full text: LICENSE (also in LICENSES/AGPL-3.0-or-later.txt) SPDX-License-Identifier: AGPL-3.0-or-later -Three licences apply, to three distinct parts of the tree. This is deliberate, +Four licences apply, to four distinct parts of the tree. This is deliberate, not drift: - 1. CODE AGPL-3.0-or-later - Everything under src/, crates/, ffi/, proofs/, spark/, verification/, - scripts/, hooks/, the build system, the CI workflows, and the - machine-readable metadata. This is the project's own code, and the - AGPL's network clause applies: if you run a modified ECHIDNA as a - network service, you must offer your users the modified source. - - 2. DOCUMENTATION CC-BY-SA-4.0 + 1. APPLICATION CODE AGPL-3.0-or-later + The Rust core, Julia ML layer, Zig FFI, Chapel parallel layer, SPARK/Ada + units, proof corpora, build system and CI. The AGPL's network clause + applies: if you run a modified ECHIDNA as a network service, you must + offer your users the modified source. + + 2. MACHINE-READABLE SPECIFICATION SURFACE MPL-2.0 + Everything under .machine_readable/ (A2ML descriptiles, contractiles, + K9 configurations, anchors, policies), 0-AI-MANIFEST.a2ml, the package + and container manifests, and the OCI image labels emitted by the + stapeln / svalinn build tooling. + + This part is deliberately NOT AGPL. It is specification and metadata + intended for interoperability, some of it on a path to standards-body + submission, where strong copyleft would obstruct adoption and + re-publication. MPL-2.0 keeps it file-level weak copyleft: improvements + to these files stay open, but implementing against them carries no + obligation. + + 3. DOCUMENTATION CC-BY-SA-4.0 Everything under docs/, plus the top-level Markdown and AsciiDoc - documents. Share-alike attribution terms, so the prose can be quoted, - translated and adapted independently of the code. + documents. - 3. echidna-playground/ MPL-2.0 + 4. echidna-playground/ MPL-2.0 The Coq-Jr playground sub-project, which carries contributions from Coq-Jr Contributors rather than the ECHIDNA project. It remains under the Mozilla Public License 2.0 and is NOT relicensed. +Files that previously offered `Palimpsest-0.6` now carry MPL-2.0. The +Palimpsest Licence is MPL-2.0 with additional ethical provisions layered on +top, so MPL-2.0 is the faithful reduction when the Palimpsest layer is not +being asserted. See "THE PALIMPSEST FRAMEWORK IS NOT A LICENCE GRANT HERE" +below. + WHY THE MPL COMPONENT IS COMPATIBLE MPL-2.0 section 3.3 designates the GNU licences - including @@ -39,8 +56,9 @@ MPL. No file in this repository carries the MPL Exhibit B "Incompatible With Secondary Licenses" notice, which would have prevented this. -In short: the whole distributed work is AGPL-3.0-or-later. If you extract -echidna-playground/ on its own, you may use it under MPL-2.0. +In short: the whole distributed work is AGPL-3.0-or-later. If you extract the +MPL-2.0 parts on their own - the machine-readable specification surface, or +echidna-playground/ - you may use those under MPL-2.0. THE PALIMPSEST FRAMEWORK IS NOT A LICENCE GRANT HERE @@ -59,12 +77,15 @@ this repository. They were removed in 2026-08. LICENCE HISTORY - dual MIT / Palimpsest-0.6 -> MPL-2.0 -> AGPL-3.0-or-later (2026) + dual MIT / Palimpsest-0.6 -> MPL-2.0 -> AGPL-3.0-or-later for + application code, MPL-2.0 retained for the specification surface (2026) -The AGPL decision was taken by the project owner in 2026; the per-file SPDX -headers were reconciled to match it in 2026-08. Documents predating that -reconciliation may describe the project as MPL-2.0; LICENSE and this file are -authoritative. +The AGPL decision was taken by the project owner in 2026 and the per-file SPDX +headers were reconciled to match it in 2026-08, at which point the +machine-readable specification surface was deliberately held at MPL-2.0 for +interoperability and standards-submission reasons. Documents predating that +reconciliation may describe the whole project as MPL-2.0; LICENSE and this +file are authoritative. ================================================================================ @@ -103,10 +124,11 @@ This project follows the REUSE Software Licensing specification. .reuse/dep5 bulk copyright declarations per-file headers SPDX-License-Identifier, per the - three-part split described above - LICENSES/AGPL-3.0-or-later.txt code + four-part split described above + LICENSES/AGPL-3.0-or-later.txt application code + LICENSES/MPL-2.0.txt machine-readable specification surface + and echidna-playground/ LICENSES/CC-BY-SA-4.0.txt documentation - LICENSES/MPL-2.0.txt echidna-playground/ Verify locally: `reuse lint` @@ -122,9 +144,10 @@ See RSR_COMPLIANCE.adoc at repo root. CONTRIBUTIONS -Contributions to the code are licensed under AGPL-3.0-or-later; contributions -to the documentation under CC-BY-SA-4.0; contributions to -echidna-playground/ under MPL-2.0. See CONTRIBUTING.adoc. +Contributions are licensed under the licence governing the part of the tree +they land in: AGPL-3.0-or-later for application code, MPL-2.0 for the +machine-readable specification surface and echidna-playground/, and +CC-BY-SA-4.0 for documentation. See CONTRIBUTING.adoc. By contributing, you certify that: 1. You have the right to submit the contribution. diff --git a/README.md b/README.md index 6925e71a..668f45ba 100644 --- a/README.md +++ b/README.md @@ -15,14 +15,15 @@ one reports the achieved tier and changes when it lapses. Tracked as D3 in docs/DEBT.md. --> -> **Licensing.** ECHIDNA is licensed in three parts: **code** under -> AGPL-3.0-or-later, **documentation** under CC-BY-SA-4.0, and -> **`echidna-playground/`** under MPL-2.0 (Coq-Jr contributions, retained -> deliberately — MPL §3.3 makes it compatible under the AGPL umbrella). -> The combined work distributes as AGPL-3.0-or-later; run a modified ECHIDNA -> as a network service and you must offer your users the modified source. -> See [`NOTICE`](NOTICE) for the full statement and the compatibility -> argument. +> **Licensing.** ECHIDNA is licensed in four parts: **application code** under +> AGPL-3.0-or-later; the **machine-readable specification surface** +> (`.machine_readable/`, manifests, OCI labels) under MPL-2.0, deliberately +> weak-copyleft so it stays usable for interoperability and standards work; +> **documentation** under CC-BY-SA-4.0; and **`echidna-playground/`** under +> MPL-2.0. The combined work distributes as AGPL-3.0-or-later — run a +> modified ECHIDNA as a network service and you must offer your users the +> modified source. MPL §3.3 (Secondary Licenses) is what makes the MPL parts +> compatible inside the AGPL work. Full statement: [`NOTICE`](NOTICE). \*E\*xtensible \*C\*ognitive \*H\*ybrid \*I\*ntelligence for \*D\*eductive \*N\*eural \*A\*ssistance diff --git a/container/Containerfile b/container/Containerfile index 68f4d48a..07591e35 100644 --- a/container/Containerfile +++ b/container/Containerfile @@ -39,7 +39,7 @@ LABEL org.opencontainers.image.title="ECHIDNA" \ org.opencontainers.image.url="https://github.com/hyperpolymath/echidna" \ org.opencontainers.image.source="https://github.com/hyperpolymath/echidna" \ org.opencontainers.image.vendor="hyperpolymath" \ - org.opencontainers.image.licenses="AGPL-3.0-or-later" \ + org.opencontainers.image.licenses="MPL-2.0" \ org.opencontainers.image.version="1.5.0" \ org.opencontainers.image.authors="Jonathan D.A. Jewell " \ dev.cerrotorre.manifest="container/manifest.toml" \ diff --git a/container/manifest.toml b/container/manifest.toml index 5ed75e6d..2d09649e 100644 --- a/container/manifest.toml +++ b/container/manifest.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # # Cerro Torre manifest for ECHIDNA .ctp bundle @@ -12,7 +12,7 @@ ECHIDNA — neurosymbolic theorem proving platform with 30 prover backends, packaged as a verified cerro-torre .ctp bundle with Ed25519 signing and full provenance tracking. """ -license = "AGPL-3.0-or-later" +license = "MPL-2.0" homepage = "https://github.com/hyperpolymath/echidna" maintainer = "Jonathan D.A. Jewell " diff --git a/docs-site/.well-known/aibdp.json b/docs-site/.well-known/aibdp.json index b49849dd..152adb87 100644 --- a/docs-site/.well-known/aibdp.json +++ b/docs-site/.well-known/aibdp.json @@ -32,5 +32,5 @@ } }, "contact": "jonathan.jewell@open.ac.uk", - "license": "AGPL-3.0-or-later" + "license": "MPL-2.0" } diff --git a/docs/DEBT.md b/docs/DEBT.md index 267a55bc..8cd58c95 100644 --- a/docs/DEBT.md +++ b/docs/DEBT.md @@ -249,15 +249,31 @@ whether the sink should be created or repointed. ## P2 — Code -### C1. ReScript remains, though the language policy bans it - -31 files (`git ls-files '*.res' '*.resi' | wc -l`). Project policy names -ReScript as banned with AffineScript-TEA as the replacement, and the migration -is blocked on missing AffineScript primitives — `Http::fetch`, `Async`, `Json` -— tracked in issues [#266](https://github.com/hyperpolymath/echidna/issues/266) -and [#117](https://github.com/hyperpolymath/echidna/issues/117). The debt is the -gap between a stated ban and an unmigrated tree, and the honest reading is that -the policy is aspirational until those primitives land. +### C1. ReScript — removed 2026-08 + +The 37 ReScript files (24 in `src/rescript/`, 13 orphaned `.res` prover +clients in `src/provers/`) were deleted, along with the build and CI wiring +that referenced them. ReScript is a banned language under the estate policy. + +**The replacement is not ready, and that is now visible rather than hidden.** +The AffineScript-TEA sources sit at `src/ui/tea/` but the compile pipeline is +unwired, blocked on missing primitives — `Http::fetch`, `Async`, `Json` — +tracked in [#266](https://github.com/hyperpolymath/echidna/issues/266) and +[#117](https://github.com/hyperpolymath/echidna/issues/117). `just build-ui` +now **fails with an explanatory message** instead of silently doing nothing; +`serve-ui` serves the static shell at `src/ui/public/`. + +`echidna-playground/` keeps its 8 `.res` files: that sub-project carries +Coq-Jr contributions, so removing them is a separate decision from a +language-policy cleanup. + +### C1b. `.gitlab-ci.yml` is not valid YAML + +`python3 -c "import yaml; yaml.safe_load(open('.gitlab-ci.yml'))"` fails on a +bare `%` inside an unquoted shell command. **Pre-existing** — verified by +parsing the file at `HEAD` before the ReScript removal shifted the line +number. Whether it matters depends on whether the GitLab mirror actually runs +CI; if it does not, the file is decorative and should say so or go. ### C2. 185 `#[allow(dead_code)]` suppressions diff --git a/docs/wiki/FAQ.md b/docs/wiki/FAQ.md index f85a17db..7b9b076f 100644 --- a/docs/wiki/FAQ.md +++ b/docs/wiki/FAQ.md @@ -47,14 +47,20 @@ Canonical sources of truth: ## What licence is ECHIDNA under? -Three, applying to three parts of the tree. This is deliberate, not drift. +Four, applying to four parts of the tree. This is deliberate, not drift. | Part | Licence | |---|---| -| Code — `src/`, `crates/`, `ffi/`, `proofs/`, `spark/`, `verification/`, build system, CI | **AGPL-3.0-or-later** | +| Application code — `src/`, `crates/`, `ffi/`, `proofs/`, `spark/`, `verification/`, build system, CI | **AGPL-3.0-or-later** | +| Machine-readable specification surface — `.machine_readable/`, `0-AI-MANIFEST.a2ml`, package/container manifests, OCI image labels | **MPL-2.0** | | Documentation — `docs/`, top-level `.md` / `.adoc` | **CC-BY-SA-4.0** | | `echidna-playground/` — the Coq-Jr sub-project | **MPL-2.0** | +The specification surface is weak-copyleft on purpose: it is metadata and spec +material meant for interoperability, some of it on a path to standards-body +submission, where strong copyleft would obstruct adoption. Improvements to +those files stay open; implementing against them carries no obligation. + **The combined work distributes as AGPL-3.0-or-later.** The network clause applies: if you run a modified ECHIDNA as a service, you must offer your users the modified source. @@ -63,13 +69,18 @@ the modified source. designates the GNU licences — including AGPL-3.0+ — as "Secondary Licenses". MPL-covered files may therefore be combined into an AGPL work and distributed under the AGPL, while remaining individually available under MPL. So if you -extract `echidna-playground/` on its own, you may use it under MPL-2.0. The -playground keeps MPL because it carries contributions from Coq-Jr -Contributors, and relicensing someone else's contribution needs their consent. - -Licence history: dual MIT/Palimpsest-0.6 → MPL-2.0 → AGPL-3.0-or-later, with -the per-file headers reconciled to the AGPL ruling in 2026-08. Anything -describing the project as MPL-2.0 predates that; +extract an MPL-2.0 part on its own — the specification surface, or +`echidna-playground/` — you may use it under MPL-2.0. The playground keeps MPL +because it carries contributions from Coq-Jr Contributors, and relicensing +someone else's contribution needs their consent. + +Files that previously offered `Palimpsest-0.6` now carry MPL-2.0: the +Palimpsest Licence is MPL-2.0 with ethical provisions layered on top, so +MPL-2.0 is the faithful reduction when that layer is not being asserted. + +Licence history: dual MIT/Palimpsest-0.6 → MPL-2.0 → AGPL-3.0-or-later for +application code, with the specification surface deliberately held at MPL-2.0 +(2026-08). Anything describing the whole project as MPL-2.0 predates that; [`LICENSE`](https://github.com/hyperpolymath/echidna/blob/main/LICENSE) and [`NOTICE`](https://github.com/hyperpolymath/echidna/blob/main/NOTICE) are authoritative. diff --git a/docs/wiki/Home.md b/docs/wiki/Home.md index b1396b42..36af0e49 100644 --- a/docs/wiki/Home.md +++ b/docs/wiki/Home.md @@ -4,7 +4,7 @@ **ECHIDNA** — Extensible Cognitive Hybrid Intelligence for Deductive Neural Assistance — is a trust-hardened neurosymbolic theorem-proving platform with a large multi-backend prover surface, of which **12 core backends** are exposed by the default API. Counts differ depending on what is being counted; [`docs/PROVER_COUNT.md`](https://github.com/hyperpolymath/echidna/blob/main/docs/PROVER_COUNT.md) is canonical and carries the commands that reproduce each figure. -**License**: three parts, by design — **code** under AGPL-3.0-or-later, **documentation** under CC-BY-SA-4.0, and **`echidna-playground/`** under MPL-2.0 (Coq-Jr contributions, deliberately not relicensed). The combined work distributes as AGPL-3.0-or-later, so running a modified ECHIDNA as a network service obliges you to offer users the modified source. The MPL component is compatible under MPL §3.3 (Secondary Licenses). Full statement: [`NOTICE`](https://github.com/hyperpolymath/echidna/blob/main/NOTICE). +**License**: four parts, by design — **application code** under AGPL-3.0-or-later; the **machine-readable specification surface** (`.machine_readable/`, manifests, OCI image labels) under MPL-2.0, held weak-copyleft so it stays usable for interoperability and standards submission; **documentation** under CC-BY-SA-4.0; and **`echidna-playground/`** under MPL-2.0. The combined work distributes as AGPL-3.0-or-later, so running a modified ECHIDNA as a network service obliges you to offer users the modified source. MPL §3.3 (Secondary Licenses) is what makes the MPL parts compatible inside the AGPL work. Full statement: [`NOTICE`](https://github.com/hyperpolymath/echidna/blob/main/NOTICE). **Release history**: [`CHANGELOG.md`](https://github.com/hyperpolymath/echidna/blob/main/CHANGELOG.md); semver pin in [`Cargo.toml`](https://github.com/hyperpolymath/echidna/blob/main/Cargo.toml). @@ -42,7 +42,7 @@ When the wiki and the repo disagree, **the repo wins**: - **4 arbitration mechanisms** — portfolio majority-vote, Bayesian posterior, Dempster-Shafer belief combination, Pareto multi-objective frontier. - **6 cross-prover exchange formats** — OpenTheory, Dedukti, TPTP, SMT-LIB, SMTCoq, Lambdapi. - **11-step trust pipeline** — integrity → portfolio → certificates → axioms → confidence → mutation → pareto → statistics → emission (see Architecture page). -- **Polyglot stack** — Rust core, Julia ML sidecar, Idris2/Agda formal proofs, Zig FFI, Chapel parallel, AffineScript/Deno UI (migrating from ReScript). +- **Polyglot stack** — Rust core, Julia ML sidecar, Idris2/Agda formal proofs, Zig FFI, Chapel parallel, AffineScript/Deno UI (ReScript removed 2026-08; the TEA compile pipeline is not wired yet — issues #117/#266). - **Guix-only package management** — sealed-container escape hatch for the non-free tail. (Nix fallback was deprecated in the 2026-05-18 estate ruling and fully removed estate-wide on 2026-06-01.) - **Justfile, not Make. Podman, not Docker.** diff --git a/examples/simple_proof.v b/examples/simple_proof.v index c06c4ede..099e74ad 100644 --- a/examples/simple_proof.v +++ b/examples/simple_proof.v @@ -1,4 +1,4 @@ -(* SPDX-License-Identifier: AGPL-3.0-or-later *) +(* SPDX-License-Identifier: MPL-2.0 *) (* Simple Coq proof demonstrating ECHIDNA capabilities *) (** * Simple Arithmetic Proof diff --git a/proofs/acl2/associativity.lisp b/proofs/acl2/associativity.lisp index 76811037..79a77cc5 100644 --- a/proofs/acl2/associativity.lisp +++ b/proofs/acl2/associativity.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: AGPL-3.0-or-later +; SPDX-License-Identifier: MPL-2.0 ;; Associativity of addition ;; Demonstrates ACL2's automated proof with induction diff --git a/proofs/acl2/binary_trees.lisp b/proofs/acl2/binary_trees.lisp index 76a8e1bb..55b649a1 100644 --- a/proofs/acl2/binary_trees.lisp +++ b/proofs/acl2/binary_trees.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: AGPL-3.0-or-later +; SPDX-License-Identifier: MPL-2.0 ;; Binary tree operations ;; Demonstrates data structure reasoning diff --git a/proofs/acl2/factorial.lisp b/proofs/acl2/factorial.lisp index 687838b2..637eaa65 100644 --- a/proofs/acl2/factorial.lisp +++ b/proofs/acl2/factorial.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: AGPL-3.0-or-later +; SPDX-License-Identifier: MPL-2.0 ;; Factorial function with guards ;; Demonstrates ACL2's guard verification and executable specifications diff --git a/proofs/acl2/list_append.lisp b/proofs/acl2/list_append.lisp index 30afcbde..34e89614 100644 --- a/proofs/acl2/list_append.lisp +++ b/proofs/acl2/list_append.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: AGPL-3.0-or-later +; SPDX-License-Identifier: MPL-2.0 ;; List append properties ;; Demonstrates recursive definitions and list reasoning diff --git a/proofs/acl2/sorting.lisp b/proofs/acl2/sorting.lisp index 27d43f32..73284e29 100644 --- a/proofs/acl2/sorting.lisp +++ b/proofs/acl2/sorting.lisp @@ -1,5 +1,5 @@ ; SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -; SPDX-License-Identifier: AGPL-3.0-or-later +; SPDX-License-Identifier: MPL-2.0 ;; Insertion sort correctness ;; Demonstrates algorithm verification diff --git a/proofs/agda/Basic.agda b/proofs/agda/Basic.agda index 535cc8ec..301f84bf 100644 --- a/proofs/agda/Basic.agda +++ b/proofs/agda/Basic.agda @@ -1,5 +1,5 @@ -- SPDX-FileCopyrightText: 2025 ECHIDNA Project Team --- SPDX-License-Identifier: AGPL-3.0-or-later +-- SPDX-License-Identifier: MPL-2.0 -- -- Basic.agda - Simple proofs demonstrating fundamental logical principles -- diff --git a/proofs/hol4/arithmetic.sml b/proofs/hol4/arithmetic.sml index 8dfc88ae..c3f6302f 100644 --- a/proofs/hol4/arithmetic.sml +++ b/proofs/hol4/arithmetic.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: AGPL-3.0-or-later *) +(* SPDX-License-Identifier: MPL-2.0 *) (* Arithmetic properties in HOL4 *) (* Demonstrates decision procedures and automation *) diff --git a/proofs/hol4/binary_tree.sml b/proofs/hol4/binary_tree.sml index a98f071a..0b28f536 100644 --- a/proofs/hol4/binary_tree.sml +++ b/proofs/hol4/binary_tree.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: AGPL-3.0-or-later *) +(* SPDX-License-Identifier: MPL-2.0 *) (* Binary tree operations in HOL4 *) (* Demonstrates datatype definitions and structural induction *) diff --git a/proofs/hol4/list_append.sml b/proofs/hol4/list_append.sml index 63f49bf6..882bb92d 100644 --- a/proofs/hol4/list_append.sml +++ b/proofs/hol4/list_append.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: AGPL-3.0-or-later *) +(* SPDX-License-Identifier: MPL-2.0 *) (* List append properties in HOL4 *) (* Demonstrates inductive proofs over lists *) diff --git a/proofs/hol4/set_theory.sml b/proofs/hol4/set_theory.sml index a2ce6d13..641fe39f 100644 --- a/proofs/hol4/set_theory.sml +++ b/proofs/hol4/set_theory.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: AGPL-3.0-or-later *) +(* SPDX-License-Identifier: MPL-2.0 *) (* Set theory properties in HOL4 *) (* Demonstrates higher-order reasoning *) diff --git a/proofs/hol4/sorting.sml b/proofs/hol4/sorting.sml index 1e8d5021..39b50d15 100644 --- a/proofs/hol4/sorting.sml +++ b/proofs/hol4/sorting.sml @@ -1,5 +1,5 @@ (* SPDX-FileCopyrightText: 2025 ECHIDNA Project Team *) -(* SPDX-License-Identifier: AGPL-3.0-or-later *) +(* SPDX-License-Identifier: MPL-2.0 *) (* Sorting algorithm verification in HOL4 *) (* Demonstrates algorithm correctness proofs *) diff --git a/proofs/pvs/arithmetic.pvs b/proofs/pvs/arithmetic.pvs index 859d0d93..be18bed3 100644 --- a/proofs/pvs/arithmetic.pvs +++ b/proofs/pvs/arithmetic.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: AGPL-3.0-or-later +% SPDX-License-Identifier: MPL-2.0 % Arithmetic properties % Demonstrates PVS's powerful decision procedures diff --git a/proofs/pvs/binary_search.pvs b/proofs/pvs/binary_search.pvs index bd952f6f..9b58bc3e 100644 --- a/proofs/pvs/binary_search.pvs +++ b/proofs/pvs/binary_search.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: AGPL-3.0-or-later +% SPDX-License-Identifier: MPL-2.0 % Binary search on sorted arrays % Demonstrates PVS's specification and verification capabilities diff --git a/proofs/pvs/list_theory.pvs b/proofs/pvs/list_theory.pvs index 91d72641..a1110b65 100644 --- a/proofs/pvs/list_theory.pvs +++ b/proofs/pvs/list_theory.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: AGPL-3.0-or-later +% SPDX-License-Identifier: MPL-2.0 % List theory with append and length % Demonstrates PVS's dependent types and TCCs diff --git a/proofs/pvs/set_theory.pvs b/proofs/pvs/set_theory.pvs index 3d7c2798..0208e885 100644 --- a/proofs/pvs/set_theory.pvs +++ b/proofs/pvs/set_theory.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: AGPL-3.0-or-later +% SPDX-License-Identifier: MPL-2.0 % Set operations and properties % Demonstrates higher-order reasoning in PVS diff --git a/proofs/pvs/sorting.pvs b/proofs/pvs/sorting.pvs index c3a25285..a9b5ac30 100644 --- a/proofs/pvs/sorting.pvs +++ b/proofs/pvs/sorting.pvs @@ -1,5 +1,5 @@ % SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -% SPDX-License-Identifier: AGPL-3.0-or-later +% SPDX-License-Identifier: MPL-2.0 % Insertion sort specification and verification % Demonstrates algorithm correctness in PVS diff --git a/rules/security_learning.lgt b/rules/security_learning.lgt index 6f12c744..86f0250f 100644 --- a/rules/security_learning.lgt +++ b/rules/security_learning.lgt @@ -1,4 +1,4 @@ -%% SPDX-License-Identifier: AGPL-3.0-or-later +%% SPDX-License-Identifier: MPL-2.0 %% ECHIDNA Security Rule Learning Module %% Learns security patterns from cicd-hyper-a audit data diff --git a/scripts/build-production.sh b/scripts/build-production.sh index 6b857e47..c612881a 100755 --- a/scripts/build-production.sh +++ b/scripts/build-production.sh @@ -1,5 +1,5 @@ #!/bin/bash -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Production build script for ECHIDNA set -e diff --git a/scripts/demo-proof.sh b/scripts/demo-proof.sh index 6b7dd930..f7c62077 100755 --- a/scripts/demo-proof.sh +++ b/scripts/demo-proof.sh @@ -1,5 +1,5 @@ #!/bin/bash -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # ECHIDNA Interactive Demo - Proof of Commutativity set -e diff --git a/scripts/expand_training_data.sh b/scripts/expand_training_data.sh index 47acb19d..67bc534d 100755 --- a/scripts/expand_training_data.sh +++ b/scripts/expand_training_data.sh @@ -1,5 +1,5 @@ #!/bin/bash -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Quick training data expansion script for ECHIDNA set -e diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index caa5b245..ec9a91b9 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -1,6 +1,6 @@ #!/bin/bash # SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # Integration test runner for Rust↔Julia communication # Starts Julia test server, runs Rust integration tests, then stops server diff --git a/spark/axiom_tracker/alire.toml b/spark/axiom_tracker/alire.toml index 3c397fd7..0acd78b7 100644 --- a/spark/axiom_tracker/alire.toml +++ b/spark/axiom_tracker/alire.toml @@ -1,7 +1,7 @@ name = "axiom_tracker_spark" description = "SPARK companion for echidna axiom_tracker module" version = "0.1.0" -licenses = "AGPL-3.0-or-later" +licenses = "MPL-2.0" maintainers = ["hyperpolymath@users.noreply.github.com"] maintainers-logins = ["hyperpolymath"] diff --git a/spark/certificates/alire.toml b/spark/certificates/alire.toml index 5c5d42bd..d2013b71 100644 --- a/spark/certificates/alire.toml +++ b/spark/certificates/alire.toml @@ -1,7 +1,7 @@ name = "certificates_spark" description = "SPARK companion for echidna certificates module" version = "0.1.0" -licenses = "AGPL-3.0-or-later" +licenses = "MPL-2.0" maintainers = ["hyperpolymath@users.noreply.github.com"] maintainers-logins = ["hyperpolymath"] diff --git a/spark/solver_integrity/alire.toml b/spark/solver_integrity/alire.toml index 1bdce497..cc0c49ee 100644 --- a/spark/solver_integrity/alire.toml +++ b/spark/solver_integrity/alire.toml @@ -1,7 +1,7 @@ name = "solver_integrity_spark" description = "SPARK companion for echidna solver_integrity module" version = "0.1.0" -licenses = "AGPL-3.0-or-later" +licenses = "MPL-2.0" maintainers = ["hyperpolymath@users.noreply.github.com"] maintainers-logins = ["hyperpolymath"] diff --git a/src/abi/echidnaabi.ipkg b/src/abi/echidnaabi.ipkg index dcd5baf0..2b0ec6da 100644 --- a/src/abi/echidnaabi.ipkg +++ b/src/abi/echidnaabi.ipkg @@ -1,4 +1,4 @@ --- SPDX-License-Identifier: AGPL-3.0-or-later +-- SPDX-License-Identifier: MPL-2.0 -- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) -- -- ECHIDNA ABI package — Idris2 formal ABI definitions with dependent type proofs. @@ -10,7 +10,7 @@ package echidnaabi version = 0.2.0 authors = "Jonathan D.A. Jewell" -license = "AGPL-3.0-or-later" +license = "MPL-2.0" brief = "ECHIDNA ABI definitions with formal proofs for 30 prover backends (zero believe-me)" sourcedir = "." diff --git a/src/idris/echidna-validator.ipkg b/src/idris/echidna-validator.ipkg index 760a0a9f..d40f5a00 100644 --- a/src/idris/echidna-validator.ipkg +++ b/src/idris/echidna-validator.ipkg @@ -1,9 +1,9 @@ --- SPDX-License-Identifier: AGPL-3.0-or-later +-- SPDX-License-Identifier: MPL-2.0 package echidna-validator version = 0.1.0 authors = "Jonathan D.A. Jewell " -license = "AGPL-3.0-or-later" +license = "MPL-2.0" sourcedir = "." diff --git a/src/julia/test_server.jl b/src/julia/test_server.jl index 8f366afa..199dc59e 100644 --- a/src/julia/test_server.jl +++ b/src/julia/test_server.jl @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 """ test_server.jl diff --git a/src/zig/ffi/echidna_ffi.h b/src/zig/ffi/echidna_ffi.h index 9eabc404..34447052 100644 --- a/src/zig/ffi/echidna_ffi.h +++ b/src/zig/ffi/echidna_ffi.h @@ -1,5 +1,5 @@ // SPDX-FileCopyrightText: 2025 ECHIDNA Project Team -// SPDX-License-Identifier: AGPL-3.0-or-later +// SPDX-License-Identifier: MPL-2.0 /** * @file echidna_ffi.h diff --git a/stapeln.toml b/stapeln.toml index 12a69c64..1cffbbfa 100644 --- a/stapeln.toml +++ b/stapeln.toml @@ -1,4 +1,4 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later +# SPDX-License-Identifier: MPL-2.0 # stapeln.toml — Layer-based container build for echidna # # stapeln builds containers as composable layers (German: "to stack"). @@ -9,7 +9,7 @@ name = "echidna" version = "0.1.0" description = "echidna container service" author = "Jonathan D.A. Jewell " -license = "AGPL-3.0-or-later" +license = "MPL-2.0" registry = "ghcr.io/hyperpolymath" [build]